【问题标题】:Protractor Tests Assign Window Objects量角器测试分配窗口对象
【发布时间】:2015-04-15 14:15:17
【问题描述】:

我正在使用CefSharp 来运行 AngularJS 应用程序。 CefSharp 有一个RegisterJsObject 的方法,它在任何客户端脚本执行之前将对象或属性分配到window

我希望能够使用 Protractor 测试此功能,但我不确定如何在我的任何测试运行之前访问 window 并分配对象。由于我的应用程序依赖那些注册到window 的对象,我需要一种方法来硬编码或模拟它,没有注册的对象,我的应用程序继续抛出undefined 错误。

甚至可以从 Protractor 访问window 吗?理想的东西看起来像:

describe('my test', function () {

    beforeEach(function () {
        window.foo = "bar";
    });

    it('should do stuff', function () {
        browser.get('index.html');
        // do stuff
    });
});

编辑:我试过了

describe('my test', function () {
    it('should do stuff', function () {
        browser.executeScript('return window.foo = { bar: {a: "b"}}').then(function () {
        browser.get('#/');
        browser.driver.manage().timeouts().implicitlyWait(10000);
    });
});

但是当窗口实际加载时,我仍然看到cannot read property 'bar' of undefined

编辑 2:甚至尝试过executeAsyncScript,但没有成功。

describe('my test', function () {
it('should do stuff', function () {
        browser.executeAsyncScript(function(cb) {
            window.foo = { bar: { a: "b" } };
            cb(true);
        }).then(function (cb) {
            browser.get('#/');
            browser.driver.manage().timeouts().implicitlyWait(10000);
            browser.wait(function () {
                element(by.id('some-element')).isPresent();
            });
            expect(element(by.id('some-element')).isPresent()).toBe(true);
        });
    });
});

【问题讨论】:

    标签: angularjs protractor chromium-embedded


    【解决方案1】:

    问题是window 上的对象在加载新 URL 时被清除。您必须恢复使用普通的旧网络驱动程序来导航到 URL:

    describe('my test', function () {
    it('should do stuff', function () {
      browser.driver.get('youraddress');
      browser.executeScript(function() {
          window.foo = { bar: { a: "b" } };
      });
      browser.driver.manage().timeouts().implicitlyWait(10000);
      browser.wait(function () {
        element(by.id('some-element')).isPresent();
      });
      expect(element(by.id('some-element')).isPresent()).toBe(true);
    });
    

    【讨论】:

    • 我认为这可能会发生,但是,上面似乎仍然抛出相同的 undefined 错误。 Angular 似乎在browser.driver.get()browser.executeScript 之间执行。无论如何要在这两者之间延迟 Angular 以确认窗口对象已实际注册?根据 API 文档,driver.get() 似乎没有 browser.get() 的超时参数。
    【解决方案2】:

    这对我有用:

    var originalDriverGet = browser.driver.get;
    browser.driver.get = function() {
        return originalDriverGet.apply(this, arguments).then(runScript);
    };
    
    function runScript() {
        setTimeout(function() {
            browser.executeScript("script to execute...");
        });
    }
    

    在 protractor.conf.js 的 onPrepare 块中执行此操作。

    【讨论】:

      猜你喜欢
      • 2016-08-06
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 2014-11-23
      • 2012-08-31
      • 2020-07-06
      相关资源
      最近更新 更多