解决Selenium弹出新页面无法定位元素问题_第1页
解决Selenium弹出新页面无法定位元素问题_第2页
解决Selenium弹出新页面无法定位元素问题_第3页
解决Selenium弹出新页面无法定位元素问题_第4页
解决Selenium弹出新页面无法定位元素问题_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、解决Selenium弹出新页面无法定位元素问题问题来源一般来说,我们进行自动化登录,之后想直接进行对图书的续约操作,但是利用元素定位的方法,怎么都找不到元素,我一直以为是我的规则用的不对,导致元素找不到,其实,只是窗口句柄还停留在上一个页面而已!对于新弹出的页面还没有定位!那怎么可能找得到在新页面的元素呢!这是新手(我)犯下最大的错误,只顾于对元素方法的定位,却没有意识到页面发生跳转后的handles的变化。请看测试;#coding=utf-8from selenium import webdriverimport timebrowser=webdriver.Firefox()browser.

2、get("")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/div3/div4/div/div3/div4/h3/a").click(

3、)time.sleep(5)当然如果我一点都不改,也是进行不了测试的,这位大哥把注释符号写错了,不是/,而是#啊大哥ok,然后运行下:出错了所以我感到好奇的是,这位大哥到底有没有跑过这段代码,看着原创的样子应该没有抄袭才对啊,那应该是测试过代码才对,但是可重复性在哪?最后发现需要修改http成这样才能访问(大哥少加个/):browser.get("#coding=utf-8from selenium import webdriverimport timebrowser=webdriver.Firefox()browser.get("browser.find_element_

4、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/div3/div3/div/div3/div4/h3/a").click()#我这里修改了一下div4,大哥的索引直接到有道

5、翻译了,不利于下一步测试time.sleep(1)ok,这次能正常索引到值,但是!我要说的是但是!这根本没有跳转页面!还是在同一个页面进行操作的!如果我把大哥的代码改成:在我测试的时候,发生了奇怪的事情,同样的代码,有时候能跑有时候抛出错误,我已设定休眠时间,难道是我频繁访问导致百度封我?刚才上述的代码我都实际测试过的,但是现在又不能用了-wtf-,所以。我换了稳定的引擎,我采用bing搜索来试试,上面的全部作废,如果有人知道问题出在哪,请留言7.19补充应该是搜索引擎热点的问题,每次键入相同的值可能搜索结果首项会不一致的,百度可能更新热点比较快把,所以出现了我所谓不稳定的情况正题测试我和上述

6、那位大哥不同的观点在于,他用的sreach_window=browser.current_window_handle方法并不能实现对新窗口句柄的捕捉,我以bing主页为测试页,重新构造了一下,#coding=utf-8from selenium import webdriverimport timebrowser=webdriver.Firefox()browser.get("keywords = 'MrLevo520 CSDN'send_keywords=keywords.decode('utf-8')#中英混输入可防止乱码browser.find_

7、element_by_id("sb_form_q").send_keys(send_keywords)time.sleep(1)#-操作一:进行对关键字MrLevo520 CSDN搜索-browser.find_element_by_id("sb_form_go").click()#执行此操作会进行搜索,但是没有弹出新窗口,所以句柄不用重定位time.sleep(3)#-操作二:对搜索页面"我的CSDN"进行点击操作-browser.find_element_by_xpath("/html/body/div/ol/li/h2

8、/a").click()#进行当前页面点击第一项#-操作三:对新弹出的页面再点击"贡献的资源"选项-sreach_window=browser.current_window_handlebrowser.find_element_by_xpath("/html/body/div3/div2/div2/div/a3").click()time.sleep(5)浏览器运行结果只到如图:而且抛出错误:mon.exceptions.NoSuchElementException: Message: Unable to locate element: &qu

9、ot;method":"xpath","selector":"/html/body/div3/div2/div2/div/a3"可见,此语句并没有实现句柄重定位的功能,然后我再试试下面的方法,所有语句不变,只改变获取当前句柄的语句,改成browser.switch_to_window(browser.window_handles1)最后程序应该是这样:#coding=utf-8from selenium import webdriverimport timebrowser=webdriver.Firefox()browser

