Protractor - 调试

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

简介

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

故障类型

测试套件失败的原因可能多种多样,以下是一些众所周知的故障类型 −

WebDriver 故障

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

WebDriver 意外失败

当无法更新 Web 驱动程序管理器时,会发生与浏览器和操作系统相关的意外故障。

Protractor for Angular 失败

当 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的规范文件,量角器尝试识别具有定位器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,
    
    // 要传递给 webdriver 实例的功能。
    capabilities: {
    'browserName': 'chrome'
    },
    
    // 要使用的框架。建议使用 Jasmine。
    framework: 'jasmine',
    
    // 调用 protractor 时,Spec 模式与当前工作目录相关。
    specs: ['example_debug.js'],
    allScriptsTimeout: 999999,
    jasmineNodeOpts: {
    defaultTimeoutInterval: 999999
    },
    onPrepare: function () {
    browser.manage().window().maximize();
    browser.manage().timeouts().implicitlyWait(5000);
    }
};

现在,运行以下命令 −

protractor example_configuration.js

调试器将在执行上述命令后启动。

调试器方法

使用 pause 方法调试 Protractor 中的测试用例是一种高级方法。我们可以在想要中断测试代码的地方输入以下命令 −

browser.debugger();

它使用节点调试器来调试测试代码。要运行上述命令,我们必须在从测试项目位置打开的单独命令提示符中输入以下命令 −

protractor debug protractor.conf.js

在此方法中,我们还需要在终端中输入 C 以继续测试代码。但与 pause 方法相反,此方法只需输入一次。

示例

在此示例中,我们使用与上面相同的规范文件 bexample_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 debug example_configuration.js

调试器将在执行上述命令后启动。