Python + Selenium: перезагрузить страницу после тайм-аута при вызове WebDriverWait - PullRequest
0 голосов
/ 08 февраля 2020

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

  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 ]

0 голосов
/ 09 февраля 2020

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

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()
0 голосов
/ 10 февраля 2020

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

  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:\WebDrivers\chromedriver.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
    
0 голосов
/ 08 февраля 2020

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...