我使用Protractor在我的Angular Web应用程序上运行集成测试。我的网络应用程序使用我的自定义Angular服务ApiClient
进行API调用。我使用browser.addMockModule
和angular.module().factory()
模拟了该服务。这让我可以模拟我所有的后端API!这是我的代码:
setup() {
// Out in WebDriver.
// Third argument 'apiRequestsMap' is made available as an argument 'map'
// to the anonymous function which constructs the module.
browser.addMockModule(
'mockDataModule',
(map) =>
angular.module('mockDataModule', []).value('apiRequestsMap', map),
this.apiRequestsMap_);
const apiModuleMaker = () => {
const mockModule = angular.module('mockapiModule', ['mockDataModule']);
mockModule.factory(
'apiClient',
($q, apiRequestsMap) => ({
request: (req) => {
// In Browser.
// I can access 'apiRequestsMap'!
// And I use it to mock those API calls.
}
}));
};
browser.addMockModule('mockapiModule', apiModuleMaker);
browser.get('www.mywebpage.com/example');
}
这很好用,我可以在Protractor测试中设置模拟API。重要的是,我可以将this.apiRequestsMap_
变量从WebDriver传递到浏览器apiRequestsMap
。
现在我想知道 - 我可以反其道而行之吗? 如何将浏览器中的变量传回WebDriver?
我的第一次尝试只是编辑我传入的apiRequestsMap
对象。但这似乎是单向传输。即,在浏览器中,设置apiRequestsMap.aVar = 5;
不会更改this.apiRequestsMap_.aVar
。
查看Protractor API,我还找到了browser.getRegisteredMockModules
。不幸的是,console.log(JSON.stringify(browser.getRegisteredMockModules()));
打印出[null, null, null, null, null]
。
很抱歉发布了这么多代码和上下文!我已经超过了我的头脑,所以我不确定哪些部分可以移除,同时允许我的代码仍然运行。也许有更好的方法直接使用WebDriver模拟API调用?这将是一个很好的解决方法。
另一个可能的问题是我向Protractor开发人员提交了一个功能请求/错误。
答案 0 :(得分:2)
您可以直接从Protractor在浏览器中执行Javascript代码。
所以在你的javascript中做类似下面的事情
window.__myvariable__ = {data:2, name: "abc"};
可以通过使用Selenium执行一些Javascript代码来访问它。在量角器中
browser.executeScript('return window.__myvariable__;');
返回正常的可预期量角器承诺。请注意,返回的window.__myvariable__
对象应为json convertible。
这将获取测试代码中的值,它将一直保留到页面刷新为止。有关更详细的回复,请参阅