2015-08-26 4 views
3

Я пытаюсь создать тестовый шаг в 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);; 
}); 

Логика здесь была:

  1. Когда #main_menu видна (страница загружен)
  2. тогда - если присутствует #appSignOut, щелкните по нему
  3. затем - ждать #appSignIn, чтобы стать видимым, а затем завершить логин

Ошибки я получаю:

[chimp] Detected an unhandledRejection. 
[chimp][hooks] Reason: 
[chimp][hooks] RuntimeError 
[chimp][hooks] no such element 

Но я не думаю, что все это работает на всех. Всплывающий браузер слишком быстро для меня, чтобы посмотреть, что происходит, и cucumber.log не дает мне никаких хороших доказательств того, что он делает.

+1

Мне любопытно, вы пробовали использовать Meteor.logout() и функции Meteor.loginWithPassword() напрямую, а не вручную пользовательский интерфейс? Возможно, используя waitUntil() http://webdriver.io/api/utility/waitUntil.html, где logout будет разрешаться, когда Meteor.userId() имеет значение NULL. и где логин будет разрешаться, когда Meteor.userId() не имеет значения null. – looshi

ответ

1

Это старый вопрос, надеюсь, вы нашли свой ответ с тех пор, но я отвечу, что он может помочь другим.

При использовании обещаний вы должны убедиться, что используете их повсюду (в большинстве случаев, или вы действительно хотите, чтобы операции выполнялись асинхронно).

В коде это будет:

this.Given(/^I am logged in as a\/an "([^"]*)"$/, function(roleName) { 
    return this.browser 
    .setViewportSize({width: 1000, height: 600}) 
    .url(url.resolve(process.env.HOST, '/')) 
    .waitForVisible('#main_menu') 
    .isVisible('#appSignOut') 
    .then(function(isVisible) { 
     if (isVisible) { 
     return this.click('#appSignOut'); 
     } 
    }) 
    .waitForVisible('#appSignIn') 
    .click('#appSignIn') 
    .waitForVisible('#username') 
    .setValue('#username', 'test' + roleName) 
    .setValue('#password', 'test' + roleName) 
    .leftClick('#signin'); 
}); 

Вы можете заметить это путь более читабельным, чем раньше.

Ключевые вещи, которые я изменил:

  • Я прикован все вместе (webdriverio позволяет это сделать)
  • При использовании.Тогда() this соответствует this.browser так что вы можете приковать
  • Возвращая результат this.click() из тогдашних() вы можете продолжать цепочки
  • CucumberJS может обрабатывать обещания, для этого вам необходимо удалить параметр обратного вызова и возвращать Promise. В этом случае просто возвращает результат вызова API webdriverio

Приветствия

0

У меня возникли проблемы с использованием ChimpJS для автоматического входа в мое приложение Meteor с использованием формы входа в систему, я получал «login forbidden», используя http://webdriver.io/api/protocol/execute.html для выполнения Meteor.loginWithPassword() (будьте осторожны из-за синхронного характера версии ChimpJS WebDriverIO не использует .then()), как предложил looshi для меня: http://docs.meteor.com/#/full/meteor_loginwithpassword

 Смежные вопросы

  • Нет связанных вопросов^_^