如何使用Protractor从浏览器向WebDriver发送消息?

时间:2017-07-27 17:07:05

标签: javascript angularjs selenium-webdriver protractor

我使用Protractor在我的Angular Web应用程序上运行集成测试。我的网络应用程序使用我的自定义Angular服务ApiClient进行API调用。我使用browser.addMockModuleangular.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开发人员提交了一个功能请求/错误。

1 个答案:

答案 0 :(得分:2)

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

所以在你的javascript中做类似下面的事情

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

可以通过使用Selenium执行一些Javascript代码来访问它。在量角器中

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

返回正常的可预期量角器承诺。请注意,返回的window.__myvariable__对象应为json convertible。

这将获取测试代码中的值,它将一直保留到页面刷新为止。有关更详细的回复,请参阅

Access window object / browser scope from protractor