当前位置: 首页 > article >正文

UI自动化中元素无法定位问题解决方法

元素无法定位问题解决方法

  • 1、display屏蔽元素
  • 2、iframe内元素无法定位
  • 3、 根据部分元素属性定位
  • 4、页面跳转到新的标签页,或者弹出的警告框等
  • 6、使用WebDriver调用JavaScript代码代替无法实现的功能

1、display屏蔽元素

分析一下html的display属性,可以用js强行点击这个元素或者改变元素的display属性去实现定位

扩展一下:

display: none 和hidden的区别
共同点:把网页中的某个元素隐藏起来;他们在selenium中都是定位不到的。
区别:display:none不为隐藏的对象保留其物理空间,该对象在这个页面上彻底消失,看不到/摸不到;hidden使对象在网页上不可见,但该对象在网页中依然占有空间,看不到/摸得到。
备注:isElementPresent()来判断元素是否存在。

2、iframe内元素无法定位

如果iframe有name或id的话,直接使用switch_to_frame(“name值”)或switch_to_frame(“id值”)

driver=webdriver.Firefox()
driver.get(r'http://www.126.com/')
driver.switch_to_frame('x-URS-iframe')  #需先跳转到iframe框架
username=driver.find_element_by_name('email')
username.clear()

如果iframe没有name或id的话,则可以通过下面的方式定位:
#先通过class定位到iframe
elementi= driver.find_element_by_class_name(‘APP-editor-iframe’)
#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(elementi)

如果完成操作后,可以通过switch_to.parent_content()方法跳出当前iframe,或者还可以通过switch_to.default_content()方法跳回最外层的页面。

3、 根据部分元素属性定位

xpath中提供了三个非常好的方法来为我们定位部分属性值

driver.find_element_by_xpath(“//div[contains(@id, ‘btn-attention’)]”)

driver.find_element_by_xpath(“//div[starts-with(@id, ‘btn-attention’)]”)

driver.find_element_by_xpath(“//div[ends-with(@id, ‘btn-attention’)]”) # 这个需要结尾是‘btn-attention’

4、页面跳转到新的标签页,或者弹出的警告框等

在页面操作过程中有时候点击某个链接会弹出新窗口,这时就需要切换焦点到新窗口上进行操作。
解决方法1:driver.switch_to.window(window_handle)切换到新窗口。
首先获取当前窗口的句柄driver.current_window_handle,接着打开弹出新窗口,获得当前打开的所有窗口的句柄driver.window_handles。通过for循环遍历handle,如果不等于第一次打开窗口的句柄,那么一定是新窗口的句柄,因为执行过程只打开了两个窗口;改变条件,如果等于第一次打开窗口的句柄,那么可以切换回第一次打开的窗口。
解决方法2:对于JavaScript生成的alert、confirm以及prompt,无法使用前端工具对弹出窗口进行定位的,使用driver.switch_to.alert方法定位弹出框。alert的方法有:

.accept()    '等同于点击“确认”或“OK”'
.dismiss()    '等同于点击“取消”或“Cancel”'
.text        '获取alert文本内容,对有信息显示的alert框'
.send_keys(text)    '发送文本,对有提交需求的prompt框'
.authenticate(username,password)    '验证,针对需要身份验证的alert'

6、使用WebDriver调用JavaScript代码代替无法实现的功能

对于有些WebDriver没有提供的方法或者无法实现的功能,WebDriver提供了driver.execute_script()方法来执行JavaScript代码。
解决方法:如果页面内容过长,窗口最大化也无法查看到所有元素,可以通过执行JavaScript脚本实现滚动条的拖动等动作。

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

以上语句实现了拉动页面到底部的功能,其中window.scrollTo(左边距,上边距)是JavaScript中用于设置浏览器窗口滚动条的水平和垂直位置的代码。

text = "input text"
driver.execute_script("var obj=document.getElementById('text'); obj.value=' " + text + " ';")

假设一个输入框可以通过id='text’将其定位,却不能通过send_keys()输入文本内容,可以借助JavaScript代码来实现。

video = driver.find_element_by_xpath("body/Section[1]/div/video")
url = driver.execute_script("return arguments[0].currentSrc;", video)
print(url)           '返回文件播放地址'
 
print("start")      '播放视屏'
driver.execute_script("return arguments[0].play()", video)
 
sleep(15)           '播放15秒钟'
 
print(stop)         '暂停视屏'
driver.execute_script("arguments[0].pause()", video)

其中arguments是JavaScript的内置对象。因为将video对象传给了arguments[0],所以arguments[0]相当于JavaScript脚本的document.getElementsByTagName(“video”)。JavaScript不支持重载,使用arguments对象可以模拟函数重载效果。


http://www.kler.cn/a/228771.html

相关文章:

  • 1166 Summit (25)
  • 简单介绍JSONStream的使用
  • 创建 pdf 合同模板
  • 2,Linux文件基本属性(基于Ubuntu示例进行讲解)
  • 挖掘机检测数据集,准确识别率91.0%,4327张原始图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注
  • 3. Go函数概念
  • @ResponseBody
  • idea中找到所有的TODO
  • 【计算机网络】物理层概述|通信基础|奈氏准则|香农定理|信道复用技术
  • 使用PHPStudy搭建本地web网站并实现任意浏览器公网访问
  • 第八届:世界3D渲染挑战赛《无尽阶梯》正式开启
  • QT 的 blockSignals(true) 的作用范围
  • error: failed to push some refs to....
  • 基于Vue2用keydown、setTimeout事件实现连续按键(连击)任意键(或组合键)3秒触发自定义事件(以F1键为例)
  • 分享62个节日PPT,总有一款适合您
  • 2024最新最详细【接口测试总结】
  • 2024年第一篇博客
  • 【npm】安装全局包,使用时提示:不是内部或外部命令,也不是可运行的程序或批处理文件
  • 构造回文数组
  • thinkphp6入门(16)-- 缓存cache用法总结
  • React 中实现拖拽功能-插件 react-beautiful-dnd
  • MYSQL——MySQL8.3无法启动
  • 路由引入路由过滤
  • 读论文:DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior
  • 【Django-ninja】使用schema
  • 代码随想录算法训练营第二十二天|216.组合总和III,17.电话号码的字母组合