#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-му контейнеру? являются ли вторая () или третья () допустимыми функциями, поскольку они не работают у меня?