Selenium页面跳转后的元素定位-switch_to.window()使用

Selenium页面跳转后的元素定位-switch_to.window()

背景:

在使用Selenium获取网页数据时常常会因为页面跳转导致,后续的页面数据无法正常获取。究极原因,都是因为此时的页面对象还是上一个页面,使用当前页面的定位条件当然会报错(因为上一个页面根本不存在这些定位条件)。因此我们可以通过switch_to.window()进行页面的切换。

使用方法

switch_to.window()存在以下几种用法,下面是详细示例讲解:
URL:http://www.gjgwy.net/zkzx/gjgwy/345695.html(公考资料网)

driver.switch_to.window(driver.window_handles[-1])  定位到最新打开窗口
driver.switch_to.window(driver.window_handles[-2]) 定位到倒数第二个窗口
driver.switch_to.window(driver.window_handles[0]) 定位最开始的页面

1、driver.switch_to.window(driver.window_handles[-1]) 定位到最新打开窗口

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
url='http://www.gjgwy.net/zkzx/gjgwy/345695.html'
# 初始实例化-谷歌浏览器
driver=webdriver.Chrome()
#获取网址信息
driver.get(url)
#判断是否有弹窗,存在弹窗则关闭,没有继续执行即可
try:
    driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
    print("没有弹窗,继续执行")
# 点击浙江省份,查看浙江省的公考信息,实现页面跳转,打开新的页面。
driver.find_element(By.XPATH, '/html/body/div[4]/div/div[2]/a[2]').click()
time.sleep(2)
# 定位到新开页面
driver.switch_to.window(driver.window_handles[-1])
time.sleep(2)
# 判断是否存在弹窗,存在就获取弹窗,然后关闭;
#若网页刷新速度很慢,弹窗未出,就已经拿到元素信息,就不需要关闭弹窗;
try:
    driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
    print("没有弹窗,继续执行")
next_page =driver.find_element(By.XPATH,'/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]')
print(next_page.text)
time.sleep(1000)
# 关闭页面
driver.close()

此时next_page获取的值即为打开的第二个页面上的元素值,而非第一个页面的。

*next_page=【职位表】2022年辽宁公务员考试职位表*

倘若把切换窗口的代码注释掉,则会上报错误提示不存在的定位信息,如下:

# driver.switch_to.window(driver.window_handles[-1])
D:\workplace\venv\Scripts\python.exe D:\workplace\venv\Scripts\tietie.py 
Traceback (most recent call last):
  File "D:\workplace\venv\Scripts\tietie.py", line 19, in <module>
    next_page=driver.find_element(By.XPATH,'/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]')
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\workplace\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 861, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\workplace\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 444, in execute
    self.error_handler.check_response(response)
  File "D:\workplace\venv\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 249, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]"}
  (Session info: chrome=105.0.5195.102)
Stacktrace:
Backtrace:
	Ordinal0 [0x0029DF13+2219795]
	Ordinal0 [0x00232841+1779777]
	Ordinal0 [0x0014423D+803389]
	Ordinal0 [0x00173025+995365]
	Ordinal0 [0x001731EB+995819]
	Ordinal0 [0x001A0F52+1183570]
	Ordinal0 [0x0018E844+1108036]
	Ordinal0 [0x0019F192+1175954]
	Ordinal0 [0x0018E616+1107478]
	Ordinal0 [0x00167F89+950153]
	Ordinal0 [0x00168F56+954198]
	GetHandleVerifier [0x00592CB2+3040210]
	GetHandleVerifier [0x00582BB4+2974420]
	GetHandleVerifier [0x00336A0A+565546]
	GetHandleVerifier [0x00335680+560544]
	Ordinal0 [0x00239A5C+1808988]
	Ordinal0 [0x0023E3A8+1827752]
	Ordinal0 [0x0023E495+1827989]
	Ordinal0 [0x002480A4+1867940]
	BaseThreadInitThunk [0x7728FEF9+25]
	RtlGetAppContainerNamedObjectPath [0x77447BBE+286]
	RtlGetAppContainerNamedObjectPath [0x77447B8E+238]
	(No symbol) [0x00000000]

2、driver.switch_to.window(driver.window_handles[-2]) 定位到倒数第二个窗口

