Как игнорировать один элемент с помощью селена (python)? - PullRequest
3 голосов
/ 27 мая 2020

Я пытаюсь создать маленького помощника для своей работы, который имитирует поведение человека на веб-сайте с помощью селена.

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

Есть ли способ пропустить ожидание загрузки полной страницы? Остальная часть страницы загружается примерно за 2-5 секунд, но этот чертов элемент ...

Вот мой код без применения каких-либо ' waits '

driver.get('https://power.dat.com/') post_trucks_button =
driver.find_element_by_xpath('/html/body/nav[2]/div[1]/div[2]/a[1]')
post_trucks_button.click()

И вот кое-что, что я пробовал, но ни один из них, похоже, не работал:

###
wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="main"]/div/section[1]/div')))
###
try:
   element = WebDriverWait(driver, 10).until(
   EC.presence_of_element_located((By.XPATH, '//*[@id="main"]/div/section[1]/div')))
finally:
   post_trucks_button = driver.find_element_by_xpath('/html/body/nav[2]/div[1]/div[2]/a[1]')
   post_trucks_button.click()
###
wait = WebDriverWait(driver, 10)
men_menu = wait.until(ec.visibility_of_element_located((By.XPATH, '//[@id="main"]/div/section[1]/div')))
ActionChains(driver).move_to_element(men_menu).perform()
post_trucks_button = driver.find_element_by_xpath('/html/body/nav[2]/div[1]/div[2]/a[1]')
###
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[NoSuchElementException])element = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="main"]/div/section[1]/div')))
post_trucks_button = driver.find_element_by_xpath('/html/body/nav[2]/div[1]/div[2]/a[1]')
post_trucks_button.click()
###
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])element = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="main"]/div/section[1]/div')))
post_trucks_button = driver.find_element_by_xpath('/html/body/nav[2]/div[1]/div[2]/a[1]')
post_trucks_button.click()
###

PS все необходимые модули импортированы, просто не включили их выше

PSS Я вроде не знаю, что я делаю, только начал учиться python

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Дополнительная информация относительно:

  • Соответствующего HTML кнопки , на которую вы хотите нажать.
  • Произошла ошибка при нажатии кнопка .
  • Другой элемент, загрузка которого занимает около 90 секунд, и соответствующий HTML из WebElement
  • Как вы заключили указанный элемент требует времени.

помогло бы нам построить более канонический ответ. В идеале ваш Тестовый код / Кодовый блок должен соответствовать вашей Тестовой цели / Шагам теста , не затрагивая другие аспекты веб-сайта и другие элементы.


Решение

В соответствии с передовой практикой при вызове click() на любом WebElement вам необходимо вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих Стратегий локатора :

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "element_css"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "element_xpath"))).click()
    
  • Примечание : вам необходимо добавить следующие импорты:

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

Вы можете найти соответствующее подробное обсуждение в Как щелкнуть элемент через Selenium Python


Этот пример использования

Однако существует положение, позволяющее остановить загрузку веб-страницы после того, как ваш желаемый элемент станет интерактивным, вызвав window.stop() следующим образом:

post_trucks_button = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "element_identifies")))
driver.execute_script("window.stop();")
1 голос
/ 27 мая 2020

Вы сказали, что элемент часто загружается примерно за 90 секунд, почему вы просто добавили 10 секунд к таймауту в Wait? ИМХО, было бы 90 секунд.

Это ждет до 10 секунд, прежде чем выбросить исключение TimeoutException, если только не найдет элемент, который нужно вернуть в течение 10 секунд

Подробнее: https://selenium-python.readthedocs.io/waits.html#explicit -waits

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