量角器/ XPath - 查找包含包含文本

时间:2017-08-16 15:54:02

标签: html xml selenium xpath protractor

我正在寻求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个元素)?

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 :: *有助于获取父元素