处理selenium webdriver中的重复ID

ftr*_*ter 5 xpath webdriver html-parsing selenium-webdriver

我试图使用selenium webdriver自动化一些测试.我正在处理在其html中使用重复ID的第三方登录提供程序(OAuth).结果我无法正确"找到"输入字段.当我选择一个id时,我得错了.

这个问题已经为JQuery解答了.但是我想要一个可以在Selenium webdriver中使用的答案(我假设使用Xpath).

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

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

Ros*_*han 6

你可以通过driver.find_element_by_id来做,例如你的副本"duplicate_ID"在"div_ID"里面,它是唯一的:

driver.find_element_by_id("div_ID").find_element_by_id("duplicate_id")
Run Code Online (Sandbox Code Playgroud)

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

driver.find_element_by_id("div_ID2").find_element_by_id("duplicate_id")
Run Code Online (Sandbox Code Playgroud)


Dim*_*hev 5

这个XPath表达式:

//div[@id='something']
Run Code Online (Sandbox Code Playgroud)

选择XML文档中的所有 div元素,其id属性的字符串值是字符串"something".

这个Xpath表达式:

count(//div[@id='something'])
Run Code Online (Sandbox Code Playgroud)

生成div第一个XPath表达式选择的元素数.

而这个XPath表达式:

(//div[@id='something'])[3]
Run Code Online (Sandbox Code Playgroud)

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

一般:

(//div[@id='something'])[$k]
Run Code Online (Sandbox Code Playgroud)

选择第$k- 这样的div元素($k必须用正整数代替).

配有这方面的知识,可以得到任何特定的div,其id属性具有字符串值"东西".


Xwr*_*eia 4

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

driver.find_element(:xpath, "//input[@id='loginid']"
Run Code Online (Sandbox Code Playgroud)

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

<input id="gbqfq" class="gbqfif" type="text" value="" autocomplete="off" name="q">
Run Code Online (Sandbox Code Playgroud)

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

    driver.find_element(:xpath, "//input[@name='q']"
Run Code Online (Sandbox Code Playgroud)

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

改进:

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

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

或者如果您愿意的话,可以在纯 xpath oneliner 中:

//input[@id="amount" and @maxlength='50']
Run Code Online (Sandbox Code Playgroud)

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

//input[@id and @maxlength]