在RPA开发的过程中,总是会发现有些元素拾取在设计器的时候已经点到了,运行起来却拾取失败,或者只运行此组件可以成功,整体运行却也拾取不到,本文结合笔者的踩坑经验,给你提供一些思路——
本文更多地从实际使用出发,对涉及到的理论探讨可能不够完善
浏览器拾取几个重要的属性:查找路径,ScrollIntoView,网址
首先要了解,html页面是由一个个标签组成的,定位元素就是定位标签。常用的定位方式有id,name,class name, tag name,xpath,css-selector,使用设计器去拾取元素时,属性表的查找路径就会生成这个元素的定位代码,一般来讲,它都是正确的,但当网页的某些元素出现了随机数组合时,就会出现拾取不到的情况。
下面先科普一下xpath和css-selector
xpath: xpath (XML Path Language) 是一种在XML文档中查找信息的语言,可以用来定位网页中的元素。
xpath通过路径表达式来标识元素的位置,基本的语法有:
/ : 从根节点开始选择(绝对路径)
// :从任意位置开始选择(相对路径)
@ :选择属性
[] : 谓语条件筛选
如: //input[@name='first_name'] 就是选择name属性为first_name的input元素
css-selector: 在拾取元素中和xpath作用类似,通过模式匹配来选取DOM树的元素。
所以,设计器的查找路径就是通过以上几个方式来定位的,当出现拾取不到的情况下,我们可以自行使用F12,找到我们要定位的元素,通过对比设计器中的查找路径,来判断查找路径中有没有需要修改的地方。
拾取元素后可以在属性表中查看xpath,css-selector,id,tag,type这些属性,是rpa用于定位一个元素的属性
例子一:xpath/css-selector
有些元素属性里包含sessionid,时间戳或其他随机数,第一次拾取时会运行成功, 但第二次整体运行时就会引起失败,解决它的方法就是用*号取代掉路径中可变的部分, 或者直接在F12中获取该元素xpath的绝对路径。
ps:当不确定这个元素是不是有可变的路径时,可以拾取一次元素,再关闭打开网页拾取一次,对比两次拾取元素的属性信息有没有不同的
注意:如果自己修改了属性表中xpath的路径,要同步修改css-selector的路径,也可以直接保留其中之一,否则,会校验是否为同一个元素,如果不是,也会提示找不到元素
例子二:src属性
src属性指定了标签引用的外部资源文件的地址或路径,浏览器会根据该路径加载资源。
拾取时也要考虑src属性,部分原因如下:
它会触发外部资源的加载,导致页面布局和DOM结构发生变化
有些src属性由js动态生成,如果不注意解析执行逻辑,可能获取到的src并不准确。
笔者的实践:一次定位不到元素后把src属性删掉,就成功运行了。
例子三: iframe
当你走过前两个例子,明白了可以在xpath或css-selector上做文章时,iframe可以让你再次怀疑人生。 简单理解iframe就是可以用它将一个 HTML 文档嵌入在一个 HTML中显示。
在自动化操作想要定位到iframe里的元素,在我实践中是action属性:action属性可以指定当在该框架中提交表单时,接收和处理表单数据的页面地址。
在开发某个页面的RPA流程中,它的页面就是用了iframe元素和action属性,导致了在iframe里面的元素我全部都拾取不到, 解决方法就是在属性表中把action属性也加上。
为什么要加上action属性?
action会导致页面提交后跳转到另一个页面或框架。如果不考虑action,获取的元素可能会出现在跳转后的页面中,导致无法定位。
设置action后可以确保浏览器会完整地解析这个frame,构建可以获取元素的DOM树结构。
某些浏览器在解析并构建DOM树时,会优化掉没有action的空frame,这样就无法通过自动化方式获取到该frame中的元素。
其他简单的情况:
检查显示器的分辨率,分辨率太小也会导致元素不可见,导致拾取不到
检查网页的缩放,一般要在100%才能正常运行
推荐阅读