解决Selenium弹出新页面无法定位元素问题.docx
- 文档编号:17770117
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:11
- 大小:724.94KB
解决Selenium弹出新页面无法定位元素问题.docx
《解决Selenium弹出新页面无法定位元素问题.docx》由会员分享,可在线阅读,更多相关《解决Selenium弹出新页面无法定位元素问题.docx(11页珍藏版)》请在冰点文库上搜索。
解决Selenium弹出新页面无法定位元素问题
解决Selenium弹出新页面无法定位元素问题
问题来源
一般来讲,咱们进行自动化登录,以后想直接进行对图书的续约操作,可是利用元素定位的方式,怎么都找不到元素,我一直以为是我的规则用的不对,致使元素找不到,其实,只是窗口句柄还停留在上一个页面算了!
对于新弹出的页面尚未定位那怎么可能找取得在新页面的元素呢!
!
这是新手(我)犯下最大的错误,只顾于对元素方式的定位,却没成心识到页面发生跳转后的handles的转变。
请看测试;
#coding=utf-8
fromseleniumimportwebdriver
importtime
browser=webdriver.Firefox()
browser.get("baidu")
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
time.sleep(3)
sreach_window=browser.current_window_handle//此行代码用来定位当前页面
browser.find_element_by_xpath("/html/body/div[3]/div[4]/div/div[3]/div[4]/h3/a").click()
time.sleep(5)
固然若是我一点都不改,也是进行不了测试的,这位大哥把注释符号写错了,不是//,而是#啊大哥
ok,然后运行下:
犯错了
所以我感到好奇的是,这位大哥到底有无跑过这段代码,看着原创的样子应该没有剽窃才对啊,那应该是测试过代码才对,可是可重复性在哪?
最后发现需要修改http成这样才能访问(大哥少加个/):
browser.get("https:
//baidu/")修改后代码如下:
#coding=utf-8
fromseleniumimportwebdriver
importtime
browser=webdriver.Firefox()
browser.get("https:
//baidu/")
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
time.sleep
(1)
sreach_window=browser.current_window_handle#此行代码用来定位当前页面
time.sleep
(2)
browser.find_element_by_xpath("/html/body/div[3]/div[3]/div/div[3]/div[4]/h3/a").click()#我这里修改了一下div[4],大哥的索引直接到有道翻译了,无益于下一步测试
time.sleep
(1)
ok,这次能正常索引到值,可是我要说的是可是
这根本没有跳转页面!
仍是在同一个页面进行操作的!
若是我把大哥的代码改成:
在我测试的时候,发生了奇怪的事情,一样的代码,有时候能跑有时候抛犯错误,我已设定休眠时间,莫非是我频繁访问致使XX封我?
适才上述的代码我都实际测试过的,可是此刻又不能用了--wtf--,所以。
我换了稳定的引擎,我采用bing搜索来试试,上面的全数作废,若是有人知道问题出在哪,请留言
7.19补充
应该是搜索引擎热点的问题,每次键入相同的值可能搜索结果首项会不一致的,XX可能更新热点比较快把,所以出现了我所谓不稳定的情况
正题测试
我和上述那位大哥不同的观点在于,他用的
sreach_window=browser.current_window_handle
方式并非能实现对新窗口句柄的捕捉,我以bing主页为测试页,从头构造了一下,
#coding=utf-8
fromseleniumimportwebdriver
importtime
browser=webdriver.Firefox()
browser.get("cn.bing/")
keywords='MrLevo520CSDN'
send_keywords=keywords.decode('utf-8')#中英混输入可避免乱码
browser.find_element_by_id("sb_form_q").send_keys(send_keywords)
time.sleep
(1)
#----------操作一:
进行对关键字MrLevo520CSDN搜索----------------
browser.find_element_by_id("sb_form_go").click()#执行此操作会进行搜索,可是没有弹出新窗口,所以句柄不用重定位
time.sleep(3)
#----------操作二:
对搜索页面"我的CSDN"进行点击操作--------------
browser.find_element_by_xpath("/html/body/div/ol/li/h2/a").click()#进行当前页面点击第一项
#--------操作三:
对新弹出的页面再点击"贡献的资源"选项-----
sreach_window=browser.current_window_handle
browser.find_element_by_xpath("/html/body/div[3]/div[2]/div[2]/div/a[3]").click()
time.sleep(5)
阅读器运行结果只到如图:
而且抛犯错误:
seleniummon.exceptions.NoSuchElementException:
Message:
Unabletolocateelement:
{"method":
"xpath","selector":
"/html/body/div[3]/div[2]/div[2]/div/a[3]"}
可见,此语句并无实现句柄重定位的功能,然后我再试试下面的方式,所有语句不变,只改变获取当前句柄的语句,改成
browser.switch_to_window(browser.window_handles[1])
最后程序应该是这样:
#coding=utf-8
fromseleniumimportwebdriver
importtime
browser=webdriver.Firefox()
browser.get("cn.bing/")
keywords='MrLevo520CSDN'
send_keywords=keywords.decode('utf-8')#中英混输入可避免乱码
browser.find_element_by_id("sb_form_q").send_keys(send_keywords)
time.sleep
(1)
#----------操作一:
进行对关键字MrLevo520CSDN搜索----------------
browser.find_element_by_id("sb_form_go").click()#执行此操作会进行搜索,可是没有弹出新窗口,所以句柄不用重定位
time.sleep(3)
#----------操作二:
对搜索页面"我的CSDN"进行点击操作--------------
browser.find_element_by_xpath("/html/body/div/ol/li/h2/a").click()#进行当前页面点击第一项
#--------操作三:
对新弹出的页面再点击"贡献的资源"选项-----
browser.switch_to_window(browser.window_handles[1])
browser.find_element_by_xpath("/html/body/div[3]/div[2]/div[2]/div/a[3]").click()
time.sleep(5)
最后结果,依照我的思路,进行了相应的点击,最后如图
所以从上述的例子上来讲,语句sreach_window=browser.current_window_handle并无实现重定位,可能我才疏学浅,但至少,在上述的那位大哥的博客中,写的是错误的,运行失败,我对2016.7.16的所有数据负责,实际测试失败。
7.17-补充:
另一种获取句柄方式
还有另一种方式,就是直接定位当前最新弹出的窗口。
代码是这样的
forhandleinbrowser.window_handles:
#方式二,始终获适当前最后的窗口,所以多要多次利用
browser.switch_to_window(handle)
那么结合到我的代码中那就是这样的:
#Author:
哈士奇说喵
#因为搜索引擎检索项按照热度来排名,所以我只能对7.17的数据进行测试和负责,大家测试时候注意元素转变
#coding=utf-8
fromseleniumimportwebdriver
importtime
browser=webdriver.Firefox()
browser.get("cn.bing/")
keywords='MrLevo520CSDN'
send_keywords=keywords.decode('utf-8')#中英混输入可避免乱码
browser.find_element_by_id("sb_form_q").send_keys(send_keywords)
time.sleep
(1)
#----------操作一:
进行对关键字MrLevo520CSDN搜索----------------
browser.find_element_by_id("sb_form_go").click()#执行此操作会进行搜索,可是没有弹出新窗口,所以句柄不用重定位
time.sleep(3)
#----------操作二:
对搜索页面第一项进行点击操作--------------
browser.find_element_by_xpath("/html/body/div/ol/li/h2/a").click()#进行当前页面点击第一项
#--------操作三:
对新弹出的页面再点击"我的头像"选项-----
#注意此时已是弹出的第一个窗口了,需要从头定位句柄
'''browser.switch_to_window(browser.window_handles[1])#方式一'''
forhandleinbrowser.window_handles:
#方式二,始终获适当前最后的窗口
browser.switch_to_window(handle)
browser.find_element_by_xpath("//div[@id='body']/div[2]/div/div/ul[2]/div/a").click()
#------------------操作四:
点击"贡献的资源"-------------------
#注意此时已是新弹出的第二个窗口了,需要从头定位句柄
browser.switch_to_window(browser.window_handles[2])#方式一,注意window_handles[2]变成了2
'''forhandleinbrowser.window_handles:
#方式二,始终获适当前最后的窗口
browser.switch_to_window(handle)'''
browser.find_element_by_xpath("/html/body/div[3]/div[2]/div[2]/div/a[3]").click()
time.sleep(5)
上面的代码,我要说几点,总共实现完成会存在三个阅读器窗口,也就是相当于实现了两次句柄重定位功能,也就是下面的图片,对bing搜索“MrLevo520CSDN”跳出的最热项,也就是这一篇(感激大家厚爱),可是昨天最热弹出来的是直接是我的主页,大家从上面的动图应该也可以看出来,所以等你测试这段代码的时候,可能最热项目又转变了,道理大家懂就ok,不影响重抓句柄代码。
代码实现了从1,到2,点击头像后,再跳转到3主页,以后再点击"贡献资源",实现的动图如下:
PayAttention
1.搜索引擎按照热度来排名,也就是代码具有"不稳定性",应该按照自己实际情况,定位不同元素,我只对当前编辑时间的数据负责
2.在实际操作进程中,会产生第一个页面还没等第二个页面缓冲完,直接又"占领"主视觉的问题,别担忧,句柄仍是在传递的,程序一直在跑,而且没有犯错,过一会时间就会更新加载页面的,若是想要关闭无关页面,请看这篇博客基于Selenium一键写CSDN博客
3.可能我的代码第一次获取句柄和第二次获取句柄不一样的方式,这是为了展示,你可以两次句柄获取都用方式二,也可以都是用方式一,可是方式一注意修改标号。
方式一VS方式二
相较较于方式二,方式一的长处在于后续操作,比如关闭第几个窗口,句柄传递是依照顺序来的。
缺点在于对于较多新页面,有时候弹出窗口太多会变得难以计算。
而方式二,一直在获取最后的窗口,若是你只是对最后的窗口进行操作,也就是(自己概念的)”前向“操作时,不计后果,可以直接拿来用,而且代码不变。
缺点在于,若是要返回到某个窗口句柄,那就显得没有方式一来的好,至少我此刻是这么以为的,可能以后我会回来修改。
总结
我姑且以为这句语句,单独作用于上述博客中是不可行的。
所以我在后续的博客中对窗口重定向语句改成了browser.switch_to_window(browser.window_handles[1]),至少在我的实验中,这句语句实现了我需要的操作。
最后上张动图表示流程:
最后
将待解决实际问题解决,方式老是好多种,就看自己想不想解决。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 解决 Selenium 弹出 新页 无法 定位 元素 问题
![提示](https://static.bingdoc.com/images/bang_tan.gif)