目前,我有以下页面对象字段:
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")