处理selenium webdriver中的重复ID

时间:2012-08-14 10:30:34

标签: xpath html-parsing webdriver selenium-webdriver

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

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

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

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

5 个答案:

答案 0 :(得分:6)

你可以通过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")

答案 1 :(得分:5)

此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 - 此类div元素($k必须替换为正整数)。

有了这些知识,我们就可以获得div属性具有字符串值“”的任何特定id

答案 2 :(得分:3)

你在做哪种语言? Dublicate 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's相同时,只需抓住另一个可用的属性!

<强>改进:

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

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]

答案 3 :(得分:2)

它未在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"))

答案 4 :(得分:0)

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