Элемент имеет идентификатор в режиме проверки, но не в необработанном виде HTML - PullRequest
0 голосов
/ 29 февраля 2020

В настоящее время я работаю над небольшим веб-скриптом с Python и Selenium.

Я пытаюсь получить некоторую информацию из таблицы, которая в режиме проверки имеет определенный идентификатор. Однако, когда я открываю страницу как raw HTML (что я и сделал после того, как не смог найти эту таблицу, используя ни xpath, ни css_selector), таблица не имеет упомянутого идентификатора.

Как это возможно ?

Для лучшего объяснения:

Вот как это выглядит в режиме проверки в моем браузере

<table id='ext-gen1076' class='bats-table bats-table--center'>
[...]
</table>

И это то, что выглядит например, когда я открываю страницу как необработанный HTML файл

<table class='bats-table bats-table--center'>
[...]
</table>

Как это возможно, что идентификатор просто исчезает? (JFI, это мой первый вопрос, поэтому извиняюсь за плохое форматирование!).

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

Ответы [ 2 ]

2 голосов
/ 29 февраля 2020

Причина в том, что идентификатор был добавлен во время выполнения.

0 голосов
/ 01 марта 2020

Значение атрибута id , т. Е. ext-gen1076 содержит число и явно генерируется динамически. Префикс значения атрибута id , т.е. ext-gen , указывает, что id был создан во время выполнения с использованием Ext JS.


Ext JS

Ext JS - это JavaScript инфраструктура для создания ресурсоемких, кросс-платформенных веб-и мобильных приложений для любых современное устройство.


Этот сценарий использования

Возможно, вы определили элемент <table> еще до того, как JavaScript отобразили полное дерево DOM . Следовательно, атрибут id отсутствовал.


Идентификация Ext JS элементов

При изменении значения атрибута id , т.е. В природе c вы не сможете использовать полное значение атрибута id и можете использовать только частичное значение, равное stati c. В соответствии с HTML вы указали:

<table id='ext-gen1076' class='bats-table bats-table--center'>
[...]
</table>

Чтобы идентифицировать узел <<code>table>, вам нужно вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любой из следующие Стратегии локатора :

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

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table[id^='ext-gen']")))
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[starts-with(@id,'ext-gen')]")))
    
  • Примечание : необходимо добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Однако будет множество других элементов с атрибутом id , начинающимся с ext-gen. Таким образом, чтобы уникально идентифицировать элемент <table>, вам необходимо объединить атрибут class следующим образом:

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

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table.bats-table.bats-table--center[id^='ext-gen']")))
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='bats-table bats-table--center' and starts-with(@id,'ext-gen')]")))
    

Ссылка

Соответствующее подробное обсуждение можно найти в:

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