我正在寻求XPath选择器的一些帮助。我已经学习了XPath的基础知识,但我很难将它们组合起来解决这个问题。
所以我在HTML中有一个包含大约30行的网格,每行(从左到右)都有一个复选框和员工姓名。以下是行组成的片段:
<div class="ui-grid-row ng-scope" data-row-num="21"> //Whole row
<div role="row" ui-grid-row="row" class="ng-isolate-scope">
<div role="rowheader" id="1746254927-13-urGrid-005-cell"> //This is checkbox
<div role="gridcell" id="17443224958-13-urGrid-005-cell">
<div class="ui-grid-cell-contents ng-binding text-left"> Appleseed, Jonny</div>
我的目标是找到:div class =&#34; ui-grid-row ng-scope&#34;数据排-NUM =&#34; 21&#34;&GT;基于其后代包含Appleseed,Jonny&#39;。从这里开始,我将使用getAttribute提取data-row-num,然后我可以导航到右边的复选框。
到目前为止我所拥有的是:
element(by.xpath("//div[@class='ui-grid-row ng-scope') and contains(.//div, 'Appleseed, Jonny')]"));
有人可以帮我指出正确的方向吗?我不是在寻找包含这个文本的元素,而是它的父元素,所以我可以提取它的data-row-num。
或者如果我能找到包含&#39; Appleseed,Jonny&#39;的div元素。那么我怎么才能找到它的父元素(在这种情况下它不是直接父元素而是2个元素)?
答案 0 :(得分:0)
在提供HTML的情况下,此XPath应该可以正常工作
//div[@class='ui-grid-row ng-scope'][.//div[contains(.,'Appleseed, Jonny')]]
它正在寻找包含指定类DIV
的{{1}},并且还有一个包含所需文字[@class='ui-grid-row ng-scope']
的子DIV
。
我更喜欢(合理地)可能具体,例如使用标记名而不是[.//div[contains(.,'Appleseed, Jonny')]]
等等。
由于您提到要查找与该行关联的复选框,另一种方法是直接查找相对于包含所需文本的元素的复选框。
*
由于我假设您将多次使用此XPath,我会将其放入函数中并传入所需的文本,例如“Appleseed,Jonny”,作为一个字符串并构建到XPath中。
答案 1 :(得分:0)
尝试
//*[contains(text(), "Appleseed, Jonny")]/parent::div[contains(@class,"ui-grid-row ng-scope")].
基本上是parent :: *有助于获取父元素