Как ограничить Selenium Webdriver для просмотра только строк, видимых динамической таблицей - PullRequest
0 голосов
/ 07 ноября 2018

Я немного не в себе, но я сделаю все возможное, чтобы объяснить. Я поставлю свой вопрос наверху, а затем объясню ниже:

"Как мне сказать Selenium читать только результаты, которые видны в браузере, а не то, что содержится в источнике страницы?"

У меня есть веб-страница, для которой я создаю автоматизированные тесты с использованием Selenium WebDriver. На странице есть таблица результатов, обычно около 50 или около того. Когда пользователь заходит на страницу, отображаются все результаты. Если они вводят текст в поле поиска, они могут отфильтровать результаты. Ничего фантастического. Моя цель - убедиться, что количество результатов, возвращаемых таблицей, соответствует ожидаемому числу.

Код, который я использовал для подсчета количества результатов, таков:

public int searchTableNumberOfMatchesOneColumn(String tableIdParam, int columnToSearchParam, String valueToFindParam){
      int numberOfMatchesFound = 0;

      WebElement table_element = driver.findElement(By.id(tableIdParam));
      List<WebElement> tr_collection=table_element.findElements(By.xpath("id('" + tableIdParam + "')/tbody/tr"));

      int row_num = 1;
      int col_num = 1;
      for(WebElement trElement : tr_collection)
      {
         List<WebElement> td_collection=trElement.findElements(By.xpath("td"));
         col_num=1;
         for(WebElement tdElement : td_collection)
         {
            if(col_num == columnToSearchParam && tdElement.getText().equals(valueToFindParam)){
               numberOfMatchesFound++;
            }
            col_num++;
         }
         row_num++;
      }

      return numberOfMatchesFound;
   }

Проблема, с которой я сталкиваюсь, заключается в следующем: этот код всегда возвращает полный размер таблицы, 50 или около того, а не количество результатов, видимых на экране. Я открыл источник страницы для веб-страницы до и после поиска, чтобы сделать сравнение, и они идентичны. Таким образом, в то время как то, что видимо пользователю, изменяется, то, что хранится в источнике страницы, нет.

Я пытался использовать JavascriptExecutor для поиска innerHTML, но он возвращает те же результаты. (Как и в случае с driver.findElement (By.tagName ("body")). GetText ();

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Просто используйте оператор NOT в xpath.

предположим, что у вас html таблица, как следует

 <table id="myTable">
    <tr style="display:block">
        <td>A1</td>
        <td>B1</td>
        <td>C1</td>
    </tr>
    <tr style="display:none">
        <td>A1</td>
        <td>B1</td>
        <td>C1</td>
    </tr>
</table>

Следующий xpath вернет все видимые tr

//table[@id='myTable']//tr[not(@style='display:none')]

Образец изображения

enter image description here

0 голосов
/ 13 ноября 2018

Поведение, которое вы наблюдаете, что код ... всегда возвращает полный размер таблицы, 50 или около того, а не количество результатов, видимых на экране ... в значительной степени ожидаемый результат.

Если тестируемое приложение (AUT) не реализовано с использованием Ленивая загрузка , это скрытое благословение , если вся таблица присутствует в HTML DOM до того, как Клиент (т. Е. Web Browser ) вернет элемент управления экземпляру WebDriver в 'document.readyState' равно "complete" достигается.

Соответствующее обсуждение можно найти в Есть ли у нас какие-либо общие функции, чтобы проверить, полностью ли загружена страница в Selenium


Элемент Visiblity

Элемент Visible подразумевает, что элемент присутствует в DOM страницы и является видимым. Видимость означает, что элемент не только отображается, но и имеет высоту и ширину, превышающие 0.

Примечание : Элемент Visible не обязательно означает, что элемент интерактивный / clickable .


ВЭкран

Окно просмотра - видимая область пользователя веб-страницы. Чтобы взаимодействовать или , щелкните элемент, элемент должен находиться в области просмотра.


Решение

Если вы хотите ограничить коллекцию, т. Е. List только элементами в Окно просмотра , возможное решение будет выглядеть следующим образом: ExpectedConditions() классы:

  • numberOfElementsToBe() - ожидание проверки количества веб-элементов с заданным локатором.
  • numberOfElementsToBeLessThan() - ожидание проверки количества WebElements с заданным локатором меньше определенного числа
  • numberOfElementsToBeMoreThan() - ожидание проверки количества веб-элементов с указанным локатором, превышающим заданное число
0 голосов
/ 07 ноября 2018

Ну, я просто дам вам пример HTML и код, который идет с ним, и вы можете адаптировать его самостоятельно.

Пример таблицы

<table id="myTable">
    <tr>
        <td>A1</td>
        <td>B1</td>
        <td>C1</td>
    </tr>
    <tr style="display:none">
        <td>A1</td>
        <td>B1</td>
        <td>C1</td>
    </tr>
</table>

Пример кода

public int searchTableNumberOfMatchesOneColumn(String tableIdParam, int columnToSearchParam, String valueToFindParam)
{
    return driver.findElements(By.xpath("//table[@id='" + tableIdParam + "']//tr/td[" + columnToSearchParam + "][.='" + valueToFindParam + "']")).stream().filter(e -> e.isDisplayed()).collect(Collectors.toList()).size();
}

В основном это использует XPath для поиска ТАБЛИЦЫ с указанным идентификатором, который содержит TD в столбце X (прилагается), который также содержит текст Y (также прилагается). Этот XPath вернет ALL элементов, а не только видимые, поэтому нам нужно отфильтровать список по тому, что видно. Мы можем сделать это, используя Java stream() и filter(). См. эту ссылку для получения дополнительной информации, включая ссылки на документы внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...