在javascript

时间:2016-08-09 14:51:21

标签: javascript jasmine promise protractor

我知道这个类似的问题已存在,但我还没有从他们找到的答案中得到很多。我不是想在这里懒惰而不是先做我的研究,因为我有!

我在JavaScript中使用Protractor / Jasmine。

我有一个存储在页面对象文件中的方法:

this.verifyUserExists = function (username){
    driver.findElements(by.css('.ui-datatable-data > tr > td:nth-of-type(1)')).then(function (elements) {
        for (i = 0; i < elements.length; i++) {
            (function (index) {
                elements[index].getText().then(function (users) {
                    if (users.trim().toLowerCase() == username.trim().toLowerCase()) {
                        console.log('Username: ' + users.trim() + ' found in the list.');
                        expect(true).toBeTruthy();
                    }
                }).catch(function (err) { });
            })(i);
        }
    }).catch(function (err) { });
}

在我的主要考试中,我会做obj.VerifyUserExists('anon123');

如图所示,该方法接受字符串用户名并通过表中的用户名列表进行搜索。如果用户存在,则代码有效,并且测试通过。但是,如果用户不存在且不是列表中的最后一项,则会错误地失败。

例如:

if (users.trim().toLowerCase() == username.trim().toLowerCase()) {
    console.log('Username: ' + users.trim() + ' found in the list.');
    expect(true).toBeTruthy();
} 
else {
  //expect to fail
}

有了上述内容 - 如果我们有5个用户名,其中4个将错误地失败。

我尝试添加一个布尔标志,但它在各处都未定义。所以我的问题是我将如何做以下事情:

if(user == username){
   //true
   //exit
}
else if (end of list && name not found)
{
   //false
   //exit
}

1 个答案:

答案 0 :(得分:1)

您可以直接获取所有元素的文本,并使用expect()。toContain()匹配器来检查定位器中是否存在所需的值,而不是循环遍历所有元素。请看下面的例子。

var displayedUserNames = element.all(by.css('.ui-datatable-data > tr > td:nth-of-type(1)')).getText(); 
//above line will get you all available username as Array.
expect(displayedUserNames).toContain(actualUserNametobeDisplayed)