我正在处理这样一种情况:每次登录时,报表都会显示在一个表中,该表的ID是动态生成的,其随机文本以“ table”结尾。
我正在使用Selenium python Web驱动程序自动化此表。它具有语法
driver.find_element_by_xpath('//*[@id="isc_43table"]/tbody/tr[1]/td[11]').click();
帮我编辑此语法,以使其与ID以"table"
结尾的表匹配。
(仅生成一张表)。
答案 0 :(得分:3)
ends-with
XPath Constraint Function是 XPath v2.0 的一部分,但根据当前实现, Selenium 支持 XPath v1.0 。
根据您共享的 HTML ,以标识可以使用Locator Strategies之一的元素:
XPath
使用contains()
:
driver.find_element_by_xpath("//*[contains(@id,'table')]/tbody/tr[1]/td[11]").click();
此外,正如您提到的那样,表是动态生成的 ,因此要在所需元素上调用click()
,就需要诱导 WebDriverWait 使元素可点击,您可以使用以下解决方案:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[contains(@id,'table')]/tbody/tr[1]/td[11]"))).click()
或者,您也可以将 CssSelector 用作:
driver.find_element_by_css_selector("[id$='table']>tbody>tr>td:nth-of-type(11)").click();
同样,您也可以使用 CssSelector 来将 WebDriverWait 诱导为:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[id$='table']>tbody>tr>td:nth-of-type(11)"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
答案 1 :(得分:2)
我希望这两个都能为您工作
driver.find_element_by_xpath("//table[ends-with(@id,'table')]/tbody/tr[1]/td[11]").click();
OR
driver.find_element_by_xpath("//table[substring(@id,'table')]/tbody/tr[1]/td[11]").click();
如果无法获取,请从tbody中删除标签。
在这种情况下,当您遇到随机生成的ID时,可以将以下函数与XPATH表达式一起使用
1)包含
2)以&
开头3)以
结尾4)子字符串
语法
//table[ends-with(@id,'table')]
//h4/a[contains(text(),'SAP M')]
//div[substring(@id,'table')]
您需要标识具有该ID的元素,无论其div还是输入或表。我认为它是一张桌子。
答案 2 :(得分:1)
您可以在XPath下面尝试模拟ends-with()
语法:
'//table[substring(@id, string-length(@id) - string-length("table") +1) = "table"]//tr[1]/td[11]'
您还可以使用CSS选择器:
'table[id$="table"] tr>td:nth-of-type(11)'