Как перебрать и сохранить информацию из динамической таблицы с помощью Selenium в Python на сайте AngularJS - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь найти данные из динамической таблицы на веб-сайте, использующем AngularJS.Я использую Selenium для очистки сайта.

В настоящее время моя проблема заключается в том, что я не могу идентифицировать динамическую таблицу, поскольку в ней нет тегов.Кроме того, идентификаторы строк также имеют динамические имена в виде строк, что еще более усложняет ситуацию.Любая помощь приветствуется.

Я попытался выполнить поиск по ID / XPATH и добавить их в список элементов.Безуспешно.

Требуемая информация содержится в массивной таблице, динамически генерируемой с несколькими параметрами (Дата сбора):

<tctable id="tweb_EPVisitNumber_List_1">

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

<tccol layout-xs="column" class="layout-xs-column">
<div>
<span id="web_EPVisitNumber_List_1-row-0-item-CollectionDate-label" class="componentTableItemLabel hide-gt-xs ng-binding ng-scope">Collection Date
</span>
<span class="componentTableItem ng-scope">
<span id="web_EPVisitNumber_List_1-row-0-item-CollectionDate" class="ng-binding">17/01/2019
</span>
</span>
</div>
</tccol>

Идентификатор изменяется в динамическую строку по мере развития таблицы, например, следующие элементы в других столбцах / строках будут:

id="web_EPVisitNumber_List_1-row-1-item-CollectionDate" 
id="web_EPVisitNumber_List_1-row-2-item-CollectionDate"
id="web_EPVisitNumber_List_1-row-3-item-CollectionDate"

и т. Д.

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

Ответы [ 2 ]

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

До захватить все даты из всех элементов таблицы, сгенерированных , так как элементы угловые элементы, которые вам нужно вызвать WebDriverWait для видимость всех элементов, расположенных , и вы можете использовать следующее решение:

  • Использование XPATH:

    dates = []
    date_elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//tctable[starts-with(@id, 'tweb_EPVisitNumber_List_')]//span[contains(@class,'componentTableItemLabel') and normalize-space()='Collection Date']//following::span[1]/span[starts-with(@id, 'web_EPVisitNumber_List_')]")))
    for date_element in date_elements:
        dates.append(date_element.text)
    
  • Оптимизированный способ:

    dates = [date_element.text for date_element in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//tctable[starts-with(@id, 'tweb_EPVisitNumber_List_')]//span[contains(@class,'componentTableItemLabel') and normalize-space()='Collection Date']//following::span[1]/span[starts-with(@id, 'web_EPVisitNumber_List_')]")))]
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 29 января 2019

Вам нужно найти какое-то общее свойство элементов и создать локатор на его основе.Например, в данном примере все интересные span имеют "CollectionDate" в своих идентификаторах, но не имеют "-label" (он есть в заголовке столбца).
Так что xpath с этим будет:

//span[contains(@id, "CollectionDate") and not contains(@id, "-label")]

Еще одно наблюдение - все «интересные» из них span с в div, то есть в tccol, которые имеют id;за исключением первого, который является заголовком столбца:

//tccol/div/span[@id and not position()=1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...