如何在XPath中处理动态更改的ID?

时间:2019-09-01 13:50:11

标签: python selenium selenium-webdriver

我正在尝试自动登录网站。 每次我搜索页面时,邮箱ID都会更改

例如:

//*[@id="undefined-undefined-E-mail-53172"]

当我刷新页面时:

//*[@id="undefined-undefined-E-mail-33458"]

所以我每次都必须更改代码,例如:

driver.find_element_by_id("undefined-undefined-E-mail-53172").send_keys("X@gmail.com")

driver.find_element_by_id("undefined-undefined-E-mail-33458").send_keys("X@gmail.com")

当我再次刷新时,它不起作用。

3 个答案:

答案 0 :(得分:1)

要处理动态元素,请诱导WebDriverWaitelement_to_be_clickable() 由于ID是动态的,因此请使用starts-with() xpath表达式。

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//input[starts-with(@id,'undefined-undefined-E-mail-')]"))).send_keys("X@gmail.com")

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//*[starts-with(@id,'undefined-undefined-E-mail-')]"))).send_keys("X@gmail.com")

注意:您需要进行以下导入才能执行上述代码。

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

答案 1 :(得分:1)

您可以尝试一下吗

driver.findElement(By.Xpath("//*[contains(@id,'undefined-undefined-E-mail')]").sendKeys("aa@yyy.com");

driver.findElement(By.Xpath("//*[starts-with(@id,'undefined-undefined-E-mail')]").sendKeys("aa@yyy.com");

答案 2 :(得分:0)

您可以通过2种方式做到这一点:

1 /检查somekinda元素是否包含某些内容(例如字符串的一部分,有人已经用其他答案回答了……)

2 /我使用的那个->使用完整的Xpath。这是您的操作方式:

  • 下载此扩展程序https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl

  • 转到网站并复制xpath ...当您获得包含特定ID的xpath时(例如://*[@id="5633040"]/div/input,您将超过该ID并尝试创建静态XPath (这是此扩展的优点).. //*[@id="app_content"]/div/div/form/div[1]/div/div <-可以说这超出了//*[@id="5633040"]

  • 因此,如果在xpath搜索中放入类似内容,则应该获得与动态//*[@id="app_content"]/div/div/form/div[1]/div/div/div/div/input相同的结果;如果有更多div //*[@id="app_content"]/div/div/form/div[1]/div/div/div[number]/div/input,则获得相同的结果

P.S->如果您无法安装扩展程序,则只需要尝试看看是否正确输入即可并且有效

〜希望对您有所帮助:)