Selenium元素无法定位常见问题
一、frame/iframe表单嵌套 webdriver默认查找的元素都是Top window这层,如果有些元素内嵌在frame内部,需要先使用switch to语句,切换到frame内部,然后去操作元素,操作完了...
一、frame/iframe表单嵌套
webdriver默认查找的元素都是Top window这层,如果有些元素内嵌在frame内部,需要先使用switch to语句,切换到frame内部,然后去操作元素,操作完了之后,需要switch out到default区域,也就是Top window。
解决方法:
1. switch_to.frame()默认可以直接取表单的id或name属性。
2. 如果没有可用的id和name属性,可以先定位到frame/iframe,再将定位对象传给switch_to.frame(对象)方法。
二、浏览器多窗口切换
我们在编写自动化脚本过程中会遇见这也一个问题,在页面A点击一个链接,会在新的tab窗口打开页面B,这个时候,我们就开始准备着页面B的脚本,并且在编写的时候是可以获取到元素的,可是当自动化执行时,会报错,提示无法定位到元素。这种情况,我们如何处理呢?
解决方法:
在webdriver中提供了一个switch.to.window(handle)的方法。参数handle就是前面文章中提到的获取窗口句柄的值。
三、处理alert弹窗
很多时候,我们进入一个网站,就会弹窗一个alert框,有些我们直接关闭,有些可能有取消和确定按钮,还有些调查的alert框,可以运行用户输入文字,例如预定一个网站的资讯,输入邮箱地址就可以,每天接收一封该网站推送的邮件。
解决方法:
对于JavaScript生成的alert、confirm以及prompt,无法使用前端工具对弹出窗口进行定位的,使用driver.switch_to.alert方法定位弹出框。alert的方法有:
四、动态id定位
做web自动化时,常常会碰到需要定位的元素id不是固定的,无法通过id进行定位。所以推荐使用xpath的相对路径方法查找到该元素。比如我们进入163的登录页面,我们通过id可以定位到“用户名”这个输入框。但是刷新页面以后,或者是在我们自动化运行这段脚本的时候,就定位不到,原因是该元素的id是动态的。
可以获取
无法获取
解决方法:
使用xpath定位方式,可以解决因动态ID导致无法定位的问题:
五、页面还没有加载出来,就对页面上的元素进行的操作
因为加载元素延时造成的脚本失败,我们可以通过设置等待时间来提升自动化脚本的稳定性。
解决方法:
1. WebDriverWait() 显示等待。等待单个的元素加载,通常配合until() 方法使用。
● driver - 传入WebDriver实例,必填
● timeOutInSeconds- 最长等待时间,必填
● sleepInMillis- 调用`until`/`until_not`方法的时间间隔,默认为0.5秒,可省。
2. 隐式等待。全局等待,对所有元素设置超时时间,等待页面的加载,因此只需要设置一次即可。这里的时间是最长等待时间(非固定等待时间)。
3. Thread.sleep(3000)线程等待,休眠固定的时间。
六、使用WebDriver调用JavaScript代码代替无法实现的功能
我们还会遇到一些明明可以获取到元素信息的情况,并且元素也没有发生改变,但是运行的时候却提示“Element is not clickable at point. Other element would receive the click”。
解决方法:
出现这个问题的原因是前一步的操作,弹出的图层挡住了,我们可以通过调用JavaScript代码解决此问题。
如果页面内容过长,窗口最大化也无法查看到所有元素,可以通过执行JavaScript脚本实现滚动条的拖动等动作。
七、firefox安全性强,不允许跨域调用出现报错
错误描述:uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMNSHTMLDocument.execCommand]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location:
解决办法:
这是因为firefox安全性强,不允许跨域调用。Firefox 要取消XMLHttpRequest的跨域限制的话,第一
是从 about:config 里设置 signed.applets.codebase_principal_support = true;(地址栏输入about:config 即可进行firefox设置)第二就是在open的代码函数前加入类似如下的代码:try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); } catch (e) { alert("Permission UniversalBrowserRead denied."); }
今日福利
【Java11期开课啦】
8大实战案例模块,历时三年沉淀,Java4.0震撼发布!
偷偷告诉你前50名,还可获得价值300元的京东购物卡呦~
如有疑问,请留言告知,或者咨询柠檬班软件测试培训机构:www.ceshiren.com官网客服哦