Как правильно настроить неявные / явные ожидания и pageLoadTimeout через Selenium? - PullRequest
0 голосов
/ 25 мая 2018

В настоящее время у меня есть следующая настройка, но я не уверен, что мои ожидания (Implicit и pageLoadTimeout) работают. Это правильная реализация? Помещая ее в @Before ("@ setup"), она работает для каждого запуска сценария или определения шага?Будет ли драйвер ждать соответственно, каждый раз, когда я вызываю @Given, @ When..etc?

@Before("@setup")
    public void setUp() {

        driver.manage().deleteAllCookies();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);


    }

Почему необходимо назначить WebElement для следующего ожидания, что получает элемент WebElement?Это правильная реализация?-

 WebDriverWait wait = new WebDriverWait(driver, 30);
 WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

implicitlyWait ()

implicitlyWait() указывает экземпляру WebDriver , т.е. драйвер , для опроса HTML DOM определенное количество времени при попытке найти элемент или элементы, если они не доступны сразу.Конфигурация ожидания по умолчанию установлена ​​на 0 .После установки неявное ожидание устанавливается на срок службы экземпляра объекта WebDriver .

Пробная версия кода просто идеальна, как в:

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

Здесь вы найдете подробное обсуждение в Использование неявного ожидания в наборах селена


pageLoadTimeout ()

pageLoadTimeout()время ожидания завершения загрузки страницы перед выдачей ошибки.

Пробная версия кода просто идеальна, как в:

driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);

Подробное обсуждение можно найти в pageLoadTimeout в Selenium не работает

Примечание : Старайтесь избегать настройки pageLoadTimeout() до тех пор, пока в Спецификации теста не будет явно упомянуто то же самое.


Почему WebDriverWait?

Современные браузеры используют JavaScript , AJAX и React Native гдеэлементы внутри веб-страницы загружаются динамически .Поэтому дождаться выполнения определенного условия, прежде чем переходить к следующей строке кода Явные ожидания , т. Е. WebDriverWait , - это способ продолжить.

Примечание : согласно официальной документации Явные и неявные ожидания Не смешивать неявные и явные ожидания.Это может привести к непредсказуемому времени ожидания.

Пробная версия кода просто идеальна для ожидания видимости элемента, как в:

WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));

Здесь вы можете найти подробное обсуждение Заменить неявное ожидание наявное ожидание (селеновый webdriver & java)


Ваши конкретные вопросы

  • Почему необходимо назначить WebElement для следующего ожидания: WebDriverWait в сочетании с ExpectedConditions не только возвращает WebElement , но в зависимости от ExpectedConditions может возвращать void , Boolean , List тоже.

  • Что получает элемент WebElement? : согласно вашему блоку кодагде вы использовали ExpectedConditions как visibilityOfElementLocated(), WebElement будет возвращен, когда элемент присутствует на DOM Tree веб-страницы и видимым . Видимость означает, что элементы не только отображаются , но также имеют высоту и ширину, которые превышают 0 .

  • Это правильная реализация? : Ваша реализация была почти идеальной, но последняя строка кода, т.е. boolean status = element.isDisplayed(); избыточна, так как visibilityOfElementLocated() возвращает элемент, как только элемент видим (то есть элементы не только отображаются , но также имеют высоту и ширину, превышающие 0 ).

0 голосов
/ 25 мая 2018

Если вы только начали использовать селен, это законный вопрос.Я всегда предлагаю взглянуть на официальный документ .

Неявное ожидание состоит в том, чтобы указать WebDriver опрашивать DOM в течение определенного времени при попытке найти элемент или элементы, если они не доступны сразу.Значение по умолчанию равно 0. После установки неявное ожидание устанавливается на срок службы экземпляра объекта WebDriver.

Пример:

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));

В этом случае, если сетьэлемент с идентификатором myDynamicElement отсутствует в DOM, когда вы пытаетесь найти его, вы говорите, что повторите попытку до 10 секунд.Время опроса зависит от используемого вами веб-драйвера .Вы должны знать, что он попытается найти элемент за 10 секунд.Конечно, если элемент находится до конца этого времени, код будет продолжаться.В противном случае выдается исключение.

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

Пример:

WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

Это ожидает до 10 секунд, прежде чем вызвать TimeoutException или если он найдетэлемент вернет его через 0 - 10 секунд.По умолчанию WebDriverWait вызывает ExpectedCondition каждые 500 миллисекунд, пока не завершится успешно.Успешное возвращаемое значение для типа функции ExpectedCondition является логическим значением true или ненулевым объектом.

И, в конце, там написано: Этот пример также функциональноэквивалентно первому примеру неявного ожидания.

Таким образом, если вы используете senceOfElementLocated в качестве ожидаемого условия (для каждого элемента, который вы пытаетесь найти), то точно так же, чтобы использоватьнеявное ожидание.Но это не только условие.Как видно из ExpectedConditions , вы можете указать другие условия (пример: elementToBeClickable, stalenessOf и т. Д.).

Итак, возвращаясь к вашему вопросу:

С

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

вы говорите подождать, всякий раз, когда вы пытаетесь найти элемент , присутствие (помните, что это похоже наsenceOfElementLocated) до 30секунд.

С помощью

driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);

вы устанавливаете на 30 секунд время загрузки веб-страницы.

С помощью:

 WebDriverWait wait = new WebDriverWait(driver, 30);
 WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();

Вы говорите, что хотите подождать visibilityOfElementLocated веб-элемента с id: "id" до 30 секунд.

Наконец:

Почему необходимо назначить WebElement следующему ожиданию, что получает элемент WebElement?Это правильная реализация?

Что получает элемент WebElement?что еще если не webelement с id: "id"?Конечно, если это видно.В противном случае будет сгенерировано исключение.

0 голосов
/ 25 мая 2018

Вам нужно только дождаться загрузки страницы в вашем случае, и ваша реализация в порядке.@ Before - это один из крючков огурца, и это означает, что ваш метод будет запускаться перед каждым сценарием.Я предлагаю использовать свободное ожидание вместо webdriverwait, и вот почему:

При использовании экземпляра FluentWait:

  1. Вы можете проверить определенные условия (видимость, невидимость ...)
  2. Игнорировать определенные типы ожидания исключений, такие как NoSuchElementExceptions или StaleElementException, при поиске элемента на странице.
  3. Вы можете указать опрос и тайм-ауты для каждого условия.

Например:

 // Waiting 30 seconds for an element to be present on the page, checking for its presence once every 5 seconds. 

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(30, SECONDS) .pollingEvery(5, SECONDS).ignoring(NoSuchElementException.class);

Надеюсь, я помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...