Python Selenium Webdriver – попробуйте, кроме цикла

Я пытаюсь автоматизировать процессы на веб-странице, которая загружается кадр за кадром. Я пытаюсь настроить цикл try-except, который выполняется только после подтверждения присутствия элемента. Это код, который я установил:

from selenium.common.exceptions import NoSuchElementException

while True:
    try:
        link = driver.find_element_by_xpath(linkAddress)
    except NoSuchElementException:
        time.sleep(2)

Приведенный выше код не работает, в то время как следующий наивный подход работает:

time.sleep(2)
link = driver.find_element_by_xpath(linkAddress)

Чего-то не хватает в приведенном выше цикле try-except? Я пробовал различные комбинации, включая использование time.sleep() до try, а не после except.

Спасибо


person user3294195    schedule 30.03.2014    source источник
comment
Ваш текущий код спит только в том случае, если элемент не найден.   -  person    schedule 30.03.2014
comment
Да, идея в том, что он ждет 2 секунды, прежде чем повторить попытку, если что-то не так в реализации?   -  person user3294195    schedule 30.03.2014
comment
Я думаю, что меня смутила формулировка выполнения после подтверждения присутствия элемента. Мой предыдущий комментарий был ошибкой.   -  person    schedule 30.03.2014
comment
Вы уверены, что исключение, которое вы ожидаете, происходит в блоке try?   -  person anon582847382    schedule 30.03.2014
comment
Да. Однако я также пробовал except без явной ссылки на исключение. Все равно не работает...   -  person user3294195    schedule 30.03.2014


Ответы (2)


Ответ на ваш конкретный вопрос:

from selenium.common.exceptions import NoSuchElementException

link = None
while not link:
    try:
        link = driver.find_element_by_xpath(linkAddress)
    except NoSuchElementException:
        time.sleep(2)

Однако есть лучший способ дождаться появления элемента на странице: waits

person neoascetic    schedule 30.03.2014
comment
Это работает отлично... Большое спасибо! Похоже, ошибка была связана с логикой итерации. - person user3294195; 30.03.2014

Другой способ может быть.

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

try:
    element = WebDriverWait(driver, 2).until(
            EC.presence_of_element_located((By.XPATH, linkAddress))
    )
except TimeoutException as ex:
            print ex.message

Внутри вызова WebDriverWait поместите переменную драйвера и секунды ожидания.

person Charls    schedule 19.01.2016
comment
Это не работает для меня. Сообщение об ошибке: NameError: global name 'TimeoutException' is not defined. Я думаю, что для того, чтобы этот пример работал, вам нужно как минимум import selenium, а затем заменить строку 5 на except selenium.common.exceptions.TimeoutException as ex:. - person altabq; 02.02.2016
comment
да, вам нужно. из selenium.common.exceptions импортировать TimeoutException - person Charls; 03.02.2016