#robotframework
#robotframework
Вопрос:
У меня есть веб-страница с выпадающим списком для сортировки списка по цене, названию,… Список состоит из многих страниц, поэтому сначала мне нужно получить все элементы, а после я отсортирую по и проверю правильность элементов. Верно?
Я пытаюсь сделать это и перейти по всем страницам и получить все элементы. Но это касается только элементов с первой страницы. Я совершенно новичок в Robot framework. У кого-нибудь есть предложения, как я могу это сделать?
${name_list_actual} Create List
${cnt_pages}= Get Element Count //div[@class='container index-new-p']/div/nav[@class='text-center']/ul/li/*
Log To Console ${cnt_pages}
:FOR ${n} IN RANGE 1 ${cnt_pages}
Click link //div[@class='container index-new-p']/div/nav/ul/li[${n}]/a
${cnt}= Get Element Count //*[@class="title"]/*
:FOR ${i} IN RANGE 1 ${cnt}
${get_names} Get Element Attribute //table[@class='result-table']/tbody/tr[${i}]/td/div/div[2]/div/a text
Append To List ${name_list_actual} ${get_names}
${get_names}= Select All From List //table[@class='result-table']/tbody/tr[${i}]/td/div/div[2]/div/a
Log To Console ${name_list_actual}
Continue For Loop
Большое спасибо
Комментарии:
1. Можете ли вы объяснить, с какой проблемой программирования вы столкнулись?
2. Похоже, вы пытаетесь встроить свой
FOR
цикл в предоставленный вами фрагмент кода. Это не поддерживается в robotframework и должно быть извлечено в его собственное ключевое слово
Ответ №1:
Прежде всего, по отступу вашего примера кода похоже, что вы выполняете вложенные циклы for — внешний для изменения страниц и внутренний, который будет получать текст в каждой строке. Дело в том, что Robot Framework не поддерживает вложенные циклы for — смотрите документацию.
Что произошло при выполнении, так это то, что первый цикл (разбивка на страницы) выполнялся всего с двумя инструкциями и завершился:
Click link //div[@class='container index-new-p']/div/nav/ul/li[${n}]/a
${cnt}= Get Element Count //*[@class="title"]/*
Затем все остальные были выполнены как часть второго.
Решением было бы ввести ключевое слово «Получить все значения в таблице», которое будет содержать внутренний цикл, и вызвать его в текущем внешнем цикле, который будет разбит на страницы.
Еще одна проблема — вы используете IN RANGE
, передавая 1 как начало и ${cnt}
как конец; если у него было значение 4, вы, вероятно, ожидаете, что переменная отслеживания получит все значения от 1 до 4.
Однако range работает с первым аргументом включительно и до второго аргумента, но не доходит до него; таким образом, он охватывает диапазон от 1 до 3. Чтобы спасти это, вам нужно было бы установить верхнюю границу на cnt 1, например ${cnt 1}
.
Мелочи:
У вас есть оператор, который находится внутри блока цикла, но не имеет префикса
:
${get_names}= Select All From List //table[@class='result-table']/tbody/tr[${i}]/td/div/div[2]/div/a
Я удивлен, что это не выдало вам синтаксическую ошибку — это эффективно прерывает цикл, и фреймворк должен жаловаться, что следующие строки имеют префикс, как будто в цикле, но одна из них не запущена.
—
Когда вы меняете страницы одним щелчком мыши, вы не убедитесь, что пользовательский интерфейс загрузил данные для новой страницы. Если это происходит с помощью вызовов ajax, вы вполне можете работать с данными предыдущей страницы, думая, что это новая — щелчок selenium возвращает управление очень быстро, и выполняются операнды для получения текста — в то время как пользовательский интерфейс все еще ожидает новых данных и отображает предыдущие.
—
В RF версии 3.1 синтаксис цикла отличается — члены блока не имеют префикса с
, и он закрывается END
оператором.
Я бы предложил перейти на него — а) текущий в конечном итоге устареет, и б) в новом вложенность была бы помечена как синтаксическая ошибка (вы запускаете новый цикл без END
изменения запущенного), вместо того, чтобы проходить молча с неожиданным поведением.