2016-03-02 120 views
0

無法讀取屬性「isElementPresent」我的工作如何使用Node.js,硒的webdriver,摩卡,柴一些QE測試。遺漏的類型錯誤:未定義

我創建的UI測試,跑進我的測試中失敗的問題。

這是我收到的錯誤:

Uncaught TypeError: Cannot read property 'isElementPresent' of undefined 
     at test/admin/users/add_user/org_admin_adds_new_users_positive.js:65:29 
     at node_modules/selenium-webdriver/lib/webdriver/webdriver.js:720:12 

我不明白我在做什麼錯。我在頁面對象中創建的所有方法都能正常工作。我甚至可以看到Firefox運行測試並正確添加組織,所以我知道我正確地使用了selenium-webdriver(大部分是)。

我測試的邏輯是:1)通過一個模式窗口2)驗證我們已經正確地通過測試,看看是否是以前的屏幕上的元素是現在可見的加入一個組織加入了組織。

我headlessly運行我的測試,我與我們正在使用,所以我想通過引入wait方法會解決我的問題和脆弱的測試服務器的一些問題。

這裏是鏈接到的方法,我試圖用: http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_WebDriver.html#wait

我基本上扭捏這個答案的SO Q代表我自己的目的: Selenium WebDriver wait till element is displayed

它轉向這個:

this.driver.wait(function() { 
    return this.driver.isElementPresent(By.css('div.AppBar')); 
}, 10000); 

這裏是我的整個測試代碼:

var driver = require('selenium-webdriver'); 
var chai = require('chai'); 
var expect = chai.expect; 
var adminVar = require('_/variables/admin_variables'); 
var AdminLogin = require('_/pageObject/admin/login/index'); 
var Common = require('_/pageObject/admin/login/common/index'); 
var HamburgerMenu = require('_/pageObject/admin/login/common/hamburgerMenu/index'); 
var Users = require('_/pageObject/admin/login/users/index'); 
var AddUserModal = require('_/pageObject/admin/login/users/addUserModal/index'); 

var userVar = require('_/variables/users_variables.json'); 

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

describe('Admin Tests - Org Admin User', function() { 
    this.timeout(500000); 
    before(function() { 
    this.driver = new driver.Builder().withCapabilities(driver.Capabilities.firefox()).build(); 
    this.driver.get(adminVar.local.adminSignin); 

    var adminLogin = new AdminLogin(this.driver); 
    adminLogin.fillEmail(); 
    adminLogin.fillPassword(); 
    adminLogin.signin(); 

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

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

    describe('would like to click Users panel', function() { 
    before(function() { 
     var com = new Common(this.driver); 
     com.clickHamburger(); 

     var hamburgMenu = new HamburgerMenu(this.driver); 
     hamburgMenu.clickUser(); 
    }); 

    describe('add a new user', function() { 
     beforeEach(function() { 
     var users = new Users(this.driver); 
     this.driver.sleep(500); 
     users.addNewUser(); 
     return this.driver.manage().timeouts().implicitlyWait(3500); 
     }); 

     afterEach(function() { 
     return this.driver.manage().timeouts().implicitlyWait(3500); 
     }); 

     it('correctly add user: name - Model Employee && email - [email protected]', function() { 
     var userModal = new AddUserModal(this.driver); 
     this.driver.manage().timeouts().pageLoadTimeout(10000); 
     userModal.addUser(userVar.goodUser1.name, userVar.goodUser1.email); 

     var users = new Users(this.driver); 
     this.driver.wait(function() { 
      return this.driver.isElementPresent(By.css('div.AppBar ul.AppBar-breadcrumbs')); 
     }, 10000); 
     return expect(users.toggleFilter.isDisplayed()).to.eventually.equal(true); 
     }); 

     it('correctly add user: name - £∆ΩΩ¥ ßœ†∑®§ && email - [email protected]', function() { 
     var userModal = new AddUserModal(this.driver); 
     this.driver.manage().timeouts().pageLoadTimeout(10000); 
     userModal.addUser(userVar.badUser3.name, userVar.badUser3.email); 

     var users = new Users(this.driver); 
     this.driver.wait(function() { 
      return this.driver.isElementPresent(By.css('div.AppBar ul.AppBar-breadcrumbs')); 
     }, 10000); 
     return expect(users.toggleFilter.isDisplayed()).to.eventually.equal(true); 
     }); 
    }); 

    }); 

}); 

下面是我使用這個代碼相關頁面對象:

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

    var name; 

    this.pageHeader = this.driver.findElement({ 
     css: 'div.AppBar ul.AppBar-breadcrumbs > li > span' 
    }); 

    this.toggleFilter = this.driver.findElement({ 
     css: 'div.AppBar button.AppBar-filter' 
    }); 

    this.inputFilter = this.driver.findElement({ 
     css: 'div.OrganizationListFilters-byText input[type="text"]' 
    }); 

    this.addButton = this.driver.findElement({ 
     css: '#app > div > div > div > div > div.Page-wrapper > div:nth-child(2) > div.Material-button--primary > div > button' 
    }); 
    } 

    clearSearch() { 
    this.inputFilter.clear(); 
    } 

    inputSearch(name) { 
    this.inputFilter.clear(); 
    this.inputFilter.sendKeys(name); 
    return this.driver.manage().timeouts().implicitlyWait(1000); 
    } 

    toggleSearch() { 
    this.toggleFilter.click(); 
    return this.driver.manage().timeouts().implicitlyWait(4500); 
    } 

    addNewOrgButton() { 
    this.driver.manage().timeouts().implicitlyWait(7500); 
    this.addButton.click(); 
    return this.driver.manage().timeouts().implicitlyWait(2500); 
    } 

    menuButtonAfterAction() { 
    this.driver.manage().timeouts().implicitlyWait(1500); 
    this.driver.findElement({ 
     css: 'td.RowMenu button.RowMenu-button' 
    }).click(); 
    return this.driver.manage().timeouts().implicitlyWait(2500); 
    } 
} 

