Найдено более одного элемента для предупреждения локатора

В одном из моих тестов я нахожу элемент с помощью CSS selector:

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

Запросу соответствует несколько элементов, но, поскольку мне нужен только первый, селектор меня устраивает.

Проблема в том, что protractor выдает предупреждение:

ВНИМАНИЕ - для локатора найдено более одного элемента By.cssSelector("ul.nav button") - будет использоваться первый результат

Можно ли отключить предупреждение? Другими словами, как мне сообщить protractor, что я знаю о проблеме и не хочу, чтобы это предупреждение больше отображалось?


Использование версии разработки protractor (устанавливается непосредственно из основной ветки).


person alecxe    schedule 11.02.2015    source источник


Ответы (4)


Попробуйте это вместо этого:

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

По сути, это сообщает Protractor, что вы уже знаете, что существует более одного элемента, и вам просто нужен первый (как вы сказали в своем вопросе).

person Isaac Lyman    schedule 11.02.2015
comment
Это работает! Однако в качестве бонуса и из любопытства было бы полезно узнать, можно ли отключить предупреждение, есть идеи? Спасибо. - person alecxe; 12.02.2015
comment
Если бы он был, он был бы здесь. Однако я не вижу ничего подобного и думаю, что причина в том, что неспецифические локаторы делают тесты очень хрупкими. - person Isaac Lyman; 12.02.2015
comment
Да, боюсь, я могу отключить его, только установив соответствующий logLevel, который, в свою очередь, отключит другие предупреждения, что нехорошо. Но я полностью согласен с вашим последним пунктом, имеет смысл для меня. Еще раз спасибо за помощь. - person alecxe; 12.02.2015
comment
Вы ответили на пару моих вопросов, так что я рад, что смог отблагодарить вас. - person Isaac Lyman; 12.02.2015

Предупреждение есть по причине. Вы слишком тесно привязали свои тесты к своим данным. Селектор слишком общий, и вы должны быть более конкретными. Либо сказав element(by.css("ul.nav button:nth-child(1)")), либо измените область поиска. Тесты транспортира не должны тестировать стиль или дом, они должны тестировать бизнес-логику.

person Jon    schedule 15.04.2015
comment
После долгого размышления я отрицаю этот ответ, потому что: 1) он выдвигает обвинение против ОП, которое, учитывая простоту вопроса, совершенно необоснованно; 2) данное решение, хотя и может работать, зависит от предполагаемой структуры DOM, которая не указана в вопросе; 3) ответ утверждает, что данное решение имеет определенные преимущества перед кодом ОП, но на самом деле у него этих преимуществ нет; и 4) за пределами примера кода ответ сводится к не более чем нелогичности и проповеди. - person Isaac Lyman; 24.05.2017

Меньше кода:

$$("ul.nav button").first()
person Yago    schedule 09.08.2016
comment
Это замечательно!! - person coderpc; 20.01.2021

Не стоит недооценивать xpath. С ним можно решить тысячи проблем, в том числе и эту

let elem = element(by.xpath('(//div//a)[3]'))

Вы можете указать количество используемых элементов. Имейте в виду, что числа начинаются с 1, а не с 0, как обычно в js.

person Sergey Pleshakov    schedule 09.02.2021