RPA机器人| 网页元素拾取不到排查笔记原创
金蝶云社区-路边明
路边明
1人赞赏了该文章 1,153次浏览 未经作者许可,禁止转载编辑于2023年10月13日 16:47:26

在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,找到我们要定位的元素,通过对比设计器中的查找路径,来判断查找路径中有没有需要修改的地方。

image.png

拾取元素后可以在属性表中查看xpath,css-selector,id,tag,type这些属性,是rpa用于定位一个元素的属性


例子一:xpath/css-selector

有些元素属性里包含sessionid时间戳或其他随机数,第一次拾取时会运行成功, 但第二次整体运行时就会引起失败,解决它的方法就是用*号取代掉路径中可变的部分, 或者直接在F12中获取该元素xpath的绝对路径。


ps:当不确定这个元素是不是有可变的路径时,可以拾取一次元素,再关闭打开网页拾取一次,对比两次拾取元素的属性信息有没有不同的


注意:如果自己修改了属性表中xpath的路径,要同步修改css-selector的路径,也可以直接保留其中之一,否则,会校验是否为同一个元素,如果不是,也会提示找不到元素 


例子二:src属性 

src属性指定了标签引用的外部资源文件的地址或路径,浏览器会根据该路径加载资源。

拾取时也要考虑src属性,部分原因如下:

  1. 它会触发外部资源的加载,导致页面布局和DOM结构发生变化

  2. 有些src属性由js动态生成,如果不注意解析执行逻辑,可能获取到的src并不准确。

image.png

笔者的实践:一次定位不到元素后把src属性删掉,就成功运行了。 



例子三: iframe

当你走过前两个例子,明白了可以在xpath或css-selector上做文章时,iframe可以让你再次怀疑人生。 简单理解iframe就是可以用它将一个 HTML 文档嵌入在一个 HTML中显示。   


在自动化操作想要定位到iframe里的元素,在我实践中是action属性:action属性可以指定当在该框架中提交表单时,接收和处理表单数据的页面地址。


在开发某个页面的RPA流程中,它的页面就是用了iframe元素和action属性,导致了在iframe里面的元素我全部都拾取不到, 解决方法就是在属性表中把action属性也加上。

为什么要加上action属性?

  1. action会导致页面提交后跳转到另一个页面或框架。如果不考虑action,获取的元素可能会出现在跳转后的页面中,导致无法定位。

  2. 设置action后可以确保浏览器会完整地解析这个frame,构建可以获取元素的DOM树结构。

  3. 某些浏览器在解析并构建DOM树时,会优化掉没有action的空frame,这样就无法通过自动化方式获取到该frame中的元素。




其他简单的情况:

  1. 检查显示器的分辨率,分辨率太小也会导致元素不可见,导致拾取不到

  2. 检查网页的缩放,一般要在100%才能正常运行




赞 1