这正是我正在尝试做的事情
我打开一个页面,其中包含一个包含用户信息的表
我的getText()元素表示表中的用户数量(f.e。“列表中的11个用户”)
我删除“列表中的用户”部分并将字符串转换为整数,以便稍后用于for循环
我需要通过用户名(第9列)找到某个用户并获取j
号码,这是该用户信息所在的行数(这是我被卡住的地方)
我转到j
行的第一列(它将成为此特定用户的编辑按钮)并单击它以验证用户的类型
我试过的代码的一个例子
it("Validation of ND account", function() {
//login
element(by.id("j_username")).sendKeys($usernameND);
element(by.id("j_password")).sendKeys($passwordND);
element(by.buttonText("Login")).click();
//navigate to a page with list of users displayed in a table
element(by.xpath('//a[@short-title="Users"]')).click();
//narrow the search result by typing 'testuser'
element(by.model("userList.searchBox.options.query")).sendKeys($usernameND);
//the table has 11 results such as 'testuser', 'testuser1', 'testuser2'
//I get text of element with text '11 users in list' to get just the number out of it
element(by.xpath('//div[@viewid="userList"]//div[@class="results-count ng-binding"]')).getText().then(function(numberOfUsers) {
numberOfUsers = Number(numberOfUsers.replace(" Users in list",""));
// declare a variable which will be responsible for accessing to j row in a table
var j=1
//I search through 11 rows from the table for my username
for (i=1; i<numberOfUsers; i++) {
element(by.xpath("(//td[@data-field='username'])["+j+"]")).getText().then(function(username){
if (username===$usernameND){
console.log("true");
console.log(j);
j++
} else {
console.log("false");
j++
}
});
}
});
});
这就是我得到的
true
1
true
2
true
3
true
4
true
5
true
6
true
7
true
8
true
9
true
10
所以它确实有效,但即使用户名不同(似乎每次都检查第一行),它总是返回true。我尝试了另一种方法
element(by.xpath('//div[@viewid="userList"]//div[@class="results-count ng-binding"]')).getText().then(function(numberOfUsers) {
numberOfUsers = Number(numberOfUsers.replace(" Users in list",""));
for (i=1; i<numberOfUsers; i++) {
element(by.xpath("(//td[@data-field='username'])["+i+"]")).getText().then(function(username){
if (username===$usernameND){
console.log("true");
console.log(i);
} else {
console.log("false");
}
});
}
});
我得到了
true
11
false
false
false
false
false
false
false
false
false
现在它访问每一行似乎很好,但在第一行它返回数字11.出错了什么?如何解决?
P.S。我将举例说明我在做什么 screenshot of the page 我想找到我的用户并点击与之关联的“编辑”按钮。我只需单击第6列第一列中的单元格即可。但是如果要添加更多用户,我想让它变得可靠。为此,我需要搜索用户名列,记录该用户在表中所在行的编号,然后导航到我找到的行号第一列中的单元格。
答案 0 :(得分:0)
说实话,我不知道你在检查什么。
首先你应该考虑使用
element.all(by.xpath("(//td[@data-field='username'])"))
代替
element(by.xpath("(//td[@data-field='username'])["+j+"]"))
返回elementArrayFinder。
将其分配给变量(例如tableRows
)然后您可以处理这些数据。
如果您要检查字符串“11个用户列表”中的数字是否正确,yuu可以使用tableRows.count()
您还可以filter
元素:
http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.filter
使用map
:
http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.map
请告诉我一行究竟应该做什么。
编辑:
确定。这里有代码示例。
它单击已定义用户的EDIT
链接(在本例中为TESTUSER26):
您必须做的唯一更改是将defineSelectorForUsernameCell
更改为实际值。
var tableRows = element.all(by.css('td'));
var searchedUsername = 'TESTUSER26';
return tableRows.filter((eachRow) => {
return eachRow.element(by.css('defineSelectorForUsernameCell')).getText((usernameCellText) => {
if (usernameCellText === searchedUsername) {
return eachRow.element(by.linkText('EDIT')).click();
}
});
});
答案 1 :(得分:0)
对我来说简单的方法是访问我在表中寻找的用户tr,然后单击此行中的按钮编辑。两个例子
$username26="testuser26"
element.all(by.xpath('//trLocator')).first().element(by.xpath("//tr[.//td[@data-field='username' and text()="+$username26+"]]")).element(by.xpath(".//a[text()='Edit']")).click()
element(by.xpath("//td[@data-field='username' and text()='"+$username26+"']/..")).element(by.xpath(".//a[text()='Edit']")).click();
要理解的重要部分是第二个xpath中的一个点,表示当前节点。没有这个点“//”字面意思是页面上的任何地方与“.//”意味着从我已经选择的元素开始
现在这是漫长的道路,但这是我正在寻找的逻辑
var tableRows = element.all(by.xpath('xpathTableRowsLocator')); //returns 11 rows
var mentricsLogo = element(by.css('a.logo'));
var searchedUsername = "TESTUSER26";
//somehow the code didn't work by itself so I had to place it inside of random function whuch I didn't care about
mentricsLogo.isPresent().then(function(result) {
return tableRows.filter(function(eachRow, index) {
//get text of the whole row and separate it by columns
return eachRow.getText().then(function(text){
text=text.split(" ")
// I get third element is username
if (text[2]===searchedUsername){
var xpathIndex = Number(index)+1
element(by.xpath("//*[@id='user-list-content']/div[2]/div[2]/div[1]/div[2]/div[1]/table/tbody/tr["+xpathIndex+"]/td[1]/a")).click()
}
})
});
});
我知道它可能看起来不合理,但没有其他任何对我有用。