Protractor - 调试



现在我们已经了解了前面章节中 Protractor 的所有概念,让我们在本章中详细了解调试概念。

简介

端到端 (e2e) 测试很难调试,因为它们依赖于应用程序的整个生态系统。我们已经看到它们依赖于各种操作,或者更准确地说,依赖于之前的操作,例如登录,有时还依赖于权限。调试 e2e 测试的另一个困难在于它依赖于 WebDriver,因为 WebDriver 在不同的操作系统和浏览器上的行为不同。最后,调试 e2e 测试还会生成冗长的错误消息,难以区分浏览器相关问题和测试过程错误。

故障类型

测试套件的失败可能有多种原因,以下是几种常见的故障类型:

WebDriver 故障

当命令无法完成时,WebDriver 会抛出一个错误。例如,浏览器无法获取定义的地址,或者找不到预期的元素。

WebDriver 意外故障

当 WebDriver 管理器更新失败时,会发生意外的浏览器和操作系统相关的故障。

Protractor Angular 故障

当 Protractor 未能如预期那样在库中找到 Angular 时,就会发生 Protractor Angular 故障。

Protractor Angular2 故障

在这种故障中,当配置中找不到 useAllAngular2AppRoots 参数时,Protractor 会失败。发生这种情况是因为,如果没有此参数,测试过程会在期望多个元素的情况下查看单个根元素。

Protractor 超时故障

当测试规范遇到循环或长时间池并未能及时返回数据时,就会发生此类故障。

期望失败

最常见的测试失败之一,展示了正常的期望失败是什么样子的。

为什么在 Protractor 中调试很重要?

假设您编写了测试用例并且它们失败了,那么了解如何调试这些测试用例非常重要,因为很难找到发生错误的确切位置。在使用 Protractor 时,您会在命令行中看到一些红色的长错误消息。

暂停和调试测试

以下是 Protractor 中调试的方法:

暂停方法

在 Protractor 中使用暂停方法调试测试用例是最简单的方法之一。我们可以在想要暂停测试代码的位置键入以下命令:

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 以继续测试代码。但与暂停方法相反,在此方法中,只需要键入一次。

示例

在此示例中,我们使用的是与上面相同的规范文件,名为example_debug.js。唯一的区别是,我们不需要使用browser.pause(),而是需要使用browser.debugger()来中断测试代码。它将如下所示:

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

运行上述命令后,调试器将启动。

广告