前端测试 playwright 中使用 xpath 定位元素遇到的奇怪问题

Ellison · 2024年06月22日 · 最后由 Eric Chan 回复于 2024年06月27日 · 4583 次阅读

表达式 1:
//main/div/div/div[2]/div[2]/div[3]/table/tbody/tr/td/div[@class='cell']/span[contains(text(),'测试勿动!!!!')]/../../../td[6]/div/div/button[2]
表达式 2:
//main/div/div/div[2]/div[2]/div[5]/div[2]/table/tbody/tr[descendant-or-self::*//text()[contains(., '测试勿动!!!!')]]/td[6]/div/div/button[2]

不同的表达式,在调试窗口都可以定位到唯一的元素"发布"按钮。
但是放到脚本里运行,发现只有第二种能成功,第一种会卡住。

=======================================================
刚开始以为是表达式/span[contains(text(),'测试勿动!!!!')]/../../../td[6]
和 /span[contains(text(),'测试勿动!!!!')]/../../../td[6] 写法不同,浪费了很长时间。
经过排查及不停的尝试,最终发现是组件在窗口缩放的时候,会再加一层操作界面。
表达式 1 刚好是在下边的那一层,表达式 2 是上边的那一层。
所以造成脚本执行点击底下那一层点击不了,会卡住。
遇到这种情况只能一个一个试吗?大佬们有没有好的建议

共收到 10 条回复 时间 点赞

不是万不得已,就放弃 xpath 定位吧,你这写法没有任何可读性啊

现在的前端页面都是调用的现成组件,这些组件也一直处于更新迭代的阶段,以后维护会看花眼

你这样写,一样可以定位到吧://span[contains(text(),'测试勿动!!!!')]/../../../td[6]

建议别用 xpath,后期不好维护,按钮可以试试用 get_by_role(role="button", name="发布") 看能不能定位到唯一值,要是不行再组合一下 xpath

Eric Chan 回复

取不到,是列表,每一行后边都有发布按钮。发完了顺序还会变动

那现在用什么方法最好?

7楼 已删除
杨腾 回复

这样定位到不是唯一的


xpath 能不用盡量不用,其實 playwright 已經提供了很豐富的定位方法了,也支持嵌套之類的,但文檔資料什麽的確實也少,得自己多花時間研究

Ellison 回复

快 7 年没碰过 UI 自动化了,随便应付得了,这种自动化都做不久

Ellison 回复

那可以通过 get_by_text 定位到列表的唯一标识列,比如标题名称,然后通过标题名称列和按钮列的相对位置关系定位到该行的按钮;最好封装一个函数,传唯一标识列的文字内容就可以自动定位到该行的发布按钮

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册