在搜索同级时使用 CSS 选择器而不是 XPath 定位器



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

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 选择器从上下文中的当前元素开始转到下一个兄弟姐妹。但是,还有其他选择吗?

对任何事情说"从不"是愚蠢的。我非常喜欢 CSS 选择器,因为通过 id 定位元素,CSS 选择器,几乎任何东西......比 XPath 快。但。。。与此同时,我们正在谈论几毫秒的差异。

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

我非常不喜欢很多人在 SO 上的定位器策略,因为 XPath 似乎是查找元素到愚蠢程度的 goto 方法。我见过人们只寻找一个id并使用XPath。我认为部分原因是您可以轻松获取 XPath,右键单击检查器中的元素并复制 XPath 并粘贴代码。我相信你知道,这样做的问题在于,有时(很多次?)会导致非常脆弱的XPath,但有些人/许多人不知道更好。

综上所述,我将向您指出W3C CSS选择器参考,也许您可以找到所需的内容。那里有一些兄弟组合器,但我没有你的 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
还有

另一种特定于量角器的解决方法 - 使用父元素的locator()并连接以创建子元素选择器:

this.filterTeamDropdown = $("filter-item-edit .dropdown button");
this.teams = this.filterTeamDropdown.$$(this.filterTeamDropdown.locator().value + " + ul li.dropdown-list-item")

相关内容

最新更新