Robot Framework如何在已获取的WebElement变量内查询指定xpath元素
Robot Framework遍历父元素查找子元素并定位序号解决方案
你写法失效的核心原因是:SeleniumLibrary不支持直接将WebElement对象与xpath字符串拼接作为定位器,你拼接后的定位器会被转为WebElement的toString字符串,完全不符合定位规则,自然找不到元素。
方案1:使用SeleniumLibrary原生关键字(推荐)
核心注意两点:
- 子元素xpath必须以
.开头,代表从当前父元素节点开始查询,而非从整个文档根节点查询 - 调用元素判断关键字时通过
parent参数指定父元素,再搭配状态判断关键字即可完成检查
完整代码示例:
# 先获取所有目标父元素 ${elements} = Get WebElements xpath=//li[@class='product-item--row js_item_root '] # 初始化目标序号变量,默认从1开始计数,需要从0开始可自行调整逻辑 ${target_index} Set Variable ${0} FOR ${i} IN RANGE ${elements.__len__()} ${current_item} Set Variable ${elements}[${i}] # 判断当前元素内部是否存在可见的目标子元素,存在返回True,不存在返回False不报错 ${is_exist} Run Keyword And Return Status Element Should Be Visible xpath=.//*[contains(text(), 'BargainsKing')] parent=${current_item} IF ${is_exist} # 序号从1开始就+1,从0开始直接赋值${i}即可 ${target_index} Set Variable ${i + 1} BREAK END END # 输出最终结果 Log 目标元素的序号为:${target_index}
方案2:低版本SeleniumLibrary兼容写法
如果你的SeleniumLibrary版本不支持parent参数,可以直接通过执行JS脚本实现判断:
${is_exist} Execute Script ... return document.evaluate(".//*[contains(text(), 'BargainsKing')]", arguments[0], null, XPathResult.BOOLEAN_TYPE, null).booleanValue ... ARGUMENTS ${current_item}
关于innerHTML执行xpath查询的问题
可以实现,但完全没必要走这个弯路,操作逻辑是需要先把innerHTML字符串解析为DOM对象,再基于DOM对象执行xpath查询,反而额外增加了性能开销和代码复杂度,直接基于现有WebElement查询是最优方案。
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

