#python #selenium #web-scraping #webdriverwait #expected-condition
Вопрос:
У меня небольшая проблема с программой, которую я создал несколько дней назад, поэтому я объясню это очень просто:
Я удаляю данные со страницы с помощью своей программы, и для этого я устанавливаю это явное ожидание:
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH,'/this_is_the_XPATH')))
В большинстве случаев это работает довольно хорошо, однако иногда бывает, что явное ожидание выше вызывает эту ошибку:
Исключение времени
Что заставляет мою программу останавливаться и снова повторять длительный процесс.
Я понял, что параметр ожидания, установленный в 10
секундах, не всегда хорош, поэтому я хотел узнать у вас, ребята, есть ли способ установить этот параметр в качестве переменной, которая всегда получает точное время загрузки (в секундах) для страницы, которая загружена полностью.
Другой более простой идеей может быть принудительное повторение процесса до тех пор, пока видимость элемента не будет окончательно загружена, например, с помощью блоков try и exception, но я не знаю, что мне следует вводить в блок исключений, чтобы повторять попытку снова и снова, пока это не будет сделано.
Как всегда, обратная связь приветствуется, спасибо за чтение заранее.
Ответ №1:
Вы используете функцию Ожидаемых условий из Selenium. Это начальное ожидание в 10 секунд-это просто установка максимального времени, которое разрешено ждать, если функция Ожидаемых условий ничего не даст.
Возможно, вам захочется увеличить максимальное ожидание на 10 секунд, если оно будет продолжать терпеть неудачу.
Ожидание закончится рано (т. е. Не 10 секунд) , если выполнено условие Ожидаемых условий.
Таким образом, важной частью является обеспечение того, чтобы функция EC работала должным образом. Мне нравится использовать element_to_be_clickable в отличие от вашего visibility_of_element_located, возможно, попробуйте это (или другие, полный список условий здесь)
Попробуй это:
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 20) #set a max wait time
element = wait.until(EC.element_to_be_clickable((By.XPATH, 'some xpath'))) #set the dynamic wait, which should end the wait early (ie not 20 seconds)
Ответ №2:
Всегда пишите повторно используемые функции для повторяющихся действий и пишите exception-handling
для этих функций.
Ваш код:
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH,'elementTxt')))
Создайте функцию многократного использования:
def clickElement(elementTxt, driver, time)
try :
element = WebDriverWait(driver, time).until(EC.visibility_of_element_located((By.XPATH,'/this_is_the_XPATH')))
element.click()
except ElementClickInterceptedException as e:
driver.execute_script ("arguments[0].click();",element)
except TimeoutException as te
element = WebDriverWait(driver, time).until(EC.element_to_be_clickable((By.XPATH,'/this_is_the_XPATH')))
element.click()
Вызов функции: Теперь вы можете вызывать эту clickElement
функцию везде, где вам нужно выполнить click
действие. Вам нужно передать значение XPath, экземпляр драйвера и время в секундах.
clickElement(xPathText, driver, 30)
Другой более простой идеей может быть принудительное повторение процесса до тех пор, пока
видимость элемента не будет окончательно загружена
Если мы знаем, что элемент не будет виден, то нам не следует ждать, пока он появится. Это приводит к тому, что код остается в бесконечном цикле, но вы можете выполнить поиск элемента еще раз. Если вы видите пример выше, в TimeoutException
блоке мы снова ищем тот же элемент, если элемент все еще недоступен, нам нужно подумать о других способах.