You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Protractor中定位目标用户行内的编辑/删除按钮

解决Protractor中定位用户行内编辑/删除按钮的问题

我明白你遇到的困扰了——你当前的代码之所以总是定位到页面第一个按钮,核心问题在于调用getDriver()后,你回到了全局的浏览器驱动上下文,而非目标用户所在行的局部上下文里查找元素。下面是具体的解决方案:

问题根源

你这段代码的问题出在这里:

var deleteButton = editedUserCell.getDriver().findElement(by.css('[ng-click="deleteUserClicked(user)"]'));

getDriver()返回的是整个浏览器的WebDriver实例,调用findElement时会在整个页面范围内匹配元素,自然会拿到第一个符合条件的删除按钮,而非目标用户行内的那个。

正确的定位方式

我们需要先锁定目标用户所在的<tr>行,再在这一行的局部上下文里查找编辑/删除按钮,确保只在当前用户的行内定位元素。

方法1:先定位目标行,再找按钮

// 1. 找到包含目标邮箱的<td>,再获取它的父元素<tr>
var targetUserRow = element(by.xpath('//td[text()="' + EDITED_EMAIL + '"]/parent::tr'));

// 2. 在该行内查找删除按钮
var deleteButton = targetUserRow.element(by.css('[ng-click="deleteUserClicked(user)"]'));
// 或者查找编辑按钮
var editButton = targetUserRow.element(by.css('[ng-click="editUserClicked(user.id)"]'));

// 执行点击操作
deleteButton.click();
// editButton.click();

方法2:用XPath直接定位行内按钮

也可以用XPath一步到位,直接定位到目标用户行内的按钮:

// 删除按钮
var deleteButton = element(by.xpath('//td[text()="' + EDITED_EMAIL + '"]/following-sibling::td[@title="Delete"]/span[@ng-click="deleteUserClicked(user)"]'));

// 编辑按钮
var editButton = element(by.xpath('//td[text()="' + EDITED_EMAIL + '"]/following-sibling::td[@title="Edit"]/span[@ng-click="editUserClicked(user.id)"]'));

deleteButton.click();

方法3:用cssContainingText定位(适合用用户名作为标识)

如果用户名更适合作为定位依据,也可以这样写:

// 找到包含目标用户名的<td>,再获取父行
var targetUserRow = element(by.cssContainingText('td', EDITED_USERNAME)).element(by.xpath('..'));

// 在该行内找删除按钮(用样式类简化定位)
var deleteButton = targetUserRow.element(by.css('.btn-details.warning'));
deleteButton.click();

这些方法都限定了查找范围在目标用户的行内,不会再匹配到页面其他行的按钮了。

内容的提问来源于stack exchange,提问作者Carl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:44:14