javascript - 如何在独立模式下调试 webdriverio?

标签 javascript node.js selenium webdriver-io

http://webdriver.io/guide/getstarted/modes.html

尝试使用 Chromedriver 调试 webdriverio 测试时,我绝对会发疯。您根本无法单步执行代码,因为 webdriverio 命令是异步的,并且浏览器 session 与测试不同步。

这令人沮丧,因为阅读文档时,您似乎需要像 Chai 或 wdio 这样的测试框架来生成测试,但这似乎只是为了拥有过程同步命令需要做很多工作。

我只需要使用 webdriverio 抓取一些网站,但使用 Chrome devtools 调试这种异步命令太难了。

有没有办法强制 webdriverio 同步运行?

例)

var loadedPage = webdriverio.remote(options).init().url('https://google.com');

除了 loadedPage 还没有准备好,并且在调试移至下一行时未定义。

最佳答案

正如您正确指出的那样,一切都是异步的,但是如果您具有传统的顺序编程背景,则使用 WDIO 也可以选择完全同步。

  • 异步方法(不使用 WDIO test-runner ):

    首先,您必须阅读一些关于 JavaScript Promises 的内容,尤其是 .then() 函数。

     var webdriverio = require('webdriverio');
     var options = { desiredCapabilities: { browserName: 'chrome' } };
     var client = webdriverio.remote(options);
     client
         .init()
         .url('https://duckduckgo.com/')
         .setValue('#search_form_input_homepage', 'WebdriverIO')
         .click('#search_button_homepage')
         .getTitle()
         .then(function(title) {
             console.log('Title is: ' + title);
             // outputs: "Title is: WebdriverIO (Software) at DuckDuckGo"
         })
         .end();
    

    使用上述方法,您将总是必须链接您的命令,但您也可以在.then() 语句中使用同步命令。

    出于调试目的,WebdriverIO 开箱即用,设计精美 Read-Eval-Print-Loop (REPL) interface形式为 the .debug() command .只需将它添加到您希望执行停止的位置之前的测试用例中,以便您可以在您选择的终端内进行调试。

    注意: .debug() 命令的默认超时时间很短。确保增加它。

  • 同步方法(使用 WDIO test-runner ):

    为什么不使用 WDIO 测试运行器让您的生活更轻松?您可以从运行向导开始:

     // if you installed the package globally, or you have the wdio
     // binary in your PATH
     wdio config 
     // or. from the root of your project
     ./node_nodules/.bin/wdio config
    

    以上将在您的项目根目录中生成 wdio.conf.js 文件。测试运行器将使用它来运行您的测试用例。测试运行器还抽象了你的 .client() 的初始化,你不会再去处理它了。只需选择一个框架来运行您的测试用例(Mocha、Cucumber 或 Jasmine)并开始编写您的测试。

    注意:从现在开始,browser 将成为您的驱动程序对象。 此外,确保您将 wdio.conf.js 文件配置为支持这种运行测试用例的方式:设置同步标志以支持这种方法:sync: true。您可以通过 wdio wdio.conf.js 命令运行测试。

    您的测试应如下所示(使用 Mocha):

     var expect = require('chai').expect;
    
     describe("Testing Robots Emporium Test Suite", function() {
    
         beforeEach(function() {
             // ==> Your setup here <==
             browser.url('http://www.kevinlamping.com/webdriverio-course-content/index.html')
             var currentUrl = browser.getUrl();
             expect(currentUrl).include("/index.html");        
         })
    
         it("The FAQs was rendered properly", function() {
    
             var height = browser.getCssProperty("ul.accordion", 'height');
             // Added a debug step just to show you how easy it is to debug
             browser.debug();
             expect(height.parsed.value).to.be.above(300);
             // The first element was expanded
             var firstItemText = browser.getText('ul.accordion li:nth-of-type(1) div');
             expect(firstItemText).to.contain('be of the metal type.');
         });
    
         afterEach(function() { 
            // ==> Your cleanup here <==
         });
     });
    
  • 异步方法(使用 WDIO test-runner ):

    这是我的首选方法。它为您提供了对测试用例执行的最佳控制,但如果您刚刚开始,我不推荐它。基本上就是上面的例子,但是所有的命令都是链式的。

    注意:确保为此设置了 sync: false 标志。

关于javascript - 如何在独立模式下调试 webdriverio?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167050/

相关文章:

javascript - 如何在 Javascript 中访问 JSON 对象?

javascript - 有没有办法给每个 div 一个唯一的 id 而不必每次都输入它?

javascript - 无法从文件中获取 json_decode() - 语法错误

javascript - 如何让 TypeScript 的静态类型在运行时运行

javascript - 如何防止 ChildProcess 内存不足? Electron/Node.js

javascript - 无法使用 JSON.stringify() 生成 JSON 文件

selenium - 单击基于表列值的复选框 - IE Webdriver Selenium

javascript - 如何使用 JQuery .toggle() 为 div 百分比宽度设置动画

java - 在 cucumber 中自动打开多个浏览器窗口

python - 如何设置python Selenium 3.8.0的 'driver.get'超时?