我目前正在使用Nightwatch进行一些自动化测试,但CSS选择器非常复杂,并没有为我做这项工作。我已经开始考虑使用XPath来完成这项工作,但是这个表格相当复杂。
我希望能够.tlick()一个td值内的按钮,其中表中的特定行包含特定值。该表如下所示:
Username Email Display Name Buttons to Click (1st one wanted)
test test@example test (1st button)(2nd button)
test2 test2@example test (1st button)(2nd button)
这些值中的每一个都在tr> 1之内。 td所以能够找到它证明是困难的。这是我目前的XPath:
.click('/table[@id="admin-user-list"]/tbody/tr[td = "test2"]/td/button')
HTML树看起来像这样:
<div id>
<div class>
<table class>
<tbody>
<tr>
<td data-bind>(username)
<td data-bind>(email)
<td data-bind>(display name)
<td button>
(1st button)
(2nd button)
</tr>
</tbody>
每一行都有自己的tr,其中包含精确的tds。
一些帮助将不胜感激:)
答案 0 :(得分:1)
.click('//table[@id="admin-user-list"]/tbody/tr[./td[text()='test2']/td/button')
逻辑:
该行中的//table[@id="admin-user-list"]/tbody/tr[./td[text()='test2']
- 带有文本的td的tr
/td/button
- 按钮
但实际上这并不是一个好主意,因为您在每列中搜索该值。最好使用columnName + value
的组合让我们检查一下该表样本:https://www.w3schools.com/css/css_table.asp
我们将按名称逐列搜索表格数据,例如表格column = Country, data = UK
//*[@id='customers']//tr/td[count(//*[@id='customers']//th[text()='Country']/preceding-sibling::*)+1][text()='UK']
再次,逻辑很简单:
一般定位器是:
//*[@id='customers']//tr/td
- 我们正在搜索表格数据
参数:[text()='UK']
和position = same,如列名[count(column_position)]
如何获得列位置: 只需获取所需文字的列:
//*[@id='customers']//th[text()='Country']
并计算其前兄弟姐妹:
//*[@id='customers']//th[text()='Country']/preceding-sibling::*
,我们还应添加+1,因为我们需要当前元素的位置。并计算员工,所以结果如下:[count(//*[@id='customers']//th[text()='Country']/preceding-sibling::*)+1]
所以有列位置我们可以得到一般定位器:
tableId = customers; columnName =国家; dataText = UK;
//*[@id='tableId']//tr/td[count(//*[@id='tableId']//th[text()='columnName']/preceding-sibling::*)+1][text()='dataText']
这里是按数据+ columnName
获取孔行的定位器//*[@id='customers']//tr[./td[count(//*[@id='customers']//th[text()='Country']/preceding-sibling::*)+1][text()='UK']]
基本上你可以搜索其中的任何内容,例如只需添加到最后
/td/button
- 从中获取按钮