2015-12-29 31 views
0

正確使用自定義JavaScript文件,我有一個奇怪的問題,努力實現利用硒的webdriver和節點Page對象的模式進入我的測試套件。無法在一個測試套件

我能夠使用的第一個頁面對象pageObject /管理/登入/ index.js。該文件具有選擇器和方法,可以填寫登錄頁面上的表單,以便用戶自行登錄。登錄後,下一頁面對象完全失敗。下一步應該簡單地驗證用戶名是在頁面上找到的(使用適當的選擇器和getText方法)。

這裏是我的測試套件:

var driver = require('selenium-webdriver'); 
var chai = require('chai'); 
var sinon = require('sinon'); 
var sinonChai = require("sinon-chai"); 
var expect = chai.expect; 
var should = chai.should; 
var config = require('../../../../variables'); 
var AdminPage = require('../../../../pageObject/admin/login/index.js'); 
var HeaderProfile = require('../../../../pageObject/admin/login/common/headerProfile/index.js'); 

chai.use(require('chai-as-promised')); 
chai.use(sinonChai); 

describe('Webdriver - Admin Tests - User Alice', function() { 
    var adminVar = process.env.envVar; 
    var login = config[adminVar].adminLogin; 
    var user = config[adminVar].role.adminUser.name; 
    var email = config[adminVar].role.adminUser.email; 
    var pw = config[adminVar].role.adminUser.password; 
    before(function() { 
    this.timeout(50000); 
    this.driver = new driver.Builder().withCapabilities(driver.Capabilities.firefox()).build(); 
    this.driver.get(login); 
    var adminPage = new AdminPage(this.driver); 

    adminPage.fillEmail(email); 
    adminPage.fillPassword(pw); 
    adminPage.signin(); 

    return this.driver.manage().timeouts().implicitlyWait(250); 
    }); 

    after(function() { 
    return this.driver.quit(); 
    }); 

    describe('would like to', function() { 
    it('verify they have global access', function() { 
     this.driver.manage().timeouts().implicitlyWait(500); 

     var headerProfile = new HeaderProfile(this.driver); 

     return expect(headerProfile.getName()).to.eventually.equal(user); 
    }); 
    }); 

}); 

這裏是我的登錄頁面對象:

/*jslint node: true */ 
"use strict"; 
var webdriver = require('selenium-webdriver'); 
var config = require('../../../variables.json'); 

var adminVar = process.env.envVar; 
var login = config[adminVar].adminLogin; 
var user = config[adminVar].role.adminUser.name; 
var email = config[adminVar].role.adminUser.email; 
var pw = config[adminVar].role.adminUser.password; 


class AdminPage { 
    constructor(driver) { 
    this.driver = driver; 
    this.driver.manage().timeouts().implicitlyWait(2000); 

    this.emailField = this.driver.findElement({ 
     css: 'input[name="email"]' 
    }); 

    this.passwordField = this.driver.findElement({ 
     css: 'input[name="password"]' 
    }); 

    this.loginButton = this.driver.findElement({ 
     css: 'button[type="submit"]' 
    }); 
    } 

    fillEmail(email) { 
    this.emailField.sendKeys(email); 
    } 

    fillPassword(password) { 
    this.passwordField.sendKeys(password); 
    } 

    signin() { 
    this.loginButton.click(); 
    } 
} 

module.exports = AdminPage; 

和Page對象爲headerProfile:

/*jslint node: true */ 
"use strict"; 
var webdriver = require('selenium-webdriver'); 


class HeaderProfile { 
    constructor(driver) { 
    this.driver = driver; 
    this.driver.manage().timeouts().implicitlyWait(2000); 

    this.profileName = this.driver.findElement({ 
     css: '#app > div > div:nth-child(1) > div > div > div:nth-child(1) > div:nth-child(2) > div:nth-child(2) > div:nth-child(1)' 
    }); 

    this.profileMenu = this.driver.findElement({ 
     css: '#app > div > div:nth-child(1) > div > div > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > button' 
    }); 

    this.profileOrg = this.driver.findElement({ 
     css: 'div.secondaryText' 
    }); 
    } 

    getName() { 
    this.profileName.getText(); 
    } 

    clickMenu() { 
    this.profileMenu.click(); 
    } 
} 

module.exports = HeaderProfile; 

使用此我得到運行代碼時出現以下錯誤:

