Повторите список веб-элементов в таблице и подтвердите, что каждая строка равна

#java #selenium

Вопрос:

Моя цель состоит в том, чтобы повторить список веб-элементов (сгенерированный с помощью фильтра) в таблице, распределить его по нескольким страницам и утверждать, что каждая строка в этих веб-элементах равна заданной строке за один шаг.

  • Эти веб-элементы состоят из строк (1 веб-элемент = 1 строка), размещенных в столбце таблицы.
  • Все эти строки равны.
  • Их данные-тест совпадают.
  • Эти веб-элементы распределены по нескольким страницам (динамическим).
  • Цикл завершится при достижении последней страницы, которая содержит кнопку, текст атрибута которой становится отключенным (при отображении последней страницы).

    Вот что я начал писать, но в данный момент я немного застрял. Если вы можете посоветовать мне, как продолжать дальше, я действительно благодарен. На данный момент я получаю эту ошибку, когда выполняю тест.

 1. Tests in error:

  stale element reference: element is not attached to the page document
 
  2.  Not sure how to integrate the assert.

 

Фактический код:

     By nextPageBtn = By.xpath("//*[@data-testid='asd']");

    By disabledNextPageBtn = By.xpath("//*[@data-testid='asdf']");

    By filterValue = By.xpath("//*[@data-testid='asdf1']");
    

    public List<String> sameFilterResultIsDisplayedForAllRows() {

        List<WebElement> filterResultsList = new ArrayList<WebElement>();
        List<String> stringsFromFilterResultsList = new ArrayList<String>();

        boolean disabledNext = false;

        do {
            click(driver, nextPageBtn);

            filterResultsList.addAll(driver.findElements(filterValue));

            try {
                getValueFromSomeAttribute(driver, disabledNextPageBtn,
                        "randomElementAttribute");
                disabledNext = true;

            } catch (Exception e) {

            }


        } while (disabledNext == false);


        for (WebElement filterResultsList) {
            System.out.println(a.getText());

            try {
                stringbookings.add(a.getText());
            } catch (Exception e) {

            }

        }

        return stringsFromFilterResultsList;
    }


The assert would be something like this:

    @Then("the results filtered for all rows contain value {string}")
    public void expectedFilteredValues(String expectedFilteredValueString) {

    String expectedFilteredResu<
    expectedFilteredResult = 'randomString';

    List<String> actualFilteredValues = javaMethods.sameFilterResultIsDisplayedForAllRows();

    Assert.assertEquals(expectedFilteredResult, actualFilteredValues);
 

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

1. устаревший элемент предполагает, что DOM все еще обновляется при использовании одной из ссылок на веб-элемент filterResultsList. Либо поймайте эти устаревшие ссылки на элементы и повторно получите список, если он будет пойман (активируйте и повторите вызов), либо добавьте достаточно длительный сон после щелчка… Устаревший элемент будет выбрасываться при вызове метода по этой ссылке на веб-элемент. (В данном случае, я думаю, это «a.getText()»… но код там немного мутноват.

Ответ №1:

Проблема заключалась в addAll(), вероятно, из-за этого:

«Поведение этой операции не определено, если указанная коллекция изменяется во время выполнения операции. (Обратите внимание, что это произойдет, если указанная коллекция является этим списком и она непустая.)»

Мне пришлось использовать add () и создать вторичный массив в цикле for.

для (элемент WebElement : элементы) { stringsFromFilterResultsList.add(bookingTypeElement.getText()); }

Тогда утверждение выглядит следующим образом:

Список список = javaMethods. Один и тот же фильтррезультатно отображен для всех строк();

     for (int i = 0; i < list.size(); i  ) {
        Assert.assertEquals(expectedValue, list.get(i));
    }