http://webdriver.io/guide/getstarted/modes.html
我绝对不会尝试使用Chromedriver调试webdriverio测试。您根本无法单步执行代码,因为webdriverio命令是异步的,并且浏览器会话与测试不同步。
这是令人沮丧的,因为阅读文档,似乎你需要一个像Chai或wdio这样的测试框架来生成测试,但这似乎只是为了获得程序同步命令而做了很多工作。
我只需要使用webdriverio抓取一些网站,但这种异步命令很难使用Chrome devtools进行调试。
有没有办法强制webdriverio同步运行?
离)
var loadedPage = webdriverio.remote(options).init().url('https://google.com');
除了loadedPage
没有准备好,并且在调试移动到下一行时未定义。
答案 0 :(得分:4)
嗯,WebdriverIO只是自动化框架的一颗宝石,全面的documentation是其强大的功能之一。正如您正确指出的那样,一切都是异步的,但是对于WDIO,如果您来自传统的顺序编程背景,您还可以选择完全同步。
首先,您需要阅读一些关于 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 inferface),形式为.debug()
{{3 }} 即可。只需将其添加到您希望执行停止的测试用例中,以便在所选终端内进行调试。
<强> !!!注意: .debug()
命令的默认超时很短。确保你增加它。
如果您发现上述方法是痛苦的屁股,那么为什么不使用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-flag以支持此方法: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 <==
});
});
这是我的首选方法。它为您提供了对测试用例执行的最佳控制,但如果刚刚开始,我不推荐它。基本上它就是上面的例子,但是所有命令都是链接的。
<强> !!!注意:请确保为此设置sync: false
标记。
如果这有帮助,请告诉我。干杯!