Я пытаюсь создать тестовый шаг в Cucumber, который войдет в систему для тестового пользователя с заданной ролью. Мой подход заключается в том, чтобы попытаться увидеть параметр «Выход» и нажать его, а затем попытаться войти в систему. Проблема заключается в том, что структура обещаний не гарантирует, что выход из системы происходит первым, и поскольку я не могу предположить, что я всегда вошел в систему первым, мне нужен способ в основном ждать, пока это не произойдет, прежде чем двигаться дальше.Есть ли способ подождать, пока еще не закончится другая цепочка обещаний WebDriverIO?
Мой тестовый шаг выглядит следующим образом:
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')
? Я просто пропущу предполагаемое использование?
Update
Я попробовал новый подход, но до сих пор не работает:
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() напрямую, а не вручную пользовательский интерфейс? Возможно, используя waitUntil() http://webdriver.io/api/utility/waitUntil.html, где logout будет разрешаться, когда Meteor.userId() имеет значение NULL. и где логин будет разрешаться, когда Meteor.userId() не имеет значения null. – looshi