一尘不染

在同级中搜索时,使用CSS选择器代替XPath定位器

selenium

当前,我具有以下页面对象字段:

this.filterTeamDropdown = $("filter-item-edit .dropdown button");
this.teams = this.filterTeamDropdown.all(by.xpath("following-sibling::ul//li[contains(@class, 'dropdown-list-item')]"));

有没有办法替换该teams字段的XPath定位器,而是使用CSS选择器?


其动机来自样式指南建议不要使用XPaths

据我了解,从上下文中的当前元素开始,不可能有一个CSS选择器进入下一个同级对象。但是,还有其他选择吗?


阅读 300

收藏
2020-06-26

共1个答案

一尘不染

从不对任何事情说是愚蠢的。我强烈支持CSS选择器,因为按ID,CSS选择器等几乎所有内容来查找元素…比XPath快。但是…同时我们正在谈论几毫秒的差异。

XPath可以完成某些其他定位器方法无法做的事情。我想到的一个示例是A通过包含的元素文本查找一个元素(除外)。除此之外,当ID不起作用时,我通常会坚持使用CSS选择器。

我强烈不喜欢许多人对SO的定位策略,因为XPath似乎是查找元素的傻瓜式方法。我见过人们只是在寻找ID和使用XPath。我认为部分原因在于您可以轻松获得XPath,右键单击检查器中的元素,然后复制XPath并粘贴到代码中。我确定您知道,这样做的问题是有时(很多次?)会导致XPath非常脆弱,但是有些/很多人对此并不了解。

综上所述,我将为您提供W3C CSS
Selector参考,也许您可​​以找到所需的内容。那里有一些同级组合器,但是我没有您的HTML,所以我不知道它们中哪一个可以工作。

https://www.w3.org/TR/selectors/#selectors

https://www.w3.org/TR/selectors/#adjacent-sibling-
combinators


我刚刚阅读了您的问题下方的一些评论,并看到您已经了解+组合器。是否有某些原因无法将初始定位器CSS与XPath转换后的字符串一起使用?我不知道这是否有效/可用,但是在将XPath转换为CSS选择器之后,我将您在代码中提供的两个定位符组合在一起。

filter-item-edit .dropdown button + ul li.dropdown-list-item
2020-06-26