2014-08-27 8 views
2

Я использую Javascript, webdriverio (v2.1.2), чтобы выполнить извлечение данных с внутреннего сайта. Внутренний сайт включен SSO, поэтому, если я был аутентифицирован в другом приложении, мне не нужно входить в это приложение (обычно в корпоративных приложениях интрасети). я планирую достичь ниже,Как проверить, есть ли страница входа в систему с помощью webdriverio

  • Создание клиента с необходимыми возможностями
  • Передайте нужный URL
  • Для удовольствия: Печать название страницы
  • Проверьте, если элемент существует на стр. Если да, то это страница входа. Если нет, то это не страница входа в систему

    login = function (username, password) { 
    if (!browserClientUtil) { 
        throw "Unable to load browserClientUtil.js"; 
    } 
    browserClientUtil 
        .createClient() 
        .url(_Url) 
        .title(function (err, res) { 
         console.log('Title is: ' + res.value); 
        }) .isExisting('input#login_button.login_button', function (err, isExisting) { 
        browserClientUtil.getCurrentClient() 
         .setValue('input#USER.input', username) 
         .setValue('input#PASSWORD.input', password) 
         //.saveScreenshot('ultimatixLoginDetails.png') 
         .click('input#login_button.login_button') 
         .pause(100); 
         handlePostLogin(); 
    }); 
    

    };

Это лучший способ сделать? Я попытался отделить код для проверки страницы входа в отдельной функции, это не сработало, поскольку все в webdriver происходит как часть обратного вызова, и я не уверен, правильно ли я делаю это. Как вернуться из обратного вызова, который в свою очередь станет конечным значением, возвращаемым этой функцией?

login = function (username, password) { 
    if (!browserClientUtil) { 
     throw "Unable to load browserClientUtil.js"; 
    } 
    browserClientUtil 
     .createClient() 
     .url(_Url) 
     .title(function (err, res) { 
      console.log('Title is: ' + res.value); 
     }); 
     if(isThisLoginPage()){ 
      browserClientUtil.getCurrentClient() 
      .setValue('input#USER.input', username) 
      .setValue('input#PASSWORD.input', password) 
      //.saveScreenshot('ultimatixLoginDetails.png') 
      .click('input#login_button.login_button') 
      .pause(100); 
      handlePostLogin(); 
     } 
}; 

    isThisLoginPage = function() { 
    var client = browserClientUtil.getCurrentClient(); 
    if(!client) { 
     throw "Unable to get reference for current client, hence cannot validate if this is login page."; 
    } 

    client.isExisting('input#login_button.login_button', function (err, isExisting) { 
     if(isExisting) { 
      return true; 
     } 
    }); 
    return false; 
}; 
+0

Я знаю, что, если вызов внутренняя функция является асинхронным, то все функции «оборачивания» этот вызов должен также быть асинхронными, чтобы «вернуться ' ответ. Итак, мой последний вопрос был бы - был ли мой первый метод лучшим способом или, возможно, я должен заглянуть в отложенные и обещания сделать код модульным и читаемым? [link] (http://stackoverflow.com/questions/6847697/how-to-return-value-from-an-asynchronous-callback-function) – rohitmohta

ответ

6

Вы можете создать свой собственный рабочий процесс, создавая собственные команды, которые окутывают другие. Например, вы можете сделать собственную команду для входа в систему:

browserClientUtil.addCommand("login", function(url, user, pw, cb) { 
    this.url(url) 
     .setValue('#username', user) 
     .setValue('#password', pw) 
     .submitForm('#loginForm') 
     .call(cb); 
}); 

Это позволяет скрывать «сложные» асинхронные действия WebDriver позади простой функции. Легко создать мощную инструментальную цепочку. В конце ваш тестовый сценарий выглядит следующим образом:

browserClientUtil 
    .login("http://example.com/login", "john.doe", "testpass") 
    .getTitle(function(err, title) { 
     console.log(title); 
    }) 
    // ... 

Приветствиях

+0

круто, попробуем это завтра. – rohitmohta