Protractor测试分配窗口对象

4
我使用 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);
    });
});

但是当窗口实际加载时,我仍然看到“无法读取未定义的属性'bar'”。编辑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);
        });
    });
});
2个回答

1
问题在于当加载新的URL时,window上的对象会被清除。您需要恢复使用普通的webdriver来导航到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);
});

1
我认为可能会发生这种情况,但是上面仍然似乎抛出相同的“undefined”错误。看起来Angular在browser.driver.get()browser.executeScript之间执行。有没有办法在这两者之间延迟Angular以确认窗口对象实际上已经注册?根据API文档,driver.get()似乎没有browser.get()具有的超时参数。 - Barry Tormey

1
这对我有用:

这个对我有用:

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块中执行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接