在带有量角器的非角度站点上使用预期条件会导致"Type Error: Cannot read property 'bind' of undefined"



当我对通过Protractor的元素对象返回的web元素使用预期条件时,我看到了以下问题。我也试过用$,结果是一样的。我在Chrome V47的Node 4.2.4上使用Protractor 3.1.1。*

"类型错误:无法读取未定义的属性'bind'"

在询问之前,我搜索了论坛,了解到使用driver.findElement.使用硒元素的预期条件存在一些已知问题

然而,在使用元素对象本身时,我没有遇到类似的问题。

https://github.com/angular/protractor/issues/1853

我们有一个非angular应用程序用于登录页面,登录后将切换到angular。因此,我已经将ignoreSynchronization设置为true,稍后计划在登录后将其重置为false。下面是示例代码,感谢社区的任何想法。

页面对象文件

module.exports = {
    login: element(by.model('credentials.username')),
    password: element(by.model('credentials.password')),
    user: "Email",
    passwd: "Password",
    goButton: $('input.btn.btn-primary'),
    EC: protractor.ExpectedConditions,
    go: function() {
    browser.get("Application URL",30000);
    browser.wait(this.EC.elementToBeClickable(this.login),30000);
    },

下面是我的示例测试套件

var VMPage = require('./LoginPage.js');

   describe('App Demo', function() {
    beforeEach(function() {
    console.log("Before Each Started");
    browser.driver.manage().timeouts().implicitlyWait(30000);
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 1800000;
    browser.ignoreSynchronization = true;
    VMPage.go();
    VMPage.login();
    });
    it('Test Case', function() {
       console.log("***Test Started***");
    });
});

报告的堆栈跟踪如下所示:堆栈:

    TypeError: Cannot read property 'bind' of undefined
        at [object Object].ExpectedConditions.presenceOf (C:UsersPJAp
pDataRoamingnpmnode_modulesprotractorlibexpectedConditions.js:289:33)
        at [object Object].ExpectedConditions.visibilityOf (C:UsersPJ
AppDataRoamingnpmnode_modulesprotractorlibexpectedConditions.js:328:10)
        at [object Object].ExpectedConditions.elementToBeClickable (C:UsersPJ0
0366401AppDataRoamingnpmnode_modulesprotractorlibexpectedConditions.js:17
8:12)
        at Object.module.exports.go (D:protractor_gitDemo\Log
inPage.js:14:24)
        at Object.<anonymous> (D:protractor_gitDemo\LoginTest
.js:9:10)
        at C:UsersPJAppDataRoamingnpmnode_modulesprotractornode_
modulesjasminewd2index.js:96:23
        at new wrappedCtr (C:UsersPJAppDataRoamingnpmnode_modules
protractornode_modulesselenium-webdriverlibgoogbase.js:2468:26)
        at controlFlowExecute (C:UsersPJAppDataRoamingnpmnode_modu
lesprotractornode_modulesjasminewd2index.js:82:18)
    From: Task: Run beforeEach in control flow
        at Object.<anonymous> (C:UsersPJAppDataRoamingnpmnode_modu
lesprotractornode_modulesjasminewd2index.js:81:14)
        at attemptAsync (C:UsersPJAppDataRoamingnpmnode_modulespr
otractornode_modulesjasminenode_modulesjasmine-corelibjasmine-corejasmine
.js:1916:24)
        at QueueRunner.run (C:UsersPJAppDataRoamingnpmnode_modules
protractornode_modulesjasminenode_modulesjasmine-corelibjasmine-corejasm
ine.js:1871:9)
        at QueueRunner.execute (C:UsersPJAppDataRoamingnpmnode_mod
ulesprotractornode_modulesjasminenode_modulesjasmine-corelibjasmine-core
jasmine.js:1859:10)
        at Spec.Env.queueRunnerFactory (C:UsersPJAppDataRoamingnpm
node_modulesprotractornode_modulesjasminenode_modulesjasmine-corelibjasmi
ne-corejasmine.js:697:35)
        at Spec.execute (C:UsersPJAppDataRoamingnpmnode_modulespr
otractornode_modulesjasminenode_modulesjasmine-corelibjasmine-corejasmine
.js:359:10)
        at Object.fn (C:UsersPJAppDataRoamingnpmnode_modulesprotr
actornode_modulesjasminenode_modulesjasmine-corelibjasmine-corejasmine.js
:2479:37)
        at attemptAsync (C:UsersPJAppDataRoamingnpmnode_modulespr
otractornode_modulesjasminenode_modulesjasmine-corelibjasmine-corejasmine
.js:1916:24)
        at QueueRunner.run (C:UsersPJAppDataRoamingnpmnode_modules
protractornode_modulesjasminenode_modulesjasmine-corelibjasmine-corejasm
ine.js:1871:9)
        at QueueRunner.execute (C:UsersPJAppDataRoamingnpmnode_mod
ulesprotractornode_modulesjasminenode_modulesjasmine-corelibjasmine-core
jasmine.js:1859:10)
    From asynchronous test:
    Error
        at Suite.<anonymous> (D:protractor_gitDemo\LoginTest.
js:3:2)
        at addSpecsToSuite (C:UsersPJAppDataRoamingnpmnode_modules
protractornode_modulesjasminenode_modulesjasmine-corelibjasmine-corejasm
ine.js:833:25)
        at Env.describe (C:UsersPJAppDataRoamingnpmnode_modulespr
otractornode_modulesjasminenode_modulesjasmine-corelibjasmine-corejasmine
.js:802:7)
        at jasmineInterface.describe (C:UsersPJAppDataRoamingnpmno
de_modulesprotractornode_modulesjasminenode_modulesjasmine-corelibjasmine
-corejasmine.js:3375:18)
        at Object.<anonymous> (D:protractor_gitDemo\LoginTest
.js:2:1)

您的页面对象应该定义为一个函数:

var Page = function () {
    this.login = element(by.model('credentials.username'));
    this.password = element(by.model('credentials.password'));
    this.user = "Email";
    this.passwd = "Password";
    this.goButton = $('input.btn.btn-primary');
    this.EC = protractor.ExpectedConditions;
    this.go = function() {
        browser.get("Application URL", 30000);
        browser.wait(this.EC.elementToBeClickable(this.login), 30000);
    };
};
module.exports = new Page();

谢谢你的建议,我同意它应该按照你提到的方式工作,然而,奇怪的是,我们仍然会遇到无法识别的类型问题。

我们对节点js和这个堆栈有点陌生。我尝试了多种选择,包括你提到的,通过将所有内容打包到一个函数中,通过将元素/函数单独公开为模块导出等

最后,我发现以下一个对我有用,使用原型。

var AngularPage = function () {
  };
AngularPage.prototype.login     = element(by.model('credentials.username'));
AngularPage.prototype.password  = element(by.model('credentials.password'));
AngularPage.prototype.goButton  = $('input.btn.btn-primary');
AngularPage.prototype.user      = "username";
AngularPage.prototype.passwd    = "password";
AngularPage.prototype.EC        = protractor.ExpectedConditions;
AngularPage.prototype.go        = function(){
    browser.get("Application URL",30000)
                                    .then(browser.wait(this.EC.elementToBeClickable(this.login),30000));
                                    expect(browser.getTitle()).toContain(‘String’);
     };
AngularPage.prototype.loginMethod = function(){
    console.log("Login started");
     this.login.sendKeys(this.user);
this.password.sendKeys(this.passwd);
this.goButton.click(); 
    browser.wait(this.EC.elementToBeClickable(this.compute));
    };
module.exports = AngularPage;

在测试文件中,我就是这样导入并调用它的,一个示例片段。

var page = require('./LoginPage_Export_As_Prototype.js');
var LoginPage = new page();
LoginPage.go();
LoginPage.loginMethod();

谢谢,Prakash

相关内容

最新更新