10、.get("keywords = 'MrLevo520 CSDN'send_keywords=keywords.decode('utf-8')#中英混输入可防止乱码browser.find_element_by_id("sb_form_q").send_keys(send_keywords)time.sleep(1)#-操作一:进行对关键字MrLevo520 CSDN搜索-browser.find_element_by_id("sb_form_go").click()#执行此操作会进行搜索,但是没有弹出新窗口,所

11、以句柄不用重定位time.sleep(3)#-操作二:对搜索页面"我的CSDN"进行点击操作-browser.find_element_by_xpath("/html/body/div/ol/li/h2/a").click()#进行当前页面点击第一项#-操作三:对新弹出的页面再点击"贡献的资源"选项-browser.switch_to_window(browser.window_handles1)browser.find_element_by_xpath("/html/body/div3/div2/div2/div/a3&q

12、uot;).click()time.sleep(5)最后结果,按照我的思路,进行了相应的点击,最后如图所以从上述的例子上来说,语句sreach_window=browser.current_window_handle并没有实现重定位,可能我才疏学浅,但至少,在上述的那位大哥的博客中,写的是错误的,运行失败,我对2016.7.16的所有数据负责,实际测试失败。7.17-补充:另一种获取句柄方法还有另一种方法,就是直接定位当前最新弹出的窗口。代码是这样的for handle in browser.window_handles:#方法二,始终获得当前最后的窗口,所以多要多次使用 browser.sw

13、itch_to_window(handle)那么结合到我的代码中那就是这样的:#Author:哈士奇说喵#因为搜索引擎检索项根据热度来排名,所以我只能对7.17的数据进行测试和负责,大家测试时候注意元素变化#coding=utf-8from selenium import webdriverimport timebrowser=webdriver.Firefox()browser.get("keywords = 'MrLevo520 CSDN'send_keywords=keywords.decode('utf-8')#中英混输入可防止乱码browse

14、r.find_element_by_id("sb_form_q").send_keys(send_keywords)time.sleep(1)#-操作一:进行对关键字MrLevo520 CSDN搜索-browser.find_element_by_id("sb_form_go").click()#执行此操作会进行搜索,但是没有弹出新窗口,所以句柄不用重定位time.sleep(3)#-操作二:对搜索页面第一项进行点击操作-browser.find_element_by_xpath("/html/body/div/ol/li/h2/a"

15、).click()#进行当前页面点击第一项#-操作三:对新弹出的页面再点击"我的头像"选项-#注意此时已经是弹出的第一个窗口了,需要重新定位句柄'''browser.switch_to_window(browser.window_handles1)#方法一'''for handle in browser.window_handles:#方法二,始终获得当前最后的窗口 browser.switch_to_window(handle)browser.find_element_by_xpath("/divid='b

16、ody'/div2/div/div/ul2/div/a").click()#-操作四:点击"贡献的资源"-#注意此时已经是新弹出的第二个窗口了,需要重新定位句柄browser.switch_to_window(browser.window_handles2)#方法一,注意window_handles2变成了2'''for handle in browser.window_handles:#方法二,始终获得当前最后的窗口 browser.switch_to_window(handle)'''browser.fi

17、nd_element_by_xpath("/html/body/div3/div2/div2/div/a3").click()time.sleep(5)上面的代码,我要说几点,总共实现完成会存在三个浏览器窗口,也就是相当于实现了两次句柄重定位功能,也就是下面的图片,对bing搜索“MrLevo520 CSDN”跳出的最热项,也就是这一篇(感谢大家厚爱),但是昨天最热弹出来的是直接是我的主页,大家从上面的动图应该也可以看出来,所以等你测试这段代码的时候,可能最热项目又变化了,道理大家懂就ok,不影响重抓句柄代码。代码实现了从1,到2,点击头像后,再跳转到3主页,之后再点击&q

18、uot;贡献资源",实现的动图如下:Pay Attention1.搜索引擎根据热度来排名,也就是代码具有"不稳定性",应该根据自己实际情况,定位不同元素,我只对当前编辑时间的数据负责2.在实际操作过程中,会产生第一个页面还没等第二个页面缓冲完,直接又"占领"主视觉的问题,别担心,句柄还是在传递的,程序一直在跑,而且没有出错,过一会时间就会更新加载页面的,如果想要关闭无关页面,请看这篇博客 基于Selenium一键写CSDN博客3.可能我的代码第一次获取句柄和第二次获取句柄不一样的方法,这是为了展示,你可以两次句柄获取都用方法二,也可以都是用方法一,但是方法一注意修改标号。方法一 VS 方法二相比较于方法二,方法一的优点在于后续操作,比如关闭第几个窗口,句柄传递是按照顺序来的。缺点在于对于较多新页面,有时候弹出窗口太多会变得难以计算

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论