HTML:
Honor_Student
此处的id是动态的,但前几个字符始终相同,即:“ XYZ_SV_”是常量,其余数值是动态的。
我尝试使用以下方法查找元素,但没有运气。请帮我找到元素。
<select id="XYZ_SV_12345" class="clsSelectControl pv" multiple="" size="11" aria-multiselectable="true" aria-invalid="false" style="width: auto;">
HTML:
Honor_Student
此处的id是动态的,但前几个字符始终相同,即:“ XYZ_SV_”是常量,其余数值是动态的。
我尝试使用以下方法查找元素,但没有运气。请帮我找到元素。
<select id="XYZ_SV_12345" class="clsSelectControl pv" multiple="" size="11" aria-multiselectable="true" aria-invalid="false" style="width: auto;">
这是您应该使用的xpath。
//select[starts-with(@id,'XYZ_SV_')]
下面是代码。
driver.find_element_by_xpath("//select[starts-with(@id,'XYZ_SV_')]")
如果要使用CSS,请检查以下内容。
select[id^='XYZ_SV_']
下面是代码
driver.find_element_by_css_selector("select[id^='XYZ_SV_']")
,
将css选择器input[id*="XYZ_SV_"]
替换为input[id^='XYZ_SV_']
,如果selenium在dom中找到唯一的条目,它应该起作用。
请注意,如果*
用于 subString 匹配,而^
则表示start-with
。
代码:
driver.find_element_by_css_selector("input[id^='XYZ_SV_']")
,
如果contains不起作用,我认为ID格式不会类似(我的假设),如果您要查找的ID是许多可用的类似ID开头中的第一个,则Selenium会选择它那。或者,您可以将id与class组合以形成唯一的组合。
也许您可以尝试类似的
//select[starts-with(@id,'XYZ_SV_') and contains(@class,'clsSelectControl')]
如果这不起作用。您应该先找祖先,直到找到一个要素,然后再遍历所需的要素。您能添加整个Dom以便我形成xpath吗? 尝试获得一种识别元素的独特方法。您可以转到父母/兄弟姐妹/祖先来查找您要搜索的元素。
硒4的Alpha版本已经发布,您可以添加它并使用附近的标记名,然后在relativeBy的,toRightOf,toLeftOf,near(50pixel)方法的上方,下方进行查找。
(我的建议是在生产稳定的最终版本之前,不要在生产环境中使用硒4,但是可以在本地环境中试用)
,您已经指出 id 属性是 dynamic ,并且 id 属性的前几个字符始终相同,即“ XYZ_SV_ ”,因此您必须为element_to_be_clickable()
引入 WebDriverWait ,并且可以使用以下任一解决方案:
使用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