如何通过Selenium Webdriver查找具有动态ID的元素

时间:2019-01-15 23:13:04

标签: python selenium xpath css-selectors webdriverwait

我刚开始在Python中将Webdriver与Selenium结合使用,并遇到了一些障碍,我正在努力使从Webportal提取数据自动化。我正在尝试在文本框中输入日期,但是无论我尝试搜索哪种方式,我的脚本都会返回scanf()

使用Chrome,我可以使用下面的ID轻松识别检查窗口中的元素,但是使用Python进行查找是不可能的。

我要隔离的HTML元素:

NoSuchElementException

这是我尝试过的:

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

感谢您的帮助,谢谢!

2 个答案:

答案 0 :(得分:3)

“-toDate”之前的字母数字字符似乎是自动生成的。这意味着它们可能会在网站的构建之间更改,或者可能在js运行时动态创建。

因此,我将在xpath中使用contains关键字,因为它应该对这些更改更加健壮。

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

答案 1 :(得分:0)

要将日期字符序列发送到文本框中,因为所需元素是 dynamic 元素,因此您必须诱导 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” when using Chrome

中找到详细的讨论