1) Webdriver - PC6 - Admin Tests - User Alice would like to verify they have global access: 
    TypeError: Cannot read property 'then' of undefined 
     at assertIsAboutPromise (node_modules/chai-as-promised/lib/chai-as-promised.js:47:38) 
     at null.<anonymous> (node_modules/chai-as-promised/lib/chai-as-promised.js:65:17) 
     at addProperty (node_modules/chai/lib/chai/utils/addProperty.js:42:29) 
     at Context.<anonymous> (test/admin/dashboard/adminUser/pdvi-2377.js:51:48) 

2) Webdriver - PC6 - Admin Tests - User Alice "after all" hook: 
    Uncaught Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:49665 
    at ClientRequest.<anonymous> (node_modules/selenium-webdriver/http/index.js:174:16) 
    at Socket.socketErrorListener (_http_client.js:265:9) 
    at emitErrorNT (net.js:1253:8) 
From: Task: WebDriver.manage().timeouts().implicitlyWait(2000) 
    at webdriver.WebDriver.schedule (node_modules/selenium-webdriver/lib/webdriver/webdriver.js:362:15) 
    at webdriver.WebDriver.Timeouts.implicitlyWait (node_modules/selenium-webdriver/lib/webdriver/webdriver.js:1352:23) 
    at Context.<anonymous> (test/admin/dashboard/adminUser/pdvi-2377.js:57:39) 

我想過不使用柴作爲許諾的與使用普通柴期望通過改變我的最後描述語句來幫我的問題:

describe('would like to', function() { 
    it('verify they have global access', function() { 
    this.driver.manage().timeouts().implicitlyWait(500); 

    var headerProfile = new HeaderProfile(this.driver); 

    return expect(headerProfile.getName()).to.equal(user); 
    }); 
}); 

,但它產生這個錯誤:

1) Webdriver - PC6 - Admin Tests - User Alice would like to verify they have global access: 
    AssertionError: expected undefined to equal 'John Doe' 
    at Context.<anonymous> (test/admin/dashboard/adminUser/pdvi-2377.js:51:49) 

2) Webdriver - PC6 - Admin Tests - User Alice "after all" hook: 
    Uncaught Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:57292 
    at ClientRequest.<anonymous> (node_modules/selenium-webdriver/http/index.js:174:16) 
    at Socket.socketErrorListener (_http_client.js:265:9) 
    at emitErrorNT (net.js:1253:8) 
From: Task: WebDriver.manage().timeouts().implicitlyWait(2000) 
    at webdriver.WebDriver.schedule (node_modules/selenium-webdriver/lib/webdriver/webdriver.js:362:15) 
    at webdriver.WebDriver.Timeouts.implicitlyWait (node_modules/selenium-webdriver/lib/webdriver/webdriver.js:1352:23) 
    at Context.<anonymous> (test/admin/dashboard/adminUser/pdvi-2377.js:57:39) 

但是,如果我只是把選擇進入我的形容語句如下所示:

describe('would like to', function() { 
    it('verify they have global access', function() { 
    this.driver.manage().timeouts().implicitlyWait(500); 

    var userName = this.driver.findElement({ 
     css: '#app > div > div:nth-child(1) > div > div > div:nth-child(1) > div:nth-child(2) > div:nth-child(2) > div:nth-child(1)' 
    }).getText(); 

    return expect(userName).to.eventually.equal(user); 
    }); 
}); 

我的代碼能夠成功運行,並且所有測試都通過了零錯誤。

這使我相信,我可能無法正確正確加載我的網頁對象或者也許有可能與硒的webdriver一些時間問題?我的方法顯然返回一個選擇中的文本爲undefined

如果我能夠直接在我的it語句中使用選擇器,這並不意味着我沒有在我的headerProfile/index.js中正確使用我的選擇器頁面對象?如果他們未定義,那麼問題應該在頁面對象的某個地方是正確的?

我也不太清楚,如果這個問題是硒的webdriver或香草的javascript問題。

我使用頁面對象的初衷是希望有選擇器的中央位置,而無需改變選擇在每個測試文件,但只改變選擇在一箇中心位置。也許有更好的方法來完成這個?

有什麼建議嗎?

回答

1

的問題可能是在PageObjects的函數不返回任何東西。默認返回值是'未定義'。

你試過:

getName() { 
    return this.profileName.getText(); 
} 

這應該返回Gettext中的承諾(),這將有。然後方法。希望清除「無法讀取屬性」,然後清除「未定義」錯誤。

+0

呃。我感覺很愚蠢。這有助於解決我的問題,因此我能夠通過一堆票子來衝擊!謝謝。 – azemPC