2012-08-14 65 views
3

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

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

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

因为我不能那样做。我可以用xpath获得什么选项?

回答

2

你正在研究哪种语言? 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"> 

比方说,例如,你想consturct使用属性上面的HTML代码(谷歌的搜索框)您的XPath。你的XPath将是:

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

换句话说,当编号的都是一样的只是抓住另一个属性可用!

改进:

为了避免脆弱的XPath定位如订单的XML文档(可以很容易地改变),你可以更强大的使用的东西。两个xpath定位器而不是一个。这在处理非常相似的hmtl标签时也很有用。可以通过它的属性的2这样定位的元素:

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

此XPath表达式

//div[@id='something'] 

选择的XML文档中的所有div元件,其id的字符串值属性是字符串“东西”。

这个XPath表达式

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

产生由所述第一XPath表达式中选择的div元件的数量。

这XPath表达式

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

选择第三(按文档顺序)div由所述第一XPath表达式选择上述元素。

通常

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

选择$k个这样div元件($k必须用正整数进行取代)。

配备此知识,可以获得任何具体的div,其id属性具有字符串值“something”。

5

您可以通过driver.find_element_by_id做到这一点,例如UR复制 “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") 
0

你应该使用driver.findElement(By.xpath(),但同时用萤火定位元素,你应该选择特定的元素,而不是得到相对路径,这是你将如何获得元素即使有重复的ID的绝对路径