ftr*_*ter 5 xpath webdriver html-parsing selenium-webdriver
我试图使用selenium webdriver自动化一些测试.我正在处理在其html中使用重复ID的第三方登录提供程序(OAuth).结果我无法正确"找到"输入字段.当我选择一个id时,我得错了.
这个问题已经为JQuery解答了.但是我想要一个可以在Selenium webdriver中使用的答案(我假设使用Xpath).
关于这个问题的其他问题,答案通常会说"你不应该在html中有重复的id".在那里向合唱团讲道.我无法控制相关网页.如果是的话,我会正确使用class和id,并以这种方式修复问题.
因为我做不到.使用xpath等可以获得哪些选项?
你可以通过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)
这个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
属性具有字符串值"东西".
您正在使用哪种语言?重复的 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]
归档时间: |
|
查看次数: |
13591 次 |
最近记录: |