Фреймворк робота: Как сортировать по

#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 изменения запущенного), вместо того, чтобы проходить молча с неожиданным поведением.