Python 当id是动态的时,如何在html中查找元素?我的目标是找到元素并选择;选择权;在它下面

Python 当id是动态的时,如何在html中查找元素?我的目标是找到元素并选择;选择权;在它下面,python,selenium,xpath,css-selectors,webdriverwait,Python,Selenium,Xpath,Css Selectors,Webdriverwait,HTML: 下面是您应该使用的xpath 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") 下面是代码 //select[starts-with(@id,'XYZ_SV_')] 屏幕截

HTML:


下面是您应该使用的xpath

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")
下面是代码

//select[starts-with(@id,'XYZ_SV_')]
屏幕截图:

如果你想使用CSS,请检查以下内容

driver.find_element_by_xpath("//select[starts-with(@id,'XYZ_SV_')]")
下面是代码

select[id^='XYZ_SV_']
屏幕截图:

将css选择器
输入[id*=“XYZ_SV_”]
替换为
输入[id^='XYZ_SV_']
,如果selenium在dom中找到唯一的条目,它应该可以工作

请注意,
*
if for子字符串匹配,而
^
表示
开头

代码:

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

如果contains不起作用,我认为不会从开始,因为id格式类似(我的假设),如果您要查找的id是许多可用的类似id开始中的第一个,那么selenium会选择它。或者,您可以将id与类组合以形成唯一的组合

也许你可以试试这样的东西

driver.find_element_by_css_selector("input[id^='XYZ_SV_']")
如果这不起作用。你应该寻找祖先,直到你只找到一个元素,然后遍历回到你需要的地方。您可以添加整个Dom以便我可以形成xpath吗。 试着用一种独特的方式来识别元素。您可以转到父级/同级/父级以获取正在搜索的元素

selenium 4的Alpha版本已经推出,您可以添加该版本,并使用附近的标记名,然后选择above、below、toRightOf、toLeftOf、near(50像素)的relativeBy方法


(我的建议是,在最终发布稳定版本之前,不要在生产环境中使用selenium 4,但可以在本地环境中试用)

正如您所指出的,id属性是动态的,id属性的前几个字符总是相同的,即“XYZ_SV_”因此,您必须诱导WebDriverWait使
元素成为可点击的()
,您可以使用以下任一解决方案:

  • 使用
    CSS\u选择器

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

    element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.clsSelectControl.pv[id^='XYZ_SV_']")))
    
  • 注意:您必须添加以下导入:

    element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@class='clsSelectControl pv' and starts-with(@id,'XYZ_SV_')]")))
    
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