影刀RPA XPath语法入门:属性选择器精确定位元素
影刀RPA XPath语法入门:属性选择器精确定位元素
作者:林焱 | 适合人群:已经会基本元素捕获,但经常遇到元素失效的新手
什么情况用什么
你肯定遇到过这种情况:用影刀捕获器点了一下,元素捕获成功了,运行流程时却提示"找不到元素"。
重新捕获,再运行,又失败了。
这个问题98%的原因都是元素定位不够稳定。影刀默认捕获的元素,依赖的是HTML路径+几个属性值。一旦网页更新,路径变了,流程就挂了。
XPath属性选择器就是解决这个问题的一把刀——不依赖完整路径,只靠一个稳定的属性(比如id、class、name)就能定位到元素,网页怎么改都不怕。
什么情况该用属性选择器:
- 捕获的元素经常失效,需要反复修复
- 目标元素有明确的id或class属性
- 网页结构复杂,完整路径很长很脆弱
- 你需要定位的元素在iframe里面(属性选择器可以跨层级)
怎么做
第一步:打开Chrome开发者工具,找到目标元素的属性
- 用Chrome打开目标网页(比如百度首页)
- 按F12打开开发者工具
- 点左上角的元素选择器(箭头图标)
- 点一下网页上的目标元素(比如百度搜索框)
- 开发者工具的Elements面板会高亮显示这个元素的HTML代码
第二步:找到稳定的属性
看这段代码:
<inputid="kw"name="wd"class="s_ipt"value=""maxlength="255"autocomplete="off">这个搜索框有几个属性:id="kw"、name="wd"、class="s_ipt"。
哪几个是稳定的?
店群矩阵自动化突破运营极限!
id="kw"— 百度搜索框的id一直是kw,非常稳定,优先用name="wd"— 也稳定,但有些网页name会动态变化class="s_ipt"— 不太稳定,样式改了class就可能变
第三步:写出XPath属性选择器
语法很简单:
//标签名[@属性名='属性值']百度搜索框的XPath就是:
//input[@id='kw']解释一下:
//— 在整棵DOM树里搜索,不管元素在哪个层级input— 目标元素的标签名(从开发者工具里看到的)[@id='kw']— 筛选条件:id属性等于kw
第四步:在影刀里使用这个XPath
- 打开影刀RPA,新建一个PC端自动化应用
- 拖入「打开网页」指令,输入百度网址
- 拖入「网页点击」或「填写输入框」指令
- 在元素选择区域,点「XPath」选项卡
- 输入刚才写好的XPath:
//input[@id='kw'] - 点「校验元素」,如果提示成功,说明XPath写对了
实战案例:自动百度搜索并提取结果
完整流程:
1. 打开网页:https://www.baidu.com 2. 填写输入框(XPath://input[@id='kw']):"影刀RPA教程" 3. 点击元素(XPath://input[@id='su']) 4. 等待:3秒(等搜索结果加载) 5. 获取元素信息(XPath://div[@id='content_left']):获取整个结果区域的文本 6. 用「在控制台打印」指令输出结果这个流程的核心就是两个XPath:
//input[@id='kw']— 搜索框//input[@id='su']— 搜索按钮//div[@id='content_left']— 搜索结果容器
更复杂的例子:同时用多个属性定位
有时候一个属性不够用,元素没有唯一的id,但有多个属性组合起来是唯一的。
语法:
//标签名[@属性1='值1' and @属性2='值2']比如淘宝的某个商品链接:
<aclass="item-title"data-id="123456"href="//item.taobao.com/...">商品名称</a>XPath可以写成:
//a[@class='item-title' and @data-id='123456']实战踩坑:属性值里有空格或特殊字符怎么办
有一次我要定位一个按钮,它的class是"btn btn-primary submit-btn"(中间有空格)。我直接用//button[@class='btn btn-primary submit-btn'],死活定位不到。
查了半天发现:HTML里的class属性,浏览器会自动把多个空格合并成一个。但在XPath里,'btn btn-primary submit-btn'和'btn btn-primary submit-btn'(多个空格)是不同的字符串。
正确做法:用contains()函数:
//button[contains(@class,'btn-primary')]只要class属性里包含btn-primary这个字符串,就能定位到,不管前面后面还有什么其他class。
有什么坑
坑1:id是动态生成的,每次刷新都变
有些网站(尤其是Vue/React写的单页应用),元素的id是动态生成的,比如id="input_1234"、id="input_5678",每次刷新页面数字就变。
这种情况下用id属性写XPath会失败。
temu店群自动化报活动案例
解决方案:换一个稳定的属性,比如data-*开头的自定义属性,或者用contains()做模糊匹配。
坑2:同一页面上有多个相同属性的元素
比如一个列表页,每个商品标题的class都是item-title,用//div[@class='item-title']会定位到第一个,但不是你想要的那个。
解决方案:
- 加索引:
(//div[@class='item-title'])[3]— 定位到第3个 - 找父元素区分:
//div[@id='item-123']//div[@class='item-title']— 先定位到父元素,再找子元素
坑3:XPath写对了,但影刀还是找不到元素
最常见的原因是元素在iframe里面。
iframe是网页里的另一个网页,相当于俄罗斯套娃。XPath默认只在当前页面搜索,不会自动进入iframe。
解决方案:
- 先用影刀的「切换到iframe」指令
- 再使用XPath定位iframe里面的元素
- 操作完之后,用「切换回主页面」指令
坑4:页面还没加载完,XPath就去找元素了
XPath定位速度很快,但如果网页还在加载,元素还没出现,XPath就会报错。
解决方案:在XPath定位之前,加一个「等待元素出现」指令,设置超时时间(比如10秒)。
坑5:text()匹配对空格和换行特别敏感
//button[text()='确定']这种写法,要求按钮的文本内容完全等于"确定",多一个空格少一个换行都不行。
解决方案:用contains()://button[contains(text(),'确定')]
总结
XPath属性选择器是影刀RPA里最稳定的元素定位方法,核心语法只有一条://标签名[@属性名='属性值']。
这篇文章讲的是最基础的用法。下一篇会讲模糊匹配,应对那些属性值会动态变化的情况。
作者:林焱