【问题标题】:Protractor script doesn't work properly量角器脚本无法正常工作
【发布时间】:2018-06-09 13:25:36
【问题描述】:

这正是我想要做的事情

我打开一个页面,其中包含一个包含用户信息的表格

我 getText() 的元素表示表中的用户数量(例如“列表中的 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。有什么问题?如何解决?

附:我将举例说明我在做什么 screenshot of the page 我想找到我的用户并单击与之关联的“编辑”按钮。我可以简单地单击第一列第 6 行中的一个单元格。但我想让它可靠,以防添加更多用户。为此,我需要搜索用户名列,记录该用户在表中所在的行号,然后导航到我找到的行号上第一列中的一个单元格。

【问题讨论】:

    标签: javascript angularjs automation protractor


    【解决方案1】:

    说实话,我没有检查你在检查什么。

    首先你应该考虑使用

    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();
                }
        });
    });
    

    【讨论】:

    • 我确定我的表有多少行的部分运行良好。是的,按照自己的方式做可能会更简单,但这不是我面临困难的地方。我添加了 P.S.我的问题中的段落,请看一下我在做什么的解释。谢谢
    • 更接近但仍然不起作用。它确实找到了我正在寻找的用户的行(让我们说它在我的表中的 11 个中的第 6 个)它确实打开了编辑窗口,但随后它尝试再单击该按钮 5 次 (11-6) ,导致错误,因为按钮不再可见。我发现执行
    • 嗯听起来很奇怪。你还有for 循环吗?您可以粘贴您当前的代码吗?
    【解决方案2】:

    对我来说,简单的方法是访问我在表中查找的用户的 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()
                    }
                })
            });
    });
    

    我知道它可能看起来不合理,但没有其他任何东西对我有用。

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2014-12-07
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 2015-07-27
      相关资源
      最近更新 更多