我想覆盖webdriverio中的click命令
在每次点击之前,我会检查定位器是否存在。我想要这样的东西:
browser.addCommand("click", function () {
browser.waitUntil()
browser.click()
}, true);
实施此方法的最佳方法是什么?
- 更新
我没有实现这样的东西:
afterCommand: function (commandName) {
if (['click'].includes(commandName)) {
browser.waitUntilPageIsLoaded()
}
}
每次单击命令后,我都会等到页面加载完毕。适合我的情况。
答案 0 :(得分:2)
我建议您创建一个'waitThenClick'功能,而不是尝试覆盖核心(和记录)功能,类似于您已有的功能。
答案 1 :(得分:1)
我建议创建一个类来保存所有动作。默认情况下它可以调用浏览器功能,你可以覆盖你想要的一些特殊操作的动作。
class Action {
constructor() {
//assign browser function unless overridden
Object.keys(browser)
.filter(key => !this[key])
.forEach(key => this[key] = browser[key]);
}
/*Override functions*/
click(sel) {
browser.waitUntil();
browser.click(sel);
}
}
在测试中,您可以使用' Action'做手术。
describe('Suite', function() {
it('Case', function() {
Action.getText('#div');
Action.click('#button');
});
});
通过这种方式,您可以获得更清晰的维护代码。
答案 2 :(得分:1)
我不建议覆盖该功能。尝试在它上面构建一个命令。我认为在获取元素之前等待元素应该是创建测试步骤时必须的。
browser.addCommand(`waitAndClick`, function () {
return browser
.waitForVisible(arguments[0])
.then(() => {
return browser.click.apply(this, arguments);
});
};);
你也可以为大多数动作实现这个:'click','getValue','setValue','getCssProperty','getAttribute'等
答案 3 :(得分:0)
这就是我们所做的。尝试单击元素直到成功的函数。
免责声明:这适用于最高4.0的API版本。有2个项目并发,一个在旧API上,一个在4+上。 4+不需要它。
module.exports = function ClickWithRetry (selector, tries, callback) {
this.click(selector, function (err) {
if (err != null && tries >= 0) {//We had som kind of error like selector was not yet visible.. try again
this.pause(500);
this.ClickWithRetry(selector, tries - 1, callback);
} else {
callback(err);
}
});
};