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

Posted

技术标签:

【中文标题】等待页面重定向 Selenium WebDriver (Python)【英文标题】:Wait for page redirect Selenium WebDriver (Python) 【发布时间】:2017-02-21 12:07:00 【问题描述】:

我有一个页面,它使用 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") 

【问题讨论】:

如果您知道预期的 url,您可以在 while 循环中使用 driver.current_url 您可以等待服务员更改 URL。 【参考方案1】:

您可以为要更改的 URL 创建自定义 Expected Condition to wait:

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")

预期条件基本上是一个可调用的 - 您可以在实现内置条件时wrap it into a class 覆盖__call__() 魔术方法。

【讨论】:

我不确定将第二个重定向网址放在哪里。你能给我一个例子,说明如何在提供的条件下将它包装在一个类中吗? @7O07Y7 在这种预期情况下,我们只是在等待当前 url 更改。如果您想更改它以等待特定 url 成为当前的,您可以使用lambda driver: driver.current_url == "specific url"..【参考方案2】:

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

您可以使用模块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"

【讨论】:

【参考方案3】:

有几个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)

    等待带有title_is(title_name)的新页面标题:

    wait.until(EC.title_is('New page Title'))
    

    等待当前 URL 更改为带有 url_changes(exact_url) 的任何其他 URL:

    wait.until(EC.url_changes('https://current_page.com'))
    

    等待使用 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) - 等待包含指定子字符串的新标题

【讨论】:

以上是关于等待页面重定向 Selenium WebDriver (Python)的主要内容,如果未能解决你的问题,请参考以下文章

利用 selenium 的 webdrive 驱动 headless chrome

如何使用 Python 从 Selenium 的重定向链中获取中间 URL?

检测在 selenium java 中下载的文件

根据位置重定向页面

如果我必须直接单击横幅并在另一个选项卡上打开它,如何使用 selenium 获得重定向链?

selenium webdrive浏览器的基本操作