Драйвер Selenium IE не может найти недавно открытое окно

Я использую IEdriver (32-разрядная версия), IE (установлена ​​версия 11) и Selenium 3.3.1, и ниже приведен код, который я использовал для переключения в новое окно.

        String parentWin = driver.getWindowHandle();

        click(By.cssSelector("#linkID_OpenNewWin"));

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        Set<String> winList = driver.getWindowHandles();

        for (String winHandle : winList)
        {   
            if (!winHandle.equals(parentWin))
            {
                driver.switchTo().window(winHandle); // switch focus of WebDriver to the next found window handle 
            }
        }

Когда я пытаюсь выполнить приведенный выше код с помощью драйвера IE, он не может найти вновь открытое окно, но с драйвером Chrome он выполняется, как и ожидалось, и все окна обрабатываются.


person Devang    schedule 12.04.2017    source источник


Ответы (2)


Я вижу несколько проблем с этим кодом.

Во-первых, вам, вероятно, следует установить неявное ожидание, прежде чем щелкнуть ссылку, иначе, по крайней мере теоретически, оно могло бы продолжаться до полного открытия нового окна. Во-вторых, хотя вполне вероятно, что в тестовом примере всего два окна, родительское плюс новое, цикл должен работать нормально, но если по какой-то причине были дополнительные окна (вкладки), разрыва нет; оператор, поэтому ваш цикл будет продолжаться. Скорее всего, это позиция вашего неявного ожидания, но хорошей практикой программирования является выход из циклов, когда вы найдете совпадение.

person Bill Hileman    schedule 12.04.2017
comment
Спасибо, на самом деле я добавил только пример кода из теста, я бы использовал оператор return в своем реальном коде. И есть только два окна. Когда я использую драйвер, отличный от IE, я вижу два окна, найденные в наборе. В то время как с драйвером IE я могу найти только одно родительское окно в наборе. - person Devang; 12.04.2017
comment
Поэтому я предполагаю, что проблема здесь в некоторых настройках совместимости IE, а не в коде. - person Devang; 12.04.2017
comment
Вы можете попробовать это после переключения: driver.switchTo().defaultContent(); (используйте его в обе стороны - туда и обратно) - person Bill Hileman; 12.04.2017

Во-первых, не используйте неявные ожидания... предпочитайте явные ожидания, например. WebDriverWait. Это поможет вам контролировать поток вашего сценария более детерминированным образом.

Я предполагаю, что ваш скрипт движется до того, как окно действительно появится для IE. Я бы посоветовал вам подсчитать количество дескрипторов окна, затем щелкнуть ссылку, которая порождает новое окно, а затем подождать, пока количество дескрипторов окна увеличится на 1. Теперь вы знаете, что окно открыто, и вы можете перейти к возьмите новую ручку окна и переключитесь на нее.

int expectedNumberOfWindows = driver.getWindowHandles().size() + 1; // or you can hardcode 2 if it should always be 2
String parentWin = driver.getWindowHandle();
click(By.cssSelector("#linkID_OpenNewWin"));
new WebDriverWait(driver, 3).until(ExpectedConditions.numberOfWindowsToBe(expectedNumberOfWindows));
switchToNewWindow(parentWin);
// do stuff in new window

Обычно я помещаю код, который планирую повторно использовать, в функции. Вот тот, который переключается на новое окно, то есть на то, которое не является родительским окном.

public void switchToNewWindow(String currentWindow)
{
    for (String winHandle : driver.getWindowHandles())
    {
        if (!winHandle.equals(currentWindow))
        {
            driver.switchTo().window(winHandle);
        }
    }
}

ПРИМЕЧАНИЕ. Это действительно работает детерминистически только в том случае, когда у вас есть одно существующее окно, и вы создаете одно новое окно. В других случаях он просто переключится на первое окно, которое не является родительским окном, которое может быть или не быть тем окном, которое вам нужно.

person JeffC    schedule 12.04.2017