Как найти элемент с динамическим идентификатором через Selenium Webdriver - PullRequest
0 голосов
/ 16 января 2019

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

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

HTML-элемент, который я пытаюсь выделить:

input id="6A8A7718100001256A44465A5ED3AEAC-toDate" type="text" value="01/15/2019" size="10" maxlength="10" onchange="validateDateField('to', '6A8A7718100001256A44465A5ED3AEAC-fromDate', '6A8A7718100001256A44465A5ED3AEAC-toDate', '6A8A7718100001256A44465A5ED3AEAC-absRangeErr')"

Вот что я пробовал:

from_date = driver.find_elements_by_id("6A8A7718100001256A44465A5ED3AEAC-fromDate")
from_date = driver.find_element_by_xpath("//input[@id='6A8A7718100001256A44465A5ED3AEAC-fromDate']")
from_date = from_date = driver.find_element_by_css_selector("input[id='6A8A7718100001256A44465A5ED3AEAC-fromDate']")

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

Ответы [ 2 ]

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

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

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

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[id$='-toDate'][onchange*='-toDate']"))).send_keys("01/16/2019")
    
  • Использование XPATH:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[contains(@id, '-toDate') and contains(@onchange, '-toDate')]"))).send_keys("01/16/2019")
    
  • Примечание : необходимо добавить следующий импорт:

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

Подробное обсуждение можно найти в Selenium «selenium.common.exceptions.NoSuchElementException» при использовании Chrome

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

Буквенно-цифровые символы перед '-toDate', похоже, генерируются автоматически. Это означает, что они могут меняться между сборками сайта или могут создаваться динамически при запуске js.

Поэтому я бы использовал ключевое слово contains в xpath, так как оно должно быть более устойчивым к этим изменениям.

to_date = driver.find_element_by_xpath("//input[contains(@id, '-toDate')]")
from_date = driver.find_element_by_xpath("//input[contains(@id, '-fromDate')]")
...