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

检查是否使用Python中的Selenium将一个页面切换到另一个页面,python,selenium,selenium-webdriver,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() 如何检查提交表单后页面是否切换到其他页面?每个页

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

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

如何检查提交表单后页面是否切换到其他页面?

每个页面都有不同的属性,例如,您可以尝试查找页面的
标记。如果这种情况发生变化,则表示您已导航到另一个页面

    while(self.driver.getCurrentUrl() != nextPageUrl)
例如,此页面的标题为

如果单击右侧的某个链接,您将进入另一个页面,其标题将更改为:


如果您将页面视为一个对象,将其标题视为其属性,那么您将考虑页面对象模型,这在与Selenium相关的导航中非常常用。通过检查页面的唯一属性,您可以很容易地判断您所在的页面和访问过的页面。

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

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

我找到的最好的解决办法是综合各种建议。解决方案是根据Bryan Oakley的评论检查是否存在新的
标记,并检查元素,如Yu的回答(我使用
而不是
,因为
没有在动态框架中捕捉页面更改,而在动态框架中,主体是唯一更改的东西)。我发现这样做对所有页面都最有效,并且具有最多的通用性(例如,我不需要知道页面上的任何特定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')))

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

您可以等待页面的url更改:

old_url = driver.current_url
# here you are redirected to another page (e.g. clicked a link or submited a form)
from selenium.webdriver.support.ui import WebDriverWait # you can place it on the top
WebDriverWait(driver, 10).until(lambda driver: old_url != driver.current_url)
您也可以等待新页面加载:

old_url = driver.current_url
# here you are redirected to another page (e.g. clicked a link or submited a form)
from selenium.webdriver.support.ui import WebDriverWait # you can place it on the top
WebDriverWait(driver, 10).until(lambda driver: old_url != driver.current_url 
    and driver.execute_script("return document.readyState == 'complete'"))

我在
html
元素上使用这种技术。当重新加载页面时,它会过时,因此您可以编写一个适用于任何页面的通用函数。作为一个上下文管理工具,它非常有用——获取元素,运行代码,进行切换,然后等待元素过时。这是一个不错的选择