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