首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Protractor中获取已加载的javascript对象

在Protractor中获取已加载的javascript对象
EN

Stack Overflow用户
提问于 2015-10-02 21:04:13
回答 3查看 137关注 0票数 2

在我们的应用程序中,我们装入requirejs,反过来装入angularjs,也装入其他javascript模块。我想知道有没有办法在量角器测试中找到这些加载的模块(angularjs,javascript模块)的漏洞。注意,我们想要运行Protractor时浏览器加载的实例,我们不想自己创建实例。

有什么建议或例子吗?

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-10-02 21:54:31

如果模块以值的形式返回可序列化的数据结构,则可以执行Nick Tomlin's answer。您可以调用require,并使用模块的值调用executeAsyncScript提供的回调,以允许返回异步值。例如,如果您的模块返回"foo"{ foo: 'bar' }或通常可序列化的结构,则此方法将起作用。

然而,它并不总是有效的。复杂的模块不能以这种方式检索。粗略地说,您应该预料到通过executeScriptexecuteAsyncScript发送的内容以及它们返回的内容具有与JSON.stringify相同的限制。一个主要的例外是Selenium会将从这些调用返回的DOM对象包装到一个结构中,该结构允许在脚本端识别它们,并允许将它们传递回浏览器。(话又说回来,这里也有局限性。例如,这就是为什么会出现陈旧的元素异常。)

如果您尝试检索导出函数的模块,您可能会得到一些东西,但它不会是完整的。试着这样做,例如:

代码语言:javascript
运行
复制
browser.executeAsyncScript(function () {
    arguments[0]({ foo: function () {}});
}).then(function (value) {
    console.log(value);
});

我得到的输出是:

代码语言:javascript
运行
复制
Object { foo: Object {} }

该函数已转换为空对象。

票数 2
EN

Stack Overflow用户

发布于 2015-10-02 21:36:26

我没有在require.js中使用angular,但我假设您可以像在模块中一样访问所需的angular:

代码语言:javascript
运行
复制
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的回调中进行。

票数 1
EN

Stack Overflow用户

发布于 2015-10-02 21:07:51

下面这样的代码应该可以做到:

代码语言:javascript
运行
复制
var angular = browser.driver.executeScript("return window.angular;");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32907821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档