Как дождаться состояния готовности вновь открытого окна с помощью selenium-webdriver

Я новичок в селене. Мое приложение - очень старое приложение, разработанное в 2004-2006 годах, и каждое другое действие открывает новое окно. Я использую веб-драйвер Selenium для Internet Explorer для написания автоматических тестовых примеров.

Я переключаюсь между открытыми окнами с помощью driver.switchTo().window(windowname);

однако мои тестовые примеры терпят неудачу, когда мои тесты выполняются в других средах, где время отклика моего приложения время от времени отличается. из-за чего иногда мои тестовые примеры проходят, а в других случаях терпят неудачу. В настоящее время я использую Thread.sleep(THRESHOLD) и знаю, что это плохая практика. Мне известно о WebDriverWait и трех ожиданиях неявных, явных, беглых. Но моя проблема в том, что никто из них не ждет бесконечно долго, пока я не получу ответ. Каждое ожидание требует порогового значения, до которого он будет проверять, готова ли страница, и если ответ не находится в пределах порогового значения, он завершится ошибкой. Есть ли способ, где я могу динамически ждать ответа, где иногда ответ будет немедленным, а иногда и отложенным. Во всех случаях я не должен вводить какое-либо пороговое значение, а тестовые примеры должны ждать ответа независимо от времени ответа.


person Chetan    schedule 16.08.2018    source источник
comment
WebDriverWait принимает в качестве параметра long. Почему бы вам не использовать Long.MAX_VALUE - который для всех практических целей бесконечен.   -  person Dakshinamurthy Karra    schedule 16.08.2018


Ответы (3)


В соответствии с вашим вопросом как подождать, пока я не получу состояние готовности открытого окна, стоит упомянуть, что AUT (Тестируемое приложение) должен иметь тест на в идеале, сколько времени нужно, чтобы открыть новое окно / вкладку.

Теперь, как указано в @KDM, конструкторы WebDriverWait:

  • WebDriverWait(WebDriver driver, java.time.Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut)
  • WebDriverWait(WebDriver driver, long timeOutInSeconds)
  • WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)

Во всех трех конструкторах timeOutInSeconds относится к типу long, который имеет значение MAX, равное 9223372036854775807, которое вы тоже можете использовать.


Long.MAX_VALUE

В следующем примере экземпляр WebDriver, то есть драйвер, успешно преобразован со значением MAX_VALUE типа long:

  • Блок кода:

    System.out.println("Long.MAX = " + Long.MAX_VALUE);
    System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    WebDriverWait wait_me = new WebDriverWait(driver, 9223372036854775807L);
    System.out.println("Application Opened");
    
  • Консольный вывод:

    Long.MAX = 9223372036854775807
    Application Opened
    

numberOfWindowsToBe ()

Наконец, когда вы используете специально разработанное явное ожидание для доступа к вновь открытому окну / вкладке, всегда используйте numberOfWindowsToBe () из ExpectedConditions, а затем соберите windowHandles следующим образом:

  • Пример блока кода (Java):

    driver.get("http://www.google.com");
    System.out.println("Page Title is : "+driver.getTitle());
    String parent_window = driver.getWindowHandle();
    ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');");
    new WebDriverWait(driver,5).until(ExpectedConditions.numberOfWindowsToBe(2));
    Set<String> allWindows_1 = driver.getWindowHandles();
    //Now you can initiate switching through windowHandles
    
person DebanjanB    schedule 16.08.2018

вы можете использовать нижеприведенный фрагмент кода:

 public boolean softWaitForPageToLoad() {
    try {
        new WebDriverWait(getDriver(), 60).until(
                webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").toString().matches("interactive|complete"));
        return true;
    } catch (Exception e) {
        return false;
    }
}

Здесь функция getDriver () возвращает существующий экземпляр драйвера. Пожалуйста, замените его своей реализацией.

person Abhishek_Mishra    schedule 16.08.2018

Этот код ждет, пока не станет виден конкретный идентификатор. И инициализируется за 30 секунд до того, как сгенерирует исключение:

WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ifmail")));
person Kamal Chopra    schedule 16.08.2018