所以我最近从使用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 = true之前做的事来避免键入信息browser.get()。除此之外还有其他问题吗?
browser.ignoreSynchronization = true
browser.get()
另一个问题是,量角器是否会成为特定于AngularJS的对象,例如它只能测试AngularJS代码?我认为可以绕开AngularJS的任何特定功能(就像您可以使用一样browser.ignoreSynchronization = true),我只是想确保这是Protractor前进的核心目标。
尽管Protractor旨在为Angular应用程序编写端到端测试代码,但仍可用于测试非Angular应用程序。
有两种常见的解决方案可以实现此目的:
browser.driver.find(By.id('test'));
为了方便起见,您可以将其导出到全局名称空间并通过别名进行访问。
onPrepare: function () { global.drv = browser.driver; }
如您所述,browser.ignoreSynchronization = true可以禁用默认的量角器等待行为。当您的测试代码不专用于非Angular应用程序时,您采用的解决方案(在browser.get()之前执行browser.ignoreSynchronization = true)可能会导致错误。browser.ignoreSynchronization是全局作用域设置,这意味着一旦更改其值,此标志将影响整个测试套件。因此,除非在每个Angular测试中相应地更新标志,否则您的Angular测试将获得一些错误。
browser.ignoreSynchronization
尝试这种优雅而灵活的方式。
ignoreSynchronization在config.js中定义标志设置器功能
ignoreSynchronization
onPrepare = function () { global.isAngularApp = function (flag) { return browser.ignoreSynchronization = flag; } }
然后您可以在测试代码中确定标志的值
beforeEach(function() { isAngularApp(false); //for non-Angular site });
对于非角度应用程序,您现在需要自己维护同步。您可以采用一种对用户更直观的方法来实现,即您现在等待元素出现/消失/具有一个值/没有任何值/等等。用户将看到并作出反应的所有事物。您可以通过Selenium的隐式或显式等待以及适当的ExpectedConditions类来完成此操作。这些是Selenium Docs的详细信息。
希望对您有帮助。