“定位器找到了多个元素”警告。

37

在我的一个测试中,我正在使用 CSS 选择器 定位一个元素:

element(by.css("ul.nav button"))

查询结果匹配多个元素,但由于我只需要第一个元素,所以选择器可以使用。

问题是,protractor 抛出了一个警告:

警告 - 定位器 By.cssSelector("ul.nav button") 找到多个元素 - 将使用第一个结果

有没有可能抑制这个警告?换句话说,我该如何让 protractor 知道我已经意识到这个问题,并且不想再看到这个警告了?


使用 protractor 开发版本(直接从主分支安装)。

4个回答

68

试试这个:

element.all(by.css("ul.nav button")).first()
基本上,这告诉 Protractor 您已经知道有多个元素,并且您只想要第一个元素(就像您在问题中说的那样)。
基本上,这会让 Protractor 知道你已经知道有不止一个元素,而你只是想要第一个元素(就像你在问题中所说的那样)。

可以!不过,作为额外的奖励和好奇心,知道如何消除警告可能会很有用,你有什么想法吗?谢谢。 - alecxe
3
如果有一个,它会在这里:(https://github.com/angular/protractor/blob/master/docs/referenceConf.js)。不过我没看到类似的内容,我认为原因是因为使用非特定的定位符会导致测试非常脆弱。 - Isaac Lyman
是的,恐怕我只能通过设置适当的 logLevel 来关闭它,但由此也会关闭其他警告,这并不好。但是,我完全同意你的最后一点,对我来说很有道理。再次感谢你的帮助。 - alecxe
你回答了我的几个问题,所以我很高兴能够回报你。 - Isaac Lyman

6
警告是有原因的。你把测试和数据联系得太紧密了。选择器太普遍了,你应该更具体。可以通过使用 element(by.css("ul.nav button:nth-child(1)")) 或者不同的搜索范围来实现。Protractor 测试不应该测试样式或 dom,它们应该测试业务逻辑。

4
经过深思熟虑,我决定对此答案进行贬低评分,原因如下:1)它对问题提出了无根据的指责,考虑到问题的简单性,这是完全没有必要的;2)虽然给出的解决方案可能有效,但它依赖于一个假定的DOM结构,而该结构在问题中没有说明;3)回答声称给出的解决方案比OP的代码具有特定优势,但实际上它并没有这些优势;4)除了代码示例外,回答几乎没有别的意义,只是一些不合逻辑的说教。 - Isaac Lyman

4

更少的代码:

$$("ul.nav button").first()

这太棒了!! - coderpc

2
不要低估xpath。你可以用它解决成千上万的问题,包括这个问题。
let elem = element(by.xpath('(//div//a)[3]'))

您可以指定要使用的元素数量。请记住,数字从1开始,而不是通常在js中的0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接