这正是我想要做的
我用表格打开一个页面,该表格包含有关用户的信息
我的getText()元素指示表中的用户数(例如“列表中的11个用户”)
我删除“列表中的用户”部分,并将字符串转换为整数,以便稍后在for循环中使用
我需要通过用户名(第9列)查找某些用户,并获取j数字,该数字是该用户信息所在的行数(这就是我被卡住的地方)
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。这是怎么回事?如何解决?
PS我会给我在做什么的例子 页面的截图 ,我想找到我的用户,并单击“编辑”与之相关联的按钮。我只需在第一列第六行中单击一个单元格即可。但是,如果要添加更多用户,我想使其可靠。为此,我需要搜索用户名列,记录该用户在表中所在的行号,然后导航到找到的行号第一列中的单元格。
对我来说,简单的方法是访问表中要查找的用户的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() } }) }); });
我知道它看起来可能不合理,但没有其他对我有用。