【问题标题】:How to find element based on what its value ends with in Selenium?如何根据 Selenium 中的值结尾来查找元素?
【发布时间】:2018-07-22 03:26:51
【问题描述】:

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

我正在使用 selenium python web 驱动程序自动化这个表。它有语法

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

帮助我编辑此语法以将其与带有"table" 的表结尾 id 匹配。 (只生成一张表)。

【问题讨论】:

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


    【解决方案1】:

    ends-with XPath Constraint FunctionXPath 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();
      
    • 此外,正如您所提到的,ID 是动态生成的表,因此要在所需元素上调用 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
    

    【讨论】:

    【解决方案2】:

    我希望这两个对你有用

    driver.find_element_by_xpath("//table[ends-with(@id,'table')]/tbody/tr[1]/td[11]").click();
    

    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 还是 input 或 table。我认为它是一张桌子。

    【讨论】:

    • //table[ends-with(@id,'table')]//table[substring(@id,'table')] 都不起作用...
    【解决方案3】:

    你可以试试下面的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)'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2013-10-19
      相关资源
      最近更新 更多