量角器在 AngularJS 之外的可用性

IT技术 selenium integration-testing protractor reactjs
2021-05-11 16:17:45

所以我最近从使用 AngularJS 切换到 ReactJS,但我确实很喜欢使用 Protractor E2E 测试运行器,所以我想知道关于 Protractor 的两件事。

在完全不使用 AngularJS 的网站上使用量角器有什么重大问题吗?我知道 Protractor 默认情况下会尝试与 Angular 同步,您会得到:

Error: Angular could not be found on the page X : retries looking for angular exceeded

输入消息但是我相信可以通过browser.ignoreSynchronization = truebefore来防止browser.get()除此之外还有其他问题吗?

另一个问题是 Protractor 是否会成为特定于 AngularJS 的工具,因为它只能测试 AngularJS 代码?我认为可以绕过任何 AngularJS 特定功能(就像你可以使用browser.ignoreSynchronization = true),我只是想确保这是 Protractor 前进的核心目标。

2个回答

尽管 Protractor 旨在为 Angular 应用程序编写端到端的测试代码,但它仍然可以用于测试非 Angular 应用程序。

有两种常见的解决方案可以实现这一点:

直接访问包装好的 webdriver 实例

browser.driver.find(By.id('test'));

为方便起见,您可以将其导出到全局命名空间并通过别名访问它。

onPrepare: function () {
  global.drv = browser.driver;
}

停止等待 Angular 完成它的工作

正如您所提到的,browser.ignoreSynchronization = true可以禁用 Protractor 的默认等待行为。当您的测试代码不是专用于非 Angular 应用程序时,您采用的解决方案(在 browser.get() 之前执行 browser.ignoreSynchronization = true)可能会导致错误。browser.ignoreSynchronization是一个全局范围设置,这意味着一旦您更改其值,此标志将影响整个测试套件。因此,除非在每个 Angular 测试中相应地更新标志,否则您的 Angular 测试将出现一些错误。

试试这种优雅而灵活的方式。

ignoreSynchronization在 config.js 中定义一个标志设置函数

onPrepare = function () {
  global.isAngularApp = function (flag) {
    return browser.ignoreSynchronization = flag;
  }
}

您可以确定测试代码中标志的值

beforeEach(function() {
  isAngularApp(false);  //for non-Angular site
});

对于您的非角度应用程序,您现在需要自己保持同步。您可以通过对用户更直观的方法来做到这一点,您现在等待元素出现/消失/有值/没有值/等等。用户会看到并做出react的所有事物。您可以使用 Selenium 的隐式或显式等待以及适当的 ExpectedConditions 类来完成此操作。这些是Selenium Docs 的详细信息

希望对你有帮助。

我开发了一个插件protractor-react-selector

这个插件将帮助您使用 REACT 的组件、props和状态非常轻松地找到 Web 元素。

试试看,如果您正在为您的 REACT 应用程序使用量角器...

您可以像下面这样使用它:

// with only component. If you dont provide any root, it assume that root is set to '#root'
const loginButton = element(by.ReactSelector("button"));

// with props
const loginButton = element(by.ReactSelector("button", { value: "OK" }));

// with react root element
const loginButton = element(
  by.ReactSelector("button", { value: "OK" }, {}, "#root")
);

// array finder
const loginButton = element.all(by.ReactSelector("button"));

如果它对您有用,请给一颗星.. 任何反馈/公关都将是有value的..