【问题标题】:Dealing with duplicate ids in selenium webdriver处理 selenium webdriver 中的重复 ID
【发布时间】:2012-08-10 15:11:29
【问题描述】:

我正在尝试使用 selenium webdriver 自动化一些测试。我正在与在其 html 中使用重复 ID 的第三方登录提供商 (OAuth) 打交道。结果,我无法正确“找到”输入字段。当我只选择一个 ID 时,我得到了错误的 ID。

这个问题有already been answered for JQuery。但我想要一个可以在 Selenium webdriver 中工作的答案(我假设使用 Xpath)。

关于这个问题的其他问题,答案通常说“你不应该在 html 中有重复的 id”。在那里向合唱团讲道。我无法控制相关网页。如果是这样,我会正确使用 class 和 id 并以这种方式解决问题。

因为我做不到。我可以使用 xpath 等获得哪些选项?

【问题讨论】:

    标签: xpath html-parsing webdriver selenium-webdriver


    【解决方案1】:

    您正在研究哪种语言?重复的 id 应该不是问题,因为您几乎可以使用 xpath 获取任何属性,而不仅仅是 id 标记。其他语言的语法会略有不同(如果您想要 Ruby 以外的其他语言,请告诉我),但您是这样做的:

    driver.find_element(:xpath, "//input[@id='loginid']"
    

    构建 xpath 定位器的方式如下: 从 html 代码中,您可以选择任何属性:

    <input id="gbqfq" class="gbqfif" type="text" value="" autocomplete="off" name="q">
    

    例如,假设您想使用 name 属性使用上面的 html 代码(Google 的搜索框)构建您的 xpath。您的 xpath 将是:

        driver.find_element(:xpath, "//input[@name='q']"
    

    换句话说,当 id 相同时,只需获取另一个可用属性!

    改进:

    为了避免脆弱的 xpath 定位器,例如 XML 文档中的顺序(可以轻松更改),您可以使用更健壮的东西。两个 xpath 定位器而不是一个。这在处理非常相似的 hmtl 标签时也很有用。您可以通过 2 个属性来定位一个元素,如下所示:

    driver.find_element(:id, 'amount') and driver.find_element(xpath: "//input[@maxlength='50']")
    

    如果您愿意,也可以在纯 xpath 中使用:

    //input[@id="amount" and @maxlength='50']
    

    或者(如果您的 xpath 将只返回一个唯一元素)您可以在抽象级别再上一层;完全省略属性值:

    //input[@id and @maxlength]

    【讨论】:

      【解决方案2】:

      这个 XPath 表达式

      //div[@id='something']
      

      选择所有 XML文档中的div元素,其id属性的字符串值为字符串“something”。

      这个 Xpath 表达式

      count(//div[@id='something'])
      

      产生由第一个 XPath 表达式选择的 div 元素的数量。

      还有这个 XPath 表达式

      (//div[@id='something'])[3]
      

      选择上面第一个 XPath 表达式选择的第三个(按文档顺序)div 元素。

      一般情况

      (//div[@id='something'])[$k]
      

      选择$k-th 这样的div 元素($k 必须替换为正整数)。

      有了这些知识,就可以得到任何特定的div,其id 属性的字符串值为“something”。

      【讨论】:

        【解决方案3】:

        您可以通过 driver.find_element_by_id 来完成,例如,您的重复“duplicate_ID”在“div_ID”内,这是唯一的:

        driver.find_element_by_id("div_ID").find_element_by_id("duplicate_id")
        

        对于另一个div下的其他重复ID:

        driver.find_element_by_id("div_ID2").find_element_by_id("duplicate_id")
        

        【讨论】:

        • 我从来没有意识到你可以做到这一点。太棒了!
        【解决方案4】:

        它没有在http://selenium-python.readthedocs.io/locating-elements.html 中列出,但我可以访问一个方法find_elements_by_id

        这将返回具有重复 ID 的所有元素的列表。

        links = browser.find_elements_by_id("link")
        for link in links:
            print(link.get_attribute("href"))
        

        【讨论】:

          【解决方案5】:

          您应该使用 driver.findElement(By.xpath() 但是在使用 firebug 定位元素时,您应该为特定元素选择绝对路径而不是获取相对路径,即使 ID 重复,您也将获得该元素

          【讨论】:

            猜你喜欢
            • 2016-11-03
            • 1970-01-01
            • 2019-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-11
            • 2013-07-19
            相关资源
            最近更新 更多