根据内容选择 table 中的一行并从所选行中单击 link - Protractor
Selecting a row in table based on content and clicking link from selected row - Protractor
我有一个如下所示的页面对象:
<table border>
<th>Email</th>
<th>action</th>
<tr current-page="adminUsers.meta.page">
<td>admin@example.com</td>
<td><a href="" ng-click="adminUsers.onRemove(user, adminUsers.meta.page)">Delete permanently</a></td>
</tr>
<tr current-page="adminUsers.meta.page">
<td>matilda@snape.com</td>
<td><a href="" ng-click="adminUsers.onRemove(user, adminUsers.meta.page)">Delete permamently</a></td>
</tr>
</table>
我想创建一种方法,使我能够根据用户的电子邮件地址删除用户。
这是我想出来的,基于:
describe('Admin panel', function() {
it('admin deletes a user', function() {
var re = new RegExp("matilda@snape.com");
var users_list = element.all(by.xpath("//tr[@current-page='adminUsers.meta.page']"));
var delete_btn = element(by.xpath("//a[contains(text(), 'Delete permamently')]"));
users_list.filter(function(user_row, index) {
return user_row.getText().then(function(text) {
return re.test(text);
});
}).then(function(users) {
users[0].delete_btn.click();
});
// some assertion, not relevant right now
});
});
首先,我尝试过滤我要删除的用户所在的行(所有行都符合我的过滤条件的数组,然后选择第一行 - 无论如何应该是一行),然后单击相应的删除按钮。
但是,从我的调试中我知道该方法忽略过滤并单击 table 中可用的第一个删除按钮,而不是过滤元素中的第一个。
我做错了什么?
在这种特殊情况下,我将使用 XPath 及其 following-sibling
轴:
function deleteUser(email) {
element(by.xpath("//td[. = '" + email + "']/following-sibling::td/a")).click();
}
我同意@alexce 简短而优雅的回答,但是@anks,你为什么不在你的过滤器中删除??
describe('Admin panel', function() {
it('admin deletes a user', function() {
var re = new RegExp("matilda@snape.com");
var users_list = element.all(by.xpath("//tr[@current-page='adminUsers.meta.page']"));
var delete_btn = element(by.xpath("//a[contains(text(), 'Delete permamently')]"));
users_list.filter(function(user_row, index) {
return user_row.getText().then(function(text) {
return if(re.test(text)) { //assuming this checks the match with email id
user_row.delete_btn.click();
}
});
})
// some assertion, not relevant right now
});
});
我有一个如下所示的页面对象:
<table border>
<th>Email</th>
<th>action</th>
<tr current-page="adminUsers.meta.page">
<td>admin@example.com</td>
<td><a href="" ng-click="adminUsers.onRemove(user, adminUsers.meta.page)">Delete permanently</a></td>
</tr>
<tr current-page="adminUsers.meta.page">
<td>matilda@snape.com</td>
<td><a href="" ng-click="adminUsers.onRemove(user, adminUsers.meta.page)">Delete permamently</a></td>
</tr>
</table>
我想创建一种方法,使我能够根据用户的电子邮件地址删除用户。
这是我想出来的,基于
describe('Admin panel', function() {
it('admin deletes a user', function() {
var re = new RegExp("matilda@snape.com");
var users_list = element.all(by.xpath("//tr[@current-page='adminUsers.meta.page']"));
var delete_btn = element(by.xpath("//a[contains(text(), 'Delete permamently')]"));
users_list.filter(function(user_row, index) {
return user_row.getText().then(function(text) {
return re.test(text);
});
}).then(function(users) {
users[0].delete_btn.click();
});
// some assertion, not relevant right now
});
});
首先,我尝试过滤我要删除的用户所在的行(所有行都符合我的过滤条件的数组,然后选择第一行 - 无论如何应该是一行),然后单击相应的删除按钮。
但是,从我的调试中我知道该方法忽略过滤并单击 table 中可用的第一个删除按钮,而不是过滤元素中的第一个。 我做错了什么?
在这种特殊情况下,我将使用 XPath 及其 following-sibling
轴:
function deleteUser(email) {
element(by.xpath("//td[. = '" + email + "']/following-sibling::td/a")).click();
}
我同意@alexce 简短而优雅的回答,但是@anks,你为什么不在你的过滤器中删除??
describe('Admin panel', function() {
it('admin deletes a user', function() {
var re = new RegExp("matilda@snape.com");
var users_list = element.all(by.xpath("//tr[@current-page='adminUsers.meta.page']"));
var delete_btn = element(by.xpath("//a[contains(text(), 'Delete permamently')]"));
users_list.filter(function(user_row, index) {
return user_row.getText().then(function(text) {
return if(re.test(text)) { //assuming this checks the match with email id
user_row.delete_btn.click();
}
});
})
// some assertion, not relevant right now
});
});