Как обновить страницу до тех пор, пока элемент не станет доступным с помощью python (Selenium)?

#python #selenium-webdriver #selenium-chromedriver

Вопрос:

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

Ошибка: selenium.общие.исключения.Исключение NoSuchElementException: Сообщение: такого элемента нет: Не удается найти элемент: {«метод»:»текст частичной ссылки»,»селектор»:»КУПИТЬ СЕЙЧАС»}

Код:

 while True:
    if driver.find_element_by_partial_link_text('BUY NOW'):
        break
    driver.refresh()

buy = driver.find_element_by_partial_link_text('BUY NOW')

buy.click()
 

Кто-нибудь может помочь?

Ответ №1:

selenium создает исключения, если ему не удалось найти один элемент. таким образом, ваш цикл (хотя и истинный) не может быть успешным циклом, код «if driver.find_element_by_partial_link_text («КУПИТЬ СЕЙЧАС») » может нарушить сценарий.

есть два способа сделать это:

  1. используйте ‘WebDriverWait’ для явного ожидания элемента. (предлагаю использовать WebDriverWait) пример:
     from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 30)
    wait.until(EC.presence_of_element_located(("partial link text","BUY NOW")))
    driver.refresh()
 
  1. вместо этого используйте find_elements.
    пример:
     from selenium.webdriver.common.by import By
    
    while True:
        if len(driver.find_elements(By.PARTIAL_LINK_TEXT, 'BUY NOW')) > 0:
            break
        driver.refresh()
    
    buy = driver.find_element_by_partial_link_text('BUY NOW')
    buy.click()
 

Ответ №2:

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

 from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

while True:
    wait = WebDriverWait(driver, 1)
    wait.until(EC.element_to_be_clickable(driver.find_element_by_partial_link_text('BUY NOW'))
    if driver.find_element_by_partial_link_text('BUY NOW'):
        break
    driver.refresh()