【发布时间】:2015-08-26 02:01:25
【问题描述】:
我正在尝试在 Cucumber 中构建一个测试步骤,该步骤将登录具有给定角色的测试用户。我的方法是尝试查看是否存在“退出”选项并单击它,然后尝试登录。问题在于,promise 结构不能保证首先注销,而且由于我不能假设我总是首先登录,所以我需要一种方法来基本上等到这种情况发生后再继续。
我的测试步骤如下所示:
this.Given(/^I am logged in as a\/an "([^"]*)"$/, function(roleName, callback) {
console.log('Starting login as ', roleName);
var myBrowser = this.browser;
this.browser
.setViewportSize({width: 1000, height: 600})
.url(url.resolve(process.env.HOST, '/'));
this.browser
.waitForVisible('#main_menu').then(function() {
console.log('#main_menu is visible' );
myBrowser.waitForVisible('#appSignOut').then(function() {
console.log('Logging out now');
myBrowser.click('#appSignOut');
});
myBrowser.waitForVisible('#appSignIn').then(function() {
console.log('Logging in as ', roleName);
myBrowser.click('#appSignIn');
myBrowser.waitForVisible('#username').then(function() {
myBrowser
.setValue('#username', 'test' + roleName)
.setValue('#password', 'test' + roleName)
.leftClick('#signin')
.call(callback);
});
});
});
console.log('Done logging in as ', roleName);
});
有没有办法在myBrowser.waitForVisible('#appSignOut') 之后停止?我只是错过了预期的用途吗?
更新
我尝试了一种新方法,但还是不行:
this.Given(/^I am logged in as a\/an "([^"]*)"$/, function(roleName, callback) {
var myBrowser = this.browser;
this.browser
.setViewportSize({width: 1000, height: 600})
.url(url.resolve(process.env.HOST, '/'));
this.browser
.waitForVisible('#main_menu')
.then(myBrowser.isVisible('#appSignOut').then(function(isVisible) {
if (isVisible) {
myBrowser.click('#appSignOut');
}
}))
.then(myBrowser.waitForVisible('#appSignIn').then(function() {
myBrowser
.click('#appSignIn')
.waitForVisible('#username')
.setValue('#username', 'test' + roleName)
.setValue('#password', 'test' + roleName)
.leftClick('#signin');
}))
.call(callback);;
});
这里的逻辑是:
- #main_menu 可见时(页面已加载)
- 然后 - 如果存在 #appSignOut,请单击它
- 然后 - 等待 #appSignIn 变为可见,然后完成登录
我得到的错误是:
[chimp] Detected an unhandledRejection.
[chimp][hooks] Reason:
[chimp][hooks] RuntimeError
[chimp][hooks] no such element
但我认为这些都不起作用。弹出式浏览器的速度太快,我看不到发生了什么,而且 cucumber.log 也没有给我任何关于它在做什么的好的指示。
【问题讨论】:
-
我很好奇,您是否尝试过直接使用 Meteor.logout() 和 Meteor.loginWithPassword() 函数而不是手动使用 UI?也许使用 waitUntil() webdriver.io/api/utility/waitUntil.html ,当 Meteor.userId() 为空时,注销将解决。当 Meteor.userId() 为非 null 时,登录将在哪里解析。
标签: meteor cucumber webdriver-io meteor-velocity