假设我有这个HTML
<div class="item-wrapper">
<div>
<h6>My Header 1</h6>
<div>
<div>
<div>
<label>
<input type="checkbox" />
<span class="class1">Text 2</span>
<span class="class2"></span>
</label>
<div>
</div>
</div>
<div class="item-wrapper">
<div>
<h6>My Header 2</h6>
<div>
<div>
<div>
<label>
<input type="checkbox" />
<span class="class1">Text 2</span>
<span class="class2"></span>
</label>
<div>
</div>
</div>
我如何让任何孩子到共同的父母,即<div class="item-wrapper">
?在本例中,属性是类。但是,该属性可以是可以标识共同祖先的任何属性。
var xPathToAncestor = "ancestor::div[@class='item-wrapper']";
var ancestor = child.FindElement(By.XPath(xPathToAncestor)
我已经尝试了很多组合//ancestor::div[@class='item-wrapper']
,.//ancestor::div[@class='item-wrapper']
,但没有任何效果。
您可以使用
//div[@class='item-wrapper']//span
此查找跨度标记,这些标记是直接和间接子项
寻找直接子级
//div[@class='item-wrapper']/span
如何使用祖先:
//ancestor::div[@class="item-wrapper"]
这将找到一个带有标签div和类项包装器的元素,并且是任何子项的父级
//span/ancestor::div[@class="item-wrapper"]
在您的情况下,只需更改
var xPathToAncestor = "./ancestor::div[@class='item-wrapper']";
请参阅".",它表示子节点是 XPath 的上下文节点
这将查找带有标签div 和类项包装器的元素,并且是 span 标签的父元素
//ancestor::div[@class="item-wrapper"]/span
查找作为类="项目包装器"和div 标签的直接子级的 span 标签
//ancestor::div[@class="item-wrapper"]//span
查找作为类="项目包装器"和div 标签的直接或非直接子级的 span 标签
要访问与公共父<div class="item-wrapper">
相关的任何子项,您可以使用以下基于 xpath 的定位器策略:
-
使用xpath获取
<input type="checkbox" />
://div[@class='item-wrapper']//h6[text()='My Header']//following::label[1]/input[1]
-
使用xpath获取
<span class="class1">Text 1</span>
://div[@class='item-wrapper']//h6[text()='My Header']//following::label[1]//span[@class='class1']
更新
根据您的问题更新,要获取通用父<div class="item-wrapper">
,您可以使用以下基于 xpath 的定位器策略:
-
使用xpath和文本
Text 2
ancestor
://span[text()='Text 2']//ancestor::div[@class='item-wrapper']
-
使用xpath和
class="class1"
属性的ancestor
://span[@class='class1']//ancestor::div[@class='item-wrapper']
您可以尝试使用 CSS 选择器而不是 XPath。
以您问题中的 HTML 为例:
<div class="item-wrapper">
<div>
<h6>My Header</h6>
<div>
<div>
<div>
<label>
<input type="checkbox" />
<span class="class1">Text 1</span>
<span class="class2"></span>
</label>
<div>
</div>
</div>
要定位class="class1"
,您可以使用以下内容:
var classOne = driver.findElement(By.cssSelector(".item-wrapper > div(2) > div > label > '.class1'"));
- 这将定位
item-wrapper
类, - 然后是第 2
div
(因为第 1div
包含header
), - 然后是下一个
div
- 然后是
label
- 那么任何有类
class1
- 或者,您可以使用
span
而不是类名。这将使它var classOne = driver.findElement(By.cssSelector(".item-wrapper > div(2) > div > label > span(1)));
.因为你想要第一个span
而不是第二个。
请注意,class
的 CSS 选择器是.
。您可以使用不同的 CCS 选择器。
这个答案也解释了使用CSS选择器。