此时我们在上面的基础上,在跳转一个页面,来实现打开三个窗口的情况。
当然此时,不用driver.switch_to.window(driver.window_handles[-1]),这条指令,此时的页面指向也是第二个页面,如下,但是为了展示[-2]的作用,在这里先把页面定位到最新的窗口,然后再通过命令定位到倒数第二个页面。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
url='http://www.gjgwy.net/zkzx/gjgwy/345695.html'
# 初始实例化-谷歌浏览器
driver=webdriver.Chrome()
#获取网址信息
driver.get(url)
try:
    driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
    print("没有弹窗,继续执行")
# 点击浙江省份,查看浙江省的公考信息,实现页面跳转,打开新的页面。
driver.find_element(By.XPATH, '/html/body/div[4]/div/div[2]/a[2]').click()
# 定位到新开页面
driver.switch_to.window(driver.window_handles[-1])
time.sleep(5)
# 判断是否存在弹窗,存在就获取弹窗,然后关闭;
#若网页刷新速度很慢,弹窗未出,就已经拿到元素信息,就不需要关闭弹窗;
try:
    driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
    print("没有弹窗,继续执行")
time.sleep(2)
# 跳转到第三个页面
driver.find_element(By.XPATH, '/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]').click()
# 定位到最新的第三个页面上
driver.switch_to.window(driver.window_handles[-1])
# 输出最新页面上的信息
e=driver.find_element(By.XPATH,'/html/body/div[10]/div[1]/div[1]/div[2]')
print(e.text)
# 通过命令定位到倒数第二页面
driver.switch_to.window(driver.window_handles[-2])
# 输出倒数第二个页面的信息
a=driver.find_element(By.XPATH,'/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]')
print(a.text)
time.sleep(1000)
# 关闭页面
driver.close()

输出结果为:

#第三个页面的信息
2022年辽宁省考试录用公务员公告及职位表现已发布,报名时间为20222189时至22224时,笔试时间为2022326日、27日。

点击下载:2022年辽宁省考试录用公务员职位表(提取码:2h97)

2022年辽宁公务员考试职位表
上一篇: 2022年河南公务员考试网站及政策咨询电话
下一篇: 2022年辽宁公务员考试报考指南
#倒数第二个页面的信息
【职位表】2022年辽宁公务员考试职位表

3、driver.switch_to.window(driver.window_handles[0]) 定位最开始的页面

还是沿用上面的,三个页面状态,直接定位到第一个页面上的信息。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
url='http://www.gjgwy.net/zkzx/gjgwy/345695.html'
# 初始实例化-谷歌浏览器
driver=webdriver.Chrome()
#获取网址信息
driver.get(url)
#存在弹窗即可关闭,不存在继续执行
try:
    driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
    print("没有弹窗,继续执行")
# 点击浙江省份,查看浙江省的公考信息,实现页面跳转,打开新的页面。
driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/a[2]').click()
time.sleep(2)
# 定位到新开页面
driver.switch_to.window(driver.window_handles[-1])
time.sleep(5)
# 判断是否存在弹窗,存在就获取弹窗,然后关闭;
#若网页刷新速度很慢,弹窗未出,就已经拿到元素信息,就不需要关闭弹窗;
try:
    driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
    print("没有弹窗,继续执行")
# 跳转到第三个页面
driver.find_element(By.XPATH,'/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]').click()
# 定位到最新的第三个页面上
driver.switch_to.window(driver.window_handles[-1])
# 输出最新页面上的信息
e=driver.find_element(By.XPATH,'/html/body/div[10]/div[1]/div[1]/div[2]')
print(e.text)
# 通过命令定位到最开始的窗口
driver.switch_to.window(driver.window_handles[0])
# 若存在弹窗,则关掉
try:
    driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
    print("没有弹窗,继续执行")
# 输出最开始窗口的信息
a=driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/a[2]')
print(a.text)
time.sleep(1000)
# 关闭页面
driver.close()

输出结果为:

D:\workplace\venv\Scripts\python.exe D:\workplace\venv\Scripts\tietie.py 
#最后页面的信息
2022年辽宁省考试录用公务员公告及职位表现已发布,报名时间为20222189时至22224时,笔试时间为2022326日、27日。

点击下载:2022年辽宁省考试录用公务员职位表(提取码:2h97)

2022年辽宁公务员考试职位表
上一篇: 2022年河南公务员考试网站及政策咨询电话
下一篇: 2022年辽宁公务员考试报考指南
#最开始页面信息
辽宁

总结

