在我们的应用程序中,我们装入requirejs,反过来装入angularjs,也装入其他javascript模块。我想知道有没有办法在量角器测试中找到这些加载的模块(angularjs,javascript模块)的漏洞。注意,我们想要运行Protractor时浏览器加载的实例,我们不想自己创建实例。
有什么建议或例子吗?
提前谢谢。
发布于 2015-10-02 21:54:31
如果模块以值的形式返回可序列化的数据结构,则可以执行Nick Tomlin's answer。您可以调用require
,并使用模块的值调用executeAsyncScript
提供的回调,以允许返回异步值。例如,如果您的模块返回"foo"
或{ foo: 'bar' }
或通常可序列化的结构,则此方法将起作用。
然而,它并不总是有效的。复杂的模块不能以这种方式检索。粗略地说,您应该预料到通过executeScript
和executeAsyncScript
发送的内容以及它们返回的内容具有与JSON.stringify
相同的限制。一个主要的例外是Selenium会将从这些调用返回的DOM对象包装到一个结构中,该结构允许在脚本端识别它们,并允许将它们传递回浏览器。(话又说回来,这里也有局限性。例如,这就是为什么会出现陈旧的元素异常。)
如果您尝试检索导出函数的模块,您可能会得到一些东西,但它不会是完整的。试着这样做,例如:
browser.executeAsyncScript(function () {
arguments[0]({ foo: function () {}});
}).then(function (value) {
console.log(value);
});
我得到的输出是:
Object { foo: Object {} }
该函数已转换为空对象。
发布于 2015-10-02 21:36:26
我没有在require.js中使用angular,但我假设您可以像在模块中一样访问所需的angular:
var pageAngular = browser.driver.executeAsyncScript(function () {
var callback = arguments[arguments.length - 1];
require(['angular'], function (angular) {
callback(angular);
})
});
这里有必要使用executeAsync,因为AMD模块是异步加载的。
请注意,正如@louis所指出的,executeAsyncScript
的返回将是一个序列化的对象,而不是angular的“活动”实例。如果您需要在页面上下文中与angular交互,则应该在require
的回调中进行。
发布于 2015-10-02 21:07:51
下面这样的代码应该可以做到:
var angular = browser.driver.executeScript("return window.angular;");
https://stackoverflow.com/questions/32907821
复制相似问题