Protractor - 调试
现在我们已经了解了前面章节中 Protractor 的所有概念,让我们在本章中详细了解调试概念。
介绍
端到端 (e2e) 测试非常难以调试,因为它们依赖于该应用程序的整个生态系统。我们已经看到它们取决于各种操作,或者特别是我们可以说取决于登录等先前操作,有时它们取决于权限。调试 e2e 测试的另一个困难是它对 WebDriver 的依赖,因为它在不同的操作系统和浏览器中表现不同。最后,调试 e2e 测试还会生成很长的错误消息,并且很难区分浏览器相关问题和测试过程错误。
失败的类型
测试套件失败的原因可能有多种,以下是一些众所周知的失败类型 -
网络驱动程序故障
当命令无法完成时,WebDriver 会抛出错误。例如,浏览器无法获取定义的地址,或者未按预期找到元素。
WebDriver 意外失败
当无法更新 Web 驱动程序管理器时,会发生与浏览器和操作系统相关的意外故障。
Angular Protractor故障
当 Protractor 没有按预期在库中找到 Angular 时,就会发生 Protractor for Angular 失败。
Protractor Angular2 故障
在这种故障中,当配置中找不到 useAllAngular2AppRoots 参数时,Protractor 就会失败。发生这种情况是因为,如果没有这一点,测试流程将查看一个根元素,同时期望流程中存在多个元素。
Protractor超时失败
当测试规范遇到循环或长池并且无法及时返回数据时,就会发生这种失败。
预期失败
最常见的测试失败之一,显示正常的期望失败是什么样子。
为什么调试在 Protractor 中很重要?
假设,如果您编写了测试用例并且失败了,那么了解如何调试这些测试用例非常重要,因为很难找到发生错误的确切位置。使用 Protractor 时,您会在命令行中看到一些红色字体的长错误。
暂停和调试测试
Protractor 中的调试方法解释如下:&miuns;
暂停方法
使用暂停方法在 Protractor 中调试测试用例是最简单的方法之一。我们可以在我们想要暂停测试代码的地方输入以下命令&miuns;
browser.pause();
当正在运行的代码遇到上述命令时,就会暂停正在运行的程序。之后我们可以根据我们的喜好给出以下命令 -
C型代表前进
每当命令用完时,我们必须输入 C 才能继续。如果您不键入 C,测试将不会运行完整代码,并且会因 Jasmine 超时错误而失败。
输入repl进入交互模式
交互模式的好处是我们可以将 WebDriver 命令发送到浏览器。如果我们想进入交互模式,则输入repl。
键入 Ctrl-C 退出并继续测试
要从暂停状态退出测试并从停止的位置继续测试,我们需要键入 Ctrl-C。
例子
在此示例中,我们有以下名为example_debug.js的规范文件,Protractor尝试使用定位器by.binding ('mmmm')来识别元素,但 URL( https://angularjs.org/页面没有指定的元素定位器。
describe('Suite for protractor debugger',function(){ it('Failing spec',function(){ browser.get("http://angularjs.org"); element(by.model('yourName')).sendKeys('Vijay'); //Element doesn't exist var welcomeText = element(by.binding('mmmm')).getText(); expect('Hello '+welcomeText+'!').toEqual('Hello Ram!') }); });
现在,为了执行上述测试,我们需要在上述规范文件中添加 browser.pause() 代码,用于暂停测试。它将如下所示 -
describe('Suite for protractor debugger',function(){ it('Failing spec',function(){ browser.get("http://angularjs.org"); browser.pause(); element(by.model('yourName')).sendKeys('Vijay'); //Element doesn't exist var welcomeText = element(by.binding('mmmm')).getText(); expect('Hello '+welcomeText+'!').toEqual('Hello Ram!') }); });
但在执行之前,我们还需要对配置文件进行一些更改。我们正在对先前使用的配置文件(在上一章中名为example_configuration.js)进行以下更改-
// An example configuration file. exports.config = { directConnect: true, // Capabilities to be passed to the webdriver instance. capabilities: { 'browserName': 'chrome' }, // Framework to use. Jasmine is recommended. framework: 'jasmine', // Spec patterns are relative to the current working directory when // protractor is called. specs: ['example_debug.js'], allScriptsTimeout: 999999, jasmineNodeOpts: { defaultTimeoutInterval: 999999 }, onPrepare: function () { browser.manage().window().maximize(); browser.manage().timeouts().implicitlyWait(5000); } };
现在,运行以下命令 -
protractor example_configuration.js
调试器将在上述命令后启动。
调试器方法
在 Protractor 中使用暂停方法来调试测试用例是一种有点高级的方法。我们可以在我们想要破坏测试代码的地方输入以下命令 -
browser.debugger();
它使用节点调试器来调试测试代码。要运行上述命令,我们必须在从测试项目位置打开的单独命令提示符中键入以下命令 -
protractor debug protractor.conf.js
在这种方法中,我们还需要在终端中输入C以继续测试代码。但与暂停方法相反,在该方法中只输入一次。
例子
在此示例中,我们使用上面使用的名为 b example_debug.js的相同规范文件。唯一的区别是,我们需要在想要中断测试代码的地方使用browser.debugger () ,而不是 browser.pause() 。它将如下所示 -
describe('Suite for protractor debugger',function(){ it('Failing spec',function(){ browser.get("http://angularjs.org"); browser.debugger(); element(by.model('yourName')).sendKeys('Vijay'); //Element doesn't exist var welcomeText = element(by.binding('mmmm')).getText(); expect('Hello '+welcomeText+'!').toEqual('Hello Ram!') }); });
我们使用与上面示例中使用的相同的配置文件example_configuration.js。
现在,使用以下调试命令行选项运行Protractor测试
protractor debug example_configuration.js
调试器将在上述命令后启动。