Как найти элемент в HTML, когда идентификатор является динамическим? Моя цель - найти элемент и выбрать «вариант» под ним - PullRequest
0 голосов
/ 11 ноября 2019

HTML:

<select id="XYZ_SV_12345" class="clsSelectControl pv" multiple="" size="11" aria-multiselectable="true" aria-invalid="false" style="width: auto;">

Здесь идентификатор является динамическим, но первые несколько символов всегда одинаковы, то есть: «XYZ_SV_» является постоянным, а остальные числовые значения являются динамическими.

Я попытался найти элементиспользуя приведенные ниже методы, но не повезло. пожалуйста, помогите мне найти элемент.

driver.find_element_by_xpath("//*[contains(@id, 'XYZ_SV_']")
driver.find_element_by_css_selector('input[id*="XYZ_SV_"]')
driver.find_element_by_css_selector(".clsSelectControl.pv")

Ответы [ 4 ]

0 голосов
/ 11 ноября 2019

Как вы указали, атрибут id равен dynamic , а первые несколько символов атрибута id всегда одинаковы, т. Е. "XYZ_SV_", поэтому вынеобходимо вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любое из следующих решений:

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

    element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.clsSelectControl.pv[id^='XYZ_SV_']")))
    
  • Использование XPATH:

    element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@class='clsSelectControl pv' and starts-with(@id,'XYZ_SV_')]")))
    
  • Примечание : необходимо добавить следующие импорты:

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

Замените ваш css селектор input[id*="XYZ_SV_"] на input[id^='XYZ_SV_'], и он должен работать, если селен найдет уникальную запись в dom.

Обратите внимание, что * если для соответствует подстрока , тогда как ^ представляет start-with.

Код:

driver.find_element_by_css_selector("input[id^='XYZ_SV_']")
0 голосов
/ 11 ноября 2019

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

может быть, вы можете попробовать что-то вроде

//select[starts-with(@id,'XYZ_SV_') and contains(@class, 'clsSelectControl')]

Если это не работает. Вы должны искать предков, пока не найдете только один элемент, а затем вернуться к тому, что вам нужно. Можете ли вы добавить весь Dom, чтобы я мог сформировать xpath. Попробуйте получить уникальный способ идентификации элемента. Вы можете перейти к parent / siblings / ancestors, чтобы получить элемент, который вы ищете.

Вышла альфа-версия селена 4, вы можете добавить ее и использовать близлежащий тэг и перейти к методам выше, ниже, toRightOf, toLeftOf, near (50pixel) относительныйBy.

(Мое предложениепока не использует селен 4 в производственной среде, пока не будет получен стабильный финальный выпуск, но может быть опробован в локальной среде)

0 голосов
/ 11 ноября 2019

Вот xpath, который вы должны использовать.

//select[starts-with(@id,'XYZ_SV_')]

Ниже приведен код.

driver.find_element_by_xpath("//select[starts-with(@id,'XYZ_SV_')]")

Снимок экрана: enter image description here

Если вы хотите использовать CSS, проверьте следующее.

select[id^='XYZ_SV_']

Ниже приведен код

driver.find_element_by_css_selector("select[id^='XYZ_SV_']")

Снимок экрана: enter image description here

...