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

这篇具有很好参考价值的文章主要介绍了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这个语句,预留充足的时间可以继续执行。文章来源地址https://www.toymoban.com/news/detail-405884.html

到了这里,关于Selenium页面跳转后的元素定位-switch_to.window()使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【selenium自动化测试】如何定位页面元素,及对页面元素的操作方法

    selenium元素定位 ​selenium定位元素的方式有8种。 fild_element(by,value):by表示使用的定位方式,定位方式可以参见By类。value表示值,例如:根据id定位 By.ID,value=id属性的值。该方法返回元素对象,返回值如下: 这个返回结果说明:返回值为WebElement类的对象,元素在使用方法时

    2024年02月10日
    浏览(68)
  • vue路由跳转后,刷新指定页面。

            做项目遇到一个坑:A页面带参跳转到B页面,第二次跳转时的参数与第一次时的参数不同,但是后台查询时还是使用的第一次的参数。需要手动刷新之后,才会使用第二次参数。         鉴于时间原因直接使用刷新页面监听路由的方法。在准备跳转的A页面添加路

    2024年02月12日
    浏览(72)
  • selenium对于页面改变的定位元素处理办法

    在学习selenimu中,总是发现元素定位不到,想了各种办法,最后总结大致有两个原因。 1.等待时间不够,页面还没有完全渲染就进行操作,使用time模块进行等待。 2.换了页面后,发现定位不到元素,因为浏览器还停留在最开始的页面,处理办法,加一行代码。 运行结果: 缺

    2024年02月01日
    浏览(47)
  • vue单页面实现路由跳转后保留原页面数据

    有时候在路由跳转后,返回原页面时需要保留之前的数据,即不销毁页面。 页面的缓存,需要用到vue的内置组件keep-alive,来缓存列表页面,同时配合路由选项来更改页面的数据。 在设置keep-alive缓存的组件中,首次进入组件,会一次调用组件的钩子函数:created -- mounted --ac

    2024年02月15日
    浏览(41)
  • 【Python】Python 模块用法:selenium 4 版本页面元素定位方法汇总

    目录 一、定位页面元素方法源码说明  (1)Webdriver.common (2)selenium.webdriver.common.by (3)By 二、定位页面元素方法用法汇总 (1)2.0 及以下低版本 selenium :By 定位页面元素方法用法(可忽略) (2)3.0 ~ 3.9 版本 selenium:By 定位页面元素方法用法 (3)4.0 ~ 4.9 版本 selenium:

    2023年04月13日
    浏览(89)
  • 基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器

     🔥 交流讨论: 欢迎加入我们一起学习! 🔥 资源分享 : 耗时200+小时精选的「软件测试」资料包 🔥  教程推荐: 火遍全网的《软件测试》教程   📢 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 对于自动化测试,尤其是UI的自动化测试。是很多做黑盒功能测试的同

    2024年03月17日
    浏览(67)
  • python selenium 定位鼠标悬浮后的新弹窗数据

            最近需要获取网页上的标签数据,但是标签大于3个以后是隐藏的,需要鼠标hover上去才显示。如下图,图一是刚进来界面展示的,需要知道额外的7个标签则需要将鼠标移动到目标上面去。            但是比较尴尬的一个点是,当游览器打开F12后,使用鼠标去选中关

    2024年02月06日
    浏览(45)
  • 【深入浅出Selenium库的百变玩法】: 掌握Web自动化测试的关键技术和策略,包括元素定位、页面操作、动态内容处理等,适用于初学者和高级开发者的综合指南

    Selenium是一个功能强大的库,支持多种高级操作,如处理多窗口、多标签页、键盘与鼠标事件、滚动操作等。掌握Selenium可以大大提高Web应用的测试效率和覆盖范围。希望这篇文章能帮助你开启Selenium进行自动化测试的新篇章。 Selenium也是一个广泛使用的自动化测试工具,它支

    2024年02月20日
    浏览(63)
  • selenium元素定位,获取某个元素下的所有元素

    例: 想要获取所有的li元素: 结果如下 获取到元素后可以直接进行操作: list_tab[2].click() list_tab[5].send_keys(‘123456’)

    2024年02月16日
    浏览(44)
  • 自学Python 69 Selenium八大元素定位方法(新版BY方法)_selenium定位元素的方法和优缺点

    文章目录 Python Selenium八大元素定位方法(新版BY方法) 前言 一、常用的八种定位方法(新旧对比) 二、查看网页元素 三、八大元素定位示例 1、id定位 2、name定位 3、class定位 4、tag定位 5、link定位 6、partial_link定位 7、xpath定位 8、CSS定位 在学习使用Selenium对网页元素进行定位时

    2024年04月22日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包