【问题标题】:Is it possible to locate element by partial id match in Selenium是否可以通过 Selenium 中的部分 id 匹配来定位元素
【发布时间】:2015-07-06 14:42:50
【问题描述】:

我正在尝试使用生成的 ID 来定位元素,其中 ID 的某些部分是已知的;例如:

id="page_x002e_x0023_default-create-firstname"

其中最后 3 个单词 (_default-create-firstname) 是已知的,但前面的任何内容可能会发生变化。 这可能吗?

【问题讨论】:

    标签: selenium selenium-webdriver


    【解决方案1】:

    您可以申请ends-with CSS selector

    By.cssSelector("[id$=default-create-firstname]")
    

    更新

    自发布答案以来已经过去了一段时间。以下是来自链接的 Mozilla 开发者页面和 cmets 的一些更新:

    新使用 By.css 代替 By.cssSelector

    By.css("[id$=default-create-firstname]")
    

    也看到了四种可能性

    • 开始
    • 里面的任何地方
    • 内部任意位置,无论大小写
    • 结尾

    /* Internal links, beginning with "#" */
    a[href^="#"] {
      background-color: gold;
    }
    
    /* Links with "example" anywhere in the URL */
    a[href*="example"] {
      background-color: silver;
    }
    
    /* Links with "insensitive" anywhere in the URL,
       regardless of capitalization */
    a[href*="insensitive" i] {
      color: cyan;
    }
    
    /* Links that end in ".org" */
    a[href$=".org"] {
      color: red;
    }
    

    【讨论】:

    • 为了匹配一个 id 的开头,你可以: By.CssSelector("id^=default-create-firstname")
    • 并匹配 id 包含“partialId”的元素:By.cssSelector("[id*=partialId]")
    • 这些都不适合我。它们都会产生 InvalidSelectorException。
    • 我知道是多年以后,量角器可能已经改变,但这对我有帮助。我想知道@SteveStaple 是否需要在名称周围加上单引号。我有一个输入字段,其 ID 看起来像 ADMIT_DATE 后跟 4 个不可预测的数字,它位于 by.css('input[id^="ADMIT_DATE"]'),
    • 'By.cssSelector' 已更改为 'By.css'
    【解决方案2】:

    如果你想走 xpath 路线,那么你可以使用contains(),像这样:

    //*[contains(@id,'_default-create-firstname')]
    

    这将在整个页面中搜索包含文本“_default-create-firstname”的 id。它可以很容易地变得更具体

    【讨论】:

    • 这是一项很棒的技术。我能问一下你在哪里找到的吗?我没有看到提到它on the documentation site I use
    • @Cathal - 我个人也更喜欢这个。
    【解决方案3】:

    您可以在 Java-Selenium 中进行尝试:您可以使用 ends-with()contains()。我认为两者都应该工作。

    driver.findElement(By.xpath("//*[ends-with(@id,'_default-create-firstname')]"));
    driver.findElement(By.xpath("//*[contains(@id, '_default-create-firstname')]"));
    

    【讨论】:

    • 如果我使用以下查询,我有带有 ID=Mscrm.BasicHomeTab.New.NewRecord 的元素 - 我成功获取了元素 FindElement(By.XPath("//*[@id='Mscrm.BasicHomeTab.New.NewRecord']")) 但如果我尝试通过部分 ID 获取元素它会失败 FindElement(By.XPath("//*[ends-with(@id,'NewRecord')]")) 第二个查询有什么问题?
    【解决方案4】:

    这适用于 selenium v​​ba

     .FindElementsByXPath( "//*[contains(@class, 'unique-string')]" )
    

    【讨论】:

      【解决方案5】:

      工作一个

      driver.find_element_by_xpath("//*[contains(@id, 'jobs-search-box-keyword-id')]")
      

      不工作的,都得到同样的错误,TypeError: 'str' object is not callable

      1. driver.find_element(By.XPATH("//*[contains(@id, 'jobs-search-box-keyword-id')]")).text
      
      2. driver.find_element(By.XPATH("//*[contains(@id, 'jobs-search-box-keyword-id')]").text).text
      
      3. driver.find_element(By.XPATH("//*[contains(@id, 'jobs-search-box-keyword-id')]")).get_attribute("innerHTML")
      
      4. driver.find_element(By.XPATH("//*[contains(@id, 'jobs-search-box-keyword-id')]").get_attribute("innerHTML")).get_attribute("innerHTML")
      

      我使用 python 3.7.6,硒 3.141.0

      【讨论】:

        【解决方案6】:

        我使用:a[id*='example']

        当我的 ID 类似于 example_12

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          • 1970-01-01
          • 2021-11-23
          • 2021-05-18
          • 1970-01-01
          • 2014-11-19
          • 1970-01-01
          相关资源
          最近更新 更多