【问题标题】:How to send message from Browser to WebDriver with Protractor?如何使用量角器将消息从浏览器发送到 WebDriver?
【发布时间】:2017-07-27 17:07:05
【问题描述】:

我正在使用 Protractor 在我的 Angular Web 应用程序上运行集成测试。我的 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 开发人员提交功能请求/错误。

【问题讨论】:

  • 你要传递什么对象?它只有值吗?可以转成 JSON 吗?您是否可以直接在浏览器控制台中打印该数据而无需使用 Selenium 执行 JS 代码?
  • 理想情况下,我想要传递的完整对象是一个对象数组(都可以使用 JSON.stringify 进行转换)。我现在可以通过console.log(JSON.stringify(req)); 亲自访问它。不知道如何通过代码访问它,但感谢您的想法!
  • 因为我只是在编写测​​试,所以我也可以只用assert 或其他故障条件“交流”。这可能是我接下来要尝试的。

标签: javascript angularjs selenium-webdriver protractor


【解决方案1】:

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

所以在你的 javascript 中执行如下操作

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

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

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

它返回一个正常的可预期的 Protractor 承诺。请注意,返回的 window.__myvariable__ 对象应该是 json 可转换的。

这将在您的测试代码中获取该值,并将一直保留到刷新页面为止。如需更详细的回复,请查看

Access window object / browser scope from protractor

【讨论】:

  • 我应该把这个退货声明放在哪里?在某处的浏览器上下文中;执行 WebDriver 代码时窗口未定义。
  • 查看stackoverflow.com/questions/26102132/…以获得更深入的解释
猜你喜欢
  • 2015-04-07
  • 2013-04-02
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多