在执行测试过程中会存在两个细节但是影响进程的问题:
1、进入一个新页面,有可能存在弹窗的情况,如果存在弹窗,那么当前页面就会定位在弹窗上,那一定不是你想要的元素,因此,我们可以关闭它,之后再继续执行。
2、执行过程中发现,有的时候,代码,元素条件都没有问题,但是就是报错,这是有可能网速的问题,我们要学会善用time.sleep这个语句,预留充足的时间可以继续执行。

  • 15
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python Selenium可以通过以下方式实现页面跳转: 1. 使用driver.get(url)方法来加载新页面,其中url为要跳转的页面的网址。 2. 使用driver.back()方法返回上一个页面。 3. 使用driver.forward()方法前进到下一个页面。 4. 使用driver.refresh()方法刷新当前页面。 5. 使用driver.switch_to.window(window_name)方法切换到指定的窗口,其中window_name为窗口的名称或句柄。 6. 使用driver.switch_to.frame(frame_reference)方法切换到指定的iframe,其中frame_reference为iframe的名称、id或WebElement对象。 7. 使用driver.execute_script(script)方法执行JavaScript脚本来实现页面跳转。 以上是Python Selenium实现页面跳转的常用方法,具体使用时需要根据实际情况选择合适的方法。 ### 回答2: Python Selenium 是一个自动化测试工具,它可以模拟用户的真实操作,如点击按钮、输入文本、页面跳转等。页面跳转Python Selenium 中经常遇到的场景,下面来介绍几种常见的页面跳转方式以及如何处理。 1. 点击链接/按钮 在 Python Selenium 中,我们可以使用 `click()` 方法来点击链接或按钮,比如: ``` driver.find_element_by_link_text("学习Python").click() ``` 这个命令将会找到页面上文本为“学习Python”的链接,并点击它,从而跳转到对应的页面。 2. 输入地址 如果我们已经知道了要跳转页面的地址,可以使用 `get()` 方法来直接输入地址进行跳转。比如: ``` driver.get("https://www.baidu.com") ``` 这个命令将直接跳转到百度搜索页面。 3. 前进/后退 有时候我们需要在当前页面上进行一些操作,然后又需要返回到之前的页面或者前进到下一个页面。可以使用 `back()` 和 `forward()` 方法来实现: ``` driver.back() # 返回到上一个页面 driver.forward() # 前进到下一个页面 ``` 4. 新开页面 有些链接会在新的标签页中打开,这时候我们可以使用 `switch_to.window()` 方法来切换到新的页面进行操作。比如: ```python # 获取当前窗口句柄 handle1 = driver.current_window_handle # 点击链接,在新窗口中打开 link = driver.find_element_by_link_text("在新窗口中打开") link.click() # 获取所有窗口句柄 handles = driver.window_handles # 切换到新窗口 for handle in handles: if handle != handle1: driver.switch_to.window(handle) break # 在新窗口中进行操作 driver.find_element_by_id("username").send_keys("admin") # 切回到原来的窗口 driver.switch_to.window(handle1) ``` 以上是 Python Selenium 页面跳转的几种常见方式,根据实际场景选择合适的方法可以更加高效地进行页面操作。 ### 回答3: Python Selenium 是一个非常强大的自动化测试工具,它可以模拟真实的用户操作,并且可以进行页面跳转。 首先,我们需要导入 selenium 库,并且打开我们需要进行测试的网站: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") ``` 接着,我们需要进行页面跳转。常见的页面跳转有两种方式,即通过链接跳转和通过页面元素跳转。 通过链接跳转,我们可以使用 driver.get(url) 或 driver.navigate().to(url) 方法,例如: ```python driver.get("https://www.baidu.com/s?wd=selenium") ``` 通过页面元素跳转,我们可以先定位需要跳转元素,然后执行 click() 方法,例如: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(),'Python')]"))) element.click() ``` 以上代码会定位页面中文本包含 "Python" 的 a 标签,并且等待元素可被点击后进行点击操作,从而实现页面跳转。 在页面跳转后,我们可以通过 driver.current_url 属性获取当前页面的 URL,例如: ```python print(driver.current_url) ``` 另外,如果我们需要后退或者前进到前面已经访问过的页面,可以使用 driver.back() 和 driver.forward() 方法,例如: ```python driver.back() driver.forward() ``` 综上所述,通过使用 Python Selenium,我们可以轻松地进行页面跳转,并且对于需要进行测试和爬取数据的网站,非常实用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值