等待页面重定向 Selenium WebDriver (Python)

问题描述 投票:0回答:4

我有一个页面,它使用ajax加载动态内容,然后在一段时间(不固定)后重定向。如何强制 Selenium Webdriver 等待页面重定向,然后立即转到不同的链接?

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome();
driver.get("http://www.website.com/wait.php") 
python selenium selenium-webdriver webdriver
4个回答
32
投票

您可以创建自定义预期条件等待 URL 更改:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

wait = WebDriverWait(driver, 10)
wait.until(lambda driver: driver.current_url != "http://www.website.com/wait.php")

预期条件基本上是一个可调用 - 您可以将其包装到一个类中在实现内置条件时覆盖

__call__()
魔术方法。


24
投票

有几个 ExpectedConditions 可以与 ExplicitWait 一起使用来处理页面重定向:

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

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
  1. 等待新页面标题

    title_is(title_name)
    :

    wait.until(EC.title_is('New page Title'))
    
  2. 等待当前 URL 更改为任何其他 URL,并使用

    url_changes(exact_url)
    :

    wait.until(EC.url_changes('https://current_page.com'))
    
  3. 等待使用

    url_to_be(exact_url)
    导航到确切的 URL:

    wait.until(EC.url_to_be('https://new_page.com'))
    

还有

url_contains(partial_url)
可用于等待包含指定子字符串的 URL 或
url_matches(pattern)
- 等待与传递的正则表达式模式匹配的 URL 或
title_contains(substring)
- 等待包含指定子字符串的新标题


5
投票

“等待”独特(新页面)元素的出现是一个很好的做法。

您可以使用模块expected_conditions

例如,您可以在登录时等待用户徽标:

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

driver = webdriver.Firefox()
driver.get('http://yourapp.url')

timeout = 5

    try:
        logo_present = EC.presence_of_element_located((By.ID, 'logo_id'))
        WebDriverWait(driver, timeout).until(logo_present)
    except TimeoutException:
        print "Timed out waiting for page to load"

0
投票

就我而言,我只需添加

driver.implicitly_wait()
通话:

driver = webdriver.Firefox(service=Service(GeckoDriverManager().install()))
driver.implicitly_wait(4)

https://www.selenium.dev/documentation/webdriver/waits/#implicit-waits

所述
© www.soinside.com 2019 - 2024. All rights reserved.