2017-08-16 110 views
0

我寻求一些帮助,XPath选择一个后代元素。我已经学习了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 =“UI格列NG-范围”数据行NUM =“21”>基于它的后裔包含“Appleseed,Jonny”。从这里,我将用getAttribute提取data-row-num,然后导航到正确的复选框。

我至今是:

element(by.xpath("//div[@class='ui-grid-row ng-scope') and contains(.//div, 'Appleseed, Jonny')]")); 

有人能帮助指向我在这里正确的方向?我不是在寻找包含这个文本的元素,而是它的父元素,所以我可以提取它的data-row-num。

或者,如果我能找到包含“苹果核战记,强尼”的div元素我怎么会那么找到它的父元素(在这种情况下,它不是直接父,但2元了)?

+0

这似乎工作(如果到NG-scope'后'移除多余的支架)。你能更详细地描述这个问题吗? – Andersson

+0

所以每个'行'中有5个div元素。第一个div包含行中的所有div,第二个div包含2个div,其中一个是复选框,另一个是员工姓名,员工姓名div包含另一个具有员工姓名文本的div。这些'行'有几个,每个都有不同的员工姓名。我想要根据员工姓名在代码段中看到的顶级div元素。因此,在data-row-num的每个div中都有另一个包含雇员名称的div,我如何过滤行以返回包含雇员姓名的后代div的行 – Bluejuice

+0

感谢您收集括号,我将其删除但它仍然无法正常工作 – Bluejuice

回答

0

此XPath应该工作给予HTML提供

//div[@class='ui-grid-row ng-scope'][.//div[contains(.,'Appleseed, Jonny')]] 

它查找包含指定[@class='ui-grid-row ng-scope']类一个DIV,并且还拥有一个孩子DIV包含所需的文本,[.//div[contains(.,'Appleseed, Jonny')]]

我宁愿越具体(合理)可能的,例如使用标记名而不是*等等。

既然你提到你正在寻找与该行相关的复选框,另一种方式来做到这一点是寻找直接相对于包含所需的文本元素的复选框。

//div[@role='rowheader'][.//div[contains(.,'Appleseed, Jonny')]] 

因为我假设你将使用这个XPath无数次,我会把它变成一个功能,并通过所需的文本,例如“Appleseed,Jonny”作为一个字符串并将其构建到XPath中。

+0

第一个XPath工作,谢谢!然而,量角器不能找到元素,除非它是可见的,我将不得不弄清楚如何将它滚动到视图中,而不是先定位它。 – Bluejuice

+0

@Bluejuice是关闭屏幕不可见或只是不可见/呈现呢?以下是滚动到元素的量角器示例:https://stackoverflow.com/questions/27023768/scroll-down-to-an-element-with-protractor。如果它还不可见,那么您应该可以使用WebDriverWait并等到它可见,可点击等。 – JeffC

+0

直到您向下滚动到该行时,该行才会显示。我知道量角器中的一些滚动功能,但他们都需要一个元素来滚动。我无法硬编码任何东西,因为员工数量根据测试环境而变化。我还需要选择总共2名员工,这使其变得更加困难 – Bluejuice