2017-07-27 74 views
1

我正在使用量角器在我的Angular web应用上运行集成测试。我的网络应用使用我自定义的Angular服务ApiClient进行API调用。我用browser.addMockModuleangular.module().factory()嘲笑那项服务。这让我嘲笑我所有的后端API!这里是我的代码:如何使用量角器将消息从浏览器发送到WebDriver?

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'); 
} 

这工作得很好,让我建立了模拟的API在我的量角器测试。重要的是我可以将this.apiRequestsMap_变量从WebDriver传递到浏览器,作为apiRequestsMap

现在我想知道 - 我可以做相反的事吗? 如何将浏览器中的变量传回WebDriver?

我的第一次尝试只是编辑我通过的apiRequestsMap对象。但是这似乎是单向传输。即在In Browser中,设置apiRequestsMap.aVar = 5;不会更改this.apiRequestsMap_.aVar

看着量角器API,我也找到了browser.getRegisteredMockModules。不幸的是console.log(JSON.stringify(browser.getRegisteredMockModules()));打印出[null, null, null, null, null]

对不起,张贴这么多的代码和上下文!我在头上,所以我不确定哪些部分可以删除,同时允许我的代码仍然运行。也许有更好的方法直接用WebDriver模拟API调用?这将是一个很好的解决方法。

另一个可能的外卖是我向量角器开发人员提交功能请求/错误。

+1

你想通过什么对象?它只有价值吗?它可以转换为JSON吗?您是否能够直接在浏览器控制台中打印数据,而无需使用Selenium执行JS代码? –

+0

理想情况下,我想传递的完整对象是一个对象数组(全部能够使用JSON.stringify进行转换)。我现在可以用console.log(JSON.stringify(req));''亲自访问它。不知道如何通过代码访问,但感谢这个想法! – hubatish

+0

因为我只是在写测试,所以我可能也只能通过'assert'或其他故障条件进行“沟通”。这可能是我接下来会尝试的。 – hubatish

回答

2

您可以直接从Protractor在浏览器中执行Javascript代码。

所以在JavaScript这样做下面

window.__myvariable__ = {data:2, name: "abc"}; 

可以通过执行与硒一些JavaScript代码来访问。在量角器这是

browser.executeScript('return window.__myvariable__;'); 

它返回一个正常的期望量角器承诺。请注意0​​对象返回应该是json转换。

这将得到您的测试代码中的值,它将一直保留,直到页面刷新。对于更详细的回复看看

Access window object/browser scope from protractor

+0

我应该把这个return语句放在哪里?在浏览器上下文的某处;执行WebDriver代码时窗口未定义。 – hubatish

+0

请参阅https://stackoverflow.com/questions/26102132/access-window-object-browser-scope-from-protractor以获取更深入的解释 – hubatish

+2

@hubatish,根据您的信息更新信息 –

相关问题