Явное ожидание в Python Selenium с объектной моделью страницы

Мое явное ожидание - это не ожидание появления элемента. Он буквально ждет указанное мной количество секунд, а затем тесты по-прежнему терпят неудачу. Если я помещаю неявное ожидание в то же самое место, где проходит тест. Из того, что я читаю, лучше всего избегать неявных ожиданий, насколько это возможно. Я делаю что-то неправильно?

Я сделал такой метод на base_page:

def _wait_for_is_displayed(self, locator, timeout):
        try:
            wait = WebDriverWait(self.driver, timeout)
            wait.until(expected_conditions.visibility_of_element_located((locator["by"], locator["value"])))
        except TimeoutException:
            return False
        return True

затем я вызываю метод _wait_for_is_displayed в объекте страницы следующим образом, но терпит неудачу:

 def relatie_page_present(self):
     self._wait_for_is_displayed(self._open_actieve_polissen_tab, 10)

 def relatie_page_(self):
     self._click(self._open_relatie_details)
     self.relatie_page_present()

Я получаю следующую ошибку:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"td.first > a"}

Это проходит:

 def relatie_page_present(self):
        self.driver.implicitly_wait(10)

def relatie_page_(self):
    self._click(self._open_relatie_details)
    self.relatie_page_present()

Наконец, в своем наборе тестов я вызываю методы relatie_page_present и relatie_page_.


person adbSOeh    schedule 08.02.2018    source источник
comment
Какую ошибку вы получаете, когда он ждет 10 секунд и терпит неудачу? Пожалуйста, опубликуйте код, который вы использовали с неявным ожиданием, который работал, чтобы мы могли сравнить.   -  person JeffC    schedule 08.02.2018
comment
self.driver.implicitly_wait (10) в методе relatie_page_present (self).   -  person adbSOeh    schedule 08.02.2018
comment
Вы не ответили на мой первый вопрос. Кроме того, отредактируйте вопрос и опубликуйте детали для ответа и кода.   -  person JeffC    schedule 08.02.2018
comment
извиняюсь. я только что отредактировал свой вопрос. с сообщением об ошибке и ожиданием, которое пройдет проверку.   -  person adbSOeh    schedule 09.02.2018


Ответы (3)


Чтобы прояснить, как работает неявное ожидание, оно устанавливается один раз в драйвере, а затем применяется в течение всего срока жизни экземпляра драйвера. Таким образом, вызов self.driver.implicitly_wait(10) на самом деле не ждет в этот момент ... он просто заставляет драйвер ждать с этого момента, когда будет обнаружен элемент. Я думаю, что это многих смущает, потому что я довольно часто это вижу.

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

def _wait_and_click(self, locator, timeout):
    try:
        wait = WebDriverWait(self.driver, timeout)
        wait.until(expected_conditions.element_to_be_clickable((locator["by"], locator["value"]))).click()
    except TimeoutException:
        return False
    return True
person JeffC    schedule 09.02.2018
comment
Я пытался использовать данное ожидание, но получаю сообщение об ошибке: TypeError: строковые индексы должны быть целыми числами - person Helping Hands; 12.12.2019

Двигаясь вперед, вы пытаетесь вызвать click(), поэтому вместо использования expected_conditions в качестве visibility_of_element_located() вы должны были использовать element_to_be_clickable() следующим образом:

try:
    wait = WebDriverWait(self.driver, timeout)
    wait.until(expected_conditions.element_to_be_clickable((locator["by"], locator["value"])))
  • Элемент доступен для кликов - WebElement имеет значение Отображается и Включено.

Избегайте смешивания неявного ожидания и явного ожидания как документация четко упоминает:

ВНИМАНИЕ! Не смешивайте неявное и явное ожидание. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания в 10 секунд и явного ожидания в 15 секунд может вызвать тайм-аут через 20 секунд.

person DebanjanB    schedule 08.02.2018

Неявное ожидание - это установка тайм-аута для API поиска элемента, например find_element_by_xxx и find_elements_by_xxx. Его значение по умолчанию - 10 секунд.

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

Если вы чувствуете, что большая часть страницы / ответа вашего веб-сайта медленная, вы можете изменить его, увеличив значение тайм-аута до следующего неявного ожидания.

Но это не то же самое, что сказать the implicit wait time out value is more large more better.

Предположим, пользовательский интерфейс вашего веб-сайта имеет огромные изменения или многие страницы не открываются / не загружаются. Если значение тайм-аута неявного ожидания велико, это увеличит время всего выполнения. Потому что каждый раз, когда элемент find должен ждать это большое количество секунд, затем генерирует исключение тайм-аута.

Явное ожидание влияет только на код, который его использует, это глобальное влияние.

Я вижу, что вы установили тайм-аут явного ожидания равным 10 секундам, он не превышает значения по умолчанию Неявное ожидание.

Как правило, Явное ожидание должно быть длиннее, чем Неявное ожидание, в противном случае его не нужно использовать, так как с помощью API поиска элемента можно заархивировать тот же эффект.

person yong    schedule 08.02.2018