2016-03-02 208 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() 

如果我错了,原谅我。你的问题的性质使我不得不猜测。

相关问题