Как вы ожидаете элемента в динамической веб-таблице? - PullRequest
0 голосов
/ 10 января 2019

Я ввожу значение в поле поиска, а затем веб-таблица начинает загружать его значения на основе поиска. Я не перехожу на новую страницу и сама страница освежающий, то есть мы все еще на одной странице. Я хочу дождаться загрузки значений таблицы без необходимости специально говорить «подождите Х секунд», я хочу получить элементы, как только они загрузятся. Как мне это сделать?

В идеале все значения в таблице должны быть загружены, но на данный момент я просто пытаюсь дождаться первого элемента в таблице:

WebElement element =  (new WebDriverWait(driver, 10)).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"TableBox-react-component-2dd9bf99-63cb-4c78-9e0d-bed81526e7e5\"]/div/div[2]/table/tbody/tr[1]/td[1]/a")));

Это просто приводит к тому, что через 10 секунд выдается ошибка, так как он не может найти элемент. Это с Selenium 2, хромедрайвер.

Заранее спасибо!

EDIT:

Структура HTML:

<head>...</head>
<body class="class-name" style>
  <div class="main">...</div>
  <script src="src-of-script"></script>
  <div class>
    <header class="page-header" uk-grid uk-panel uk-panel-box">...</header>
    <div class="teaching">
      <script type="application/json" class="js-react-on-rails-component" data-component-name="TableBox" data-dom-id="TableBox-react-component-*dynamic id*">
      <div id="TableBox-react-component-*dynamic id*>
        <div data-test="table-box" class="search-table-container">...</div>

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Учитывая, что id элементов являются динамическими - их суффиксы меняются при каждой загрузке страницы, вы можете попробовать использовать локатор, основанный на их постоянных частях. Для этого функция xpath contains() очень удобна. Этот локатор выберет самый последний <div> в вашем примере:

//div[@class="teaching"]/div[contains(@id, "TableBox-react-component")]/div[@data-test="table-box"]

Соответствующим / возвращаемым элементом будет <div> с атрибутом data-test, равным «table-box» (самый правый в выражении), родительским элементом которого является <div> с атрибутом id имеющий в своем значении «TableBox-реагирующий компонент». У <div> с идентификатором должен быть родитель <div>, чье значение класса - «Обучение».
Может потребоваться пара следов и ошибок, пока вы не получите точные постоянные части атрибутов, но идея здесь.

Как только вы определитесь с этой частью локатора, вам нужно добавить элементы к <table> и <td> к нему, чтобы добраться до фактического целевого элемента html.

0 голосов
/ 10 января 2019

Вы можете использовать try и catch с функцией рекурсии. Создайте метод с блоком try и catch, где в блоке try положите Thread.sleet (секунд); а затем вызвать findElement. В перехвате вызовите функцию снова. У меня была проблема с тостовым сообщением, которое генерируется динамически в течение указанного времени, и оно решено с помощью этого подхода

...