выборка элемента из 2-го элемента транспортира массива

#selenium #protractor

#selenium #транспортир

Вопрос:

У меня есть 4 контейнера на странице, которые идентичны. Я собрал их все в массив. Теперь каждый блок контейнера содержит некоторые элементы, которые также идентичны. Я хочу извлечь 2-й элемент из 1-го контейнера. Ниже то, что я использовал для извлечения моего контейнера, и оно работает нормально:

 var pageContent = element(by.css('[class="main-content"]'));
expect(pageContent.all(by.css('.modularBoxContent')).count()).tobe(4);
  

Теперь, если я хочу получить количество всех элементов с классом в качестве контейнера LabelText insider modular box, я могу сделать это, используя ниже:

  expect(pageContent.all(by.css('.modularBoxContent')).all(by.css('[class="labelText"]')).count()).tobe(10);
  

Но это дает мне LabelText, присутствующий во всех 4 контейнерах. Я хочу получить количество LabelText только в первом контейнере или получить текст первого LabelText в первом контейнере. Я попробовал приведенный ниже код, но он не работает и выдает сообщение об ошибке

Ошибка типа: this.PageContent.get не является функцией

 expect(pageContent.get(0).all(by.css('.modularBoxContent')).all(by.css('[class="labelText"]')).count()).tobe(3);
  

Я также пробовал ниже, но это тоже не работает.
Для этого также получаю ту же ошибку, что и выше.

  expect(pageContent.all(by.css('.modularBoxContent')).get(1).all(by.css('[class="labelText"]')).get(0).getText()).tobe(3);
  

Может кто-нибудь, пожалуйста, предложить правильное использование?

Комментарии:

1. Можете ли вы уточнить, что вы подразумеваете под «это не работает»? Есть ли ошибка? Вы извлекаете неправильные элементы? и т.д.

2. @Gunderson добавил сообщение об ошибке в мой пост. Я получаю сообщение об ошибке, в котором указано, что get не является функцией. Более того, я не думаю, что это правильный подход к извлечению элемента, поэтому я не уверен.

3. Я. Вы не можете вызвать .get() один элемент, только массив элементов. Если бы это было var pageContent = element.all(by.css('[class="main-content"]')); , это сработало бы. Итак, все ли 4 основных контейнера имеют класс main-content ?

4. ДА. Это верно. Все они находятся в разделе main-content

Ответ №1:

Я думаю, это должно сработать для вас, давайте попробуем это. Поскольку все контейнеры имеют один и тот же класс, создайте массив с .all() и используйте .get() для извлечения нужного индекса.

 var pageContent = element(by.css('.main-content'));
var firstContainer = pageContent.all(by.css('.modularBoxContent')).first(); // or could have used .get(0);
  

Как только ваш первый контейнер успешно идентифицирован, теперь вы просто вызываете цепочку locator, чтобы найти все дочерние элементы под ним. Поскольку вы сказали, что хотите поместить второй элемент в первый контейнер, мы будем использовать .get(1) (1 — это индекс, поэтому это второй элемент в массиве).

 var secondChild = firstContainer.all(by.css('[class="labelText"]')).get(1);
  

И, к вашему сведению, многое из этого, вероятно, можно было бы переработать, чтобы сделать короче, если бы вы захотели. Например, вы можете связать свои вызовы CSS в цепочку, нет необходимости разделять их:

Приведенный выше код должен быть таким же, как этот:

 var firstContainer = element.all(by.css('.main-content .modularBoxContent')).first();
var secondChild = firstContainer.all(by.css('.labelText')).get(1);
  

Комментарии:

1. Я думаю, что есть некоторая путаница. У меня есть только 1 элемент с class = .main-content . Теперь под этим у меня есть разные контейнеры с тем же именем и классом, что и modularBoxContent и под этим у меня есть разные метки с тем же классом, что и .labelText Я хочу получить количество .labelText под каждым контейнером, а также извлечь 1-й LabelText из 1-го контейнера.

2. var firstContainer = element.all(by.css('.main-content')).first(); не даст мне первый контейнер, поскольку класс контейнера является .modularBoxContent

3. Я использовал приведенный ниже код, но он не работает var firstcontainer = element.all(by.css('.modularBoxContent')).first(); expect(firstContainer.all(by.css('.labelText')).count()).tobe(10); Выдает ошибку с указанием Expected 0 to be 10

4. @NewWorld О, хорошо, я немного обновил свой ответ (снова посмотрите на firstContainer locator). Если я правильно понимаю, .modularBoxContent это все контейнеры, поэтому вызов .all() и .first() далее по этому должен дать вам то, что вы хотите?

5. Спасибо. Я думаю, что большая часть этого сработала, но я не уверен, как получить доступ ко 2-му или 3-му контейнеру? являются ли вторая () или третья () допустимыми функциями, поскольку они не работают у меня?