如何根据硒中元素的值查找元素?

时间:2018-07-20 12:07:06

标签: python selenium selenium-webdriver xpath css-selectors

我正在处理这样一种情况:每次登录时,报表都会显示在一个表中,该表的ID是动态生成的,其随机文本以“ table”结尾。

我正在使用Selenium python Web驱动程序自动化此表。它具有语法

driver.find_element_by_xpath('//*[@id="isc_43table"]/tbody/tr[1]/td[11]').click();

帮我编辑此语法,以使其与ID以"table"结尾的表匹配。 (仅生成一张表)。

3 个答案:

答案 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)'