module.exports = Organizations; 

,正如我說上面我相信我使用和引用硒的webdriver的加入的組織模式

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

    var name, subdomain, type, id; 

    this.modalTitle = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog h3' 
    }); 

    this.nameInput = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog input[name="name"]' 
    }); 

    this.domainInput = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog input[name="domain"]' 
    }); 

    this.typeInput = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog input[name="type"]' 
    }); 

    this.idInput = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog input[name="externalID"]' 
    }); 

    this.enableExperience = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog input[name="hasExperience"]' 
    }); 

    this.subdomainInput = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog input[name="subdomain"]' 
    }); 

    this.cancelButton = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog button.AddOrganizationDialog-cancel' 
    }); 

    this.submitButton = this.driver.findElement({ 
     css: 'div.AddOrganizationDialog button.AddOrganizationDialog-submit' 
    }); 
    } 

    getHeaderText() { 
    return this.driver.modalTitle.getText(); 
    } 

    cancelModal() { 
    this.cancelButton.click(); 
    } 

    newOrg(name, subdomain, type, id) { 
    this.driver.manage().timeouts().implicitlyWait(3000); 
    this.nameInput.clear(); 
    this.nameInput.sendKeys(name); 
    this.typeInput.clear(); 
    this.typeInput.sendKeys(type); 
    this.idInput.clear(); 
    this.idInput.sendKeys(id); 
    this.enableExperience.click(); 
    this.subdomainInput.clear(); 
    this.subdomainInput.sendKeys(subdomain); 
    this.submitButton.click(); 
    return this.driver.manage().timeouts().implicitlyWait(5000); 
    } 
} 

module.exports = AddOrgModal; 

正確地說,這些文檔有點令人困惑,因爲它們沒有提供實際的例子,我仍然使用測試框架有點新。

有什麼我失蹤?

TL:博士版本:

我相信我正確地引用硒的webdriver此功能:

this.driver.wait(function() { 
    return this.driver.isElementPresent(By.css('div.AppBar')); 
}, 10000); 

,但我仍然得到錯誤

Uncaught TypeError: Cannot read property 'isElementPresent' of undefined 
      at test/admin/users/add_user/org_admin_adds_new_users_positive.js:65:29 
      at node_modules/selenium-webdriver/lib/webdriver/webdriver.js:720:12 
+0

你能簡化你的問題嗎?爲了解決您遇到的問題,需要仔細閱讀和思考。 – djangofan

+0

@djangofan我添加了一個tldr,現在清楚了嗎?我傾向於爲我的問題添加很多信息,對此抱歉。 – azemPC

+0

我面對同樣的問題與this.driver.wait,你解決了嗎? – acido

回答

0

嘗試,返回this.isElementPresent(By.css('div.AppBar'));

+0

這樣做說,By是未定義的,將此添加到By說css是未定義的,它基本上將undefined移動到下一個方法,這使得我相信我可能不正確地調用webdriver,但我不確定。 – azemPC

0

我可能是錯的,因爲我不代碼中使用Node.js的硒,但我猜想,.isElementPresent方法纔有意義上的元素實例操作,而不是驅動器本身的實例。

換句話說,我想這會更有意義:

this.driver.findElement(By.css('div.AppBar')).isElementPresent() 

如果我錯了,原諒我。你的問題的性質使我不得不猜測。

相關問題