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

29

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

2
如果您知道预期的URL,可以在while循环中使用driver.current_url - double_j
1
你可以使用一个等待器来等待URL的变化。 - Florent B.
3个回答

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__()魔法方法来实现内置条件。


我不确定第二个重定向URL应该放在哪里。您能否给我一个示例,说明如何根据提供的条件将其包装在类中? - 7O07Y7
2
在这种预期的情况下,我们只是等待当前的URL更改。如果您想将其更改为等待特定的URL成为当前URL,则可以使用lambda driver:driver.current_url ==“specific url” - alecxe

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'))
  • 等待当前URL被更改为任何其他URL,使用url_changes(exact_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)来等待包含指定子字符串的新标题。


    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"
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接