Python + Selenium: перезагрузить страницу после тайм-аута при вызове WebDriverWait

Я ищу правильный способ реализации ниже в Python Selenium

  1. Загрузить страницу
  2. Подождите некоторое время (например, 30 секунд), чтобы кнопка стала активной (вызывая WebDriverWait).
  3. Если получено TimeoutException, перезагрузите страницу снова, т.е. перейдите к шагу 1)
url = 'https://...'
driver = webdriver.Chrome('./chromedriver')

try:
    driver.get(url)
    wait = WebDriverWait(driver, 30)
    element = wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'button')))
except TimeoutException as e: 
    <reload the url again>

Всего 3 ответа


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

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

driver = webdriver.Chrome(executable_path =os.path.abspath(os.getcwd()) + "/chromedriver")
driver.get("https://selenium-python.readthedocs.io/waits.html")


def refresh():
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "button"))
        )
    except:
        driver.refresh()
        refresh()


refresh()

Вы можете получить список элементов с explicit wait при наличии элементов в Dom с button качестве class name . Если список элементов пуст, вы можете обновить страницу.

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

url = 'https://...'
driver = webdriver.Chrome('./chromedriver')
driver.get(url)
wait = WebDriverWait(driver, 30)

if  len(wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME,'button'))))==0 :
  driver.refresh()

Для выполнения следующих задач:

  1. Загрузить страницу
  2. Подождите некоторое время (например, 30 секунд), чтобы кнопка стала активной (вызывая WebDriverWait).
  3. Если получено TimeoutException, перезагрузите страницу снова, т.е. перейдите к шагу 1)

Вы можете использовать следующую стратегию локатора . Для демонстрации я рассмотрю элемент, которого нет на главной странице поиска Google :

  • Блок кода:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:WebDriverschromedriver.exe')
    while True:
        try:
            driver.get("https://www.google.com/")
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "kokei")))
            print("Button found")
            break
        except TimeoutException:
            print("Button not found ... reloading page")
            continue
    # perform your remaining steps here on successfully finding the clickable element
    driver.quit()
    
  • Консольный вывод:

    Button not found ... reloading page
    Button not found ... reloading page
    Button not found ... reloading page
    

Есть идеи?

10000