python selenium WebDriverWait не работает, когда EC возвращает элемент - PullRequest
0 голосов
/ 18 октября 2018

Я много использовал селен, но у меня не было повода использовать WebDriverWait.Теперь мне нужно нажать кнопку «Назад», которая, хотя кажется, что она доступна сразу, иногда не должна появляться в течение доли секунды.Я могу поместить его в цикл с помощью time.sleep (1), и он будет один раз зациклен.Я могу жить с этим, но я подумал, что это прекрасная возможность для реализации WebDriverWait.Это работает:

browser.find_element_by_xpath('//div[@onclick="backToResults();"]')

за исключением случайного исключения NoSuchElementException ...

Это не будет работать, оно просто запускает 3 секунды и время ожидания (независимо от количества времени, которое я пытаюсьникогда не возвращается успешно):

elem = WebDriverWait(browser, 3).until(ec.presence_of_element_located((By.XPATH, '//div[@onclick="backToResults();')))

... но тот же самый вызов ec без ожидания возвращает элемент, поэтому ожидание должно работать:

ec.presence_of_element_located((By.XPATH, '//div[@onclick="backToResults();'))

Итак,это не значит, что элемент не существует и доступен, по крайней мере, в течение секунды или около того, но WebDriverWait не возвращается из положительного вызова EC?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

time.sleep () / NoSuchElementException

К приостановить выполнение веб-драйвера на миллисекунды, которые вы можете передать number of seconds или floating point number of seconds следующим образом:

import time
time.sleep(1) #sleep for 1 sec
time.sleep(0.25) #sleep for 250 milliseconds

Однако при использовании Selenium и WebDriver для Автоматизация с использованием time.sleep(secs) без каких-либо особых условий для достижения побеждает цель Automation и его следует избегать любой ценой.Согласно документации:

time.sleep(secs) приостанавливает выполнение текущего потока на указанное количество секунд.Аргумент может быть числом с плавающей запятой, чтобы указать более точное время сна.Фактическое время приостановки может быть меньше запрошенного, потому что любой перехваченный сигнал прервет режим сна () после выполнения процедуры перехвата этого сигнала.Кроме того, время приостановки может быть больше, чем запрошено на произвольную величину, из-за планирования других действий в системе.

Так что иногда даже после использования time.sleep(secs) вы можете увидеть NoSuchElementException

Теперь, так как ваша цель - вызвать click() для элемента, поэтому вместо использования ожидаемых условий в качестве presence_of_element_located() вам нужно использовать element_to_be_clickable(locator) следующим образом:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[starts-with(@onclick,'backToResults')]"))).click()

Подробное обсуждение можно найти в Как перевести webdriver в python на миллисекунды

0 голосов
/ 18 октября 2018

Не уверен, что это хорошая практика - назначать EC переменным ...

Попробуйте удалить бит elem = и посмотрите, поможет ли это.

Кроме того, кажется, что строка- ec.presence_of_element_located((By.XPATH, '//div[@onclick="backToResults();')) - работает, поэтому мне интересно, в чем здесь проблема ...?:)

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