6

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

这个问题已经回答了 JQuery。但我想要一个可以在 Selenium webdriver 中工作的答案(我假设使用 Xpath)。

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

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

4

5 回答 5

7

你可以通过 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")
于 2012-11-26T12:15:31.517 回答
6

这个 XPath 表达式

//div[@id='something']

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

这个 Xpath 表达式

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

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

而这个 XPath 表达式

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

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

一般

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

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

有了这些知识,就可以得到任何属性具有字符串值“某物”的特定div对象id

于 2012-08-14T12:41:29.747 回答
4

您正在研究哪种语言?重复的 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]

于 2012-08-14T12:09:49.293 回答
3

它没有在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"))
于 2014-06-04T04:48:37.870 回答
0

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

于 2015-04-27T13:33:51.097 回答