2017-08-15 34 views
1

Mise à jour: Problème résolu, consultez le commentaireID de session non valide lors de l'utilisation page objet sur le concombre Nightwatch

Je suis en train de convertir certains utilisent fréquemment test pour objet page et je donne les résultats suivants comme pg.js :

var myCommands ={ 
    security:function(username){ 
     this.click('@logon') 
      .waitForElementVisible('@id',20000) 
      .click('@id') 
      .setValue('@id',username) 
      .click('@device') 
    }, 
    password:function(username){ 
     console.log(this) 
     return this.useXpath() 
        .navigate() 
        .assert.elementPresent('@logon', 20000) 
        .click('@logon') 
        .waitForElementVisible('@id',20000) 
        .click('@id') 
        .setValue('@id',username) 
        .click('@password') 
        .waitForElementVisible('//input[@name="Answer"]', 20000); 
    } 
}; 

module.exports={ 
    url : 'https://mywebsite', 
    commands :[myCommands], 
    elements:{ 

     logon:{ 
      locateStrategy: 'xpath', 
      selector:'//a[@title="Log on"]' 
     }, 
     id:{ 
      locateStrategy: 'xpath', 
      selector:'//input[@name="userid"]' 
     }, 
     device:{ 
      locateStrategy: 'xpath', 
      selector:'//a[text() = "Login with PIN"]' 
     }, 
     password:{ 
      locateStrategy: 'xpath', 
      selector:'//a[text() = "Login with passwords"]' 
     } 
    } 

}; 

de l'console.log (cela), je peux voir que l'ID de session et le contexte est nul: enter image description here

Et dans mes test.js, j'ai ces deux lignes:

var logon=client.page.pg() 
.... 
logon.password(username) 

Quand je lance le test, il montre

Error: Creating screenshot was not successful. Response was: 
{ status: -1, 
    value: 
    { error: 'invalid session id', 
    message: 'No active session with ID null', 
    stacktrace: '' }, 
    errorStatus: 6, 
    error: '' } 

Ma question est pourquoi la session est nulle? et s'il y a un problème comment je configure l'objet page dans pg.js ou test.js.

+0

Problème résolu: après avoir utilisé l'objet page dans un test, vous devez utiliser Pageobject.api pour appeler les fonctions, et ne pouvez pas faire de client.whateveritis(). par exemple,'logon.password (nom d'utilisateur) .api.elements (blablabla) ' – Raymond

Répondre

0

Avez-vous un fichier nightwatch.conf.js configuré pour afficher la structure des objets de votre page?

J'utilise Nightwatch-concombre avec le modèle objet page et ma structure est la suivante:

//nightwatch.conf.js 
const seleniumServer = require('selenium-server') 
const phantomjs = require('phantomjs-prebuilt') 
const chromedriver = require('chromedriver') 

require('nightwatch-cucumber')({ 
    cucumberArgs: ['--require', 'hooks.js', '--require', 'features/step_definitions', '--format', 'pretty', '--format', 'json:reports/cucumber.json', 'features'] 
}) 

module.exports = { 
    output_folder: 'reports', 
    live_output: false, 
    disable_colors: false, 
    page_objects_path: 'pages', 
    test_workers: false, 
    selenium: { 
    start_process: true, 
    server_path: seleniumServer.path, 
    log_path: '', 
    host: '127.0.0.1', 
    port: 4444 
    }, 
    test_settings: { 
    default: { 
     launch_url: 'whatevertheurlis.com', 
     selenium_port: 4444, 
     selenium_host: '127.0.0.1', 
     globals: { 
     base_url: 'baseurl.com' 
     }, 
     desiredCapabilities: { 
     browserName: 'chrome', 
     javascriptEnabled: true, 
     acceptSslCerts: true 
     }, 
     selenium: { 
     cli_args: { 
      'webdriver.chrome.driver': chromedriver.path 
     } 
     }, 
     screenshots: { 
     enabled : true, 
     on_failure : true, 
     path : 'screenshots/default' 
     } 
    } 
    } 
} 

C'est le loginPage:

//pages/loginPage.js 
module.exports = { 
    url: function() { 
    return this.api.globals.base_url + '/#/login'; 
    }, 

    elements: { 
    body: 'body', 
    error: 'div.error', 
    header: '.header-title', 
    emailInput: '#field_email', 
    passwordInput: '#field_password', 
    submitButton: '.btn-success' 
    }, 

    commands: [{ 
    goTo: function() { 
     return this.navigate() 
       .waitForElementVisible('@body', 3000); 
    } 
    }] 
} 

Et voici la loginSteps:

//features/step_definitions/loginSteps.js 
const { client } = require('nightwatch-cucumber') 
const { defineSupportCode } = require('cucumber') 

const loginPage = client.page.loginPage(); 
const navbar = client.page.navbar(); 
const resetPasswordPage = client.page.resetPasswordPage(); 
const shared = client.page.shared(); 

defineSupportCode(({ Given, Then, When }) => { 
    Given(/^I go to login page$/,() => { 
    return loginPage 
     .goTo(); 
    }) 
}) 

Nous utilisons une méthode légèrement différente, mais j'espère que cela vous aidera à voir le layou t des tests.