在 Python 中使用 Selenium 检查页面是否切换到另一个页面

Jd *_*cis 5 python selenium selenium-webdriver

以下代码打开一个页面,然后登录:

self.driver.get(target_url)
login = self.driver.find_element_by_name("login")
login.send_keys("user1")
password = self.driver.find_element_by_name("password")
password.send_keys("password123")
login.submit()
Run Code Online (Sandbox Code Playgroud)

提交表单后如何检查页面是否切换到另一个页面?

Lev*_*ker 6

使用具有预期条件的显式等待来判断您的登录元素之一何时过时:

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

self.driver.get(targeturl)
login = self.driver.find_element_by_name("login")
login.send_keys("user1")
password = self.driver.find_element_by_name("password")
password.send_keys("password123")
login.submit()

WebDriverWait(self.driver, timeout).until(EC.staleness_of(login))
Run Code Online (Sandbox Code Playgroud)

  • 我在 `html` 元素上使用这种技术。当页面重新加载时,它会变得陈旧,因此您可以编写一个适用于任何页面的通用函数。它作为上下文管理工作得很好——获取元素,运行代码,进行切换,然后等待元素变旧。 (2认同)

Jd *_*cis 2

我发现的最佳解决方案是建议的组合。解决方案是根据 Bryan Oakley 的评论检查是否存在新<body>标签,并检查元素,例如 Yu 的响应(我使用了<body>代替,<html>因为<html>没有捕获动态框架内的页面更改,其中正文是唯一发生变化的内容) 。我发现这样做对所有页面效果最好,并且具有最多的多功能性(因为我不需要知道页面上的任何特定 ID/详细信息,只是页面已更改)。最终的解决方案是这样的:

self.driver.get(targeturl)
#To check when the first page is loaded, a first wait goes here
WebDriverWait(self.driver,10).until(EC.presence_of_element_located((By.TAG_NAME, 'body'))) 
login = self.driver.find_element_by_name("login")
login.send_keys("user1")
password = self.driver.find_element_by_name("password")
password.send_keys("password123")
login.submit()
#To check when the second page has finished loaded, another wait goes here
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
Run Code Online (Sandbox Code Playgroud)

这适用于任何和所有页面更改/刷新。它检查页面何时完成加载。