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