【问题标题】:Override click command webdriverio覆盖点击命令 webdriverio
【发布时间】:2017-01-25 14:51:28
【问题描述】:
我想覆盖webdriverio中的点击命令
在每次点击之前,我都会检查定位器是否存在。我想要这样的东西:
browser.addCommand("click", function () {
browser.waitUntil()
browser.click()
}, true);
实现这一点的最佳方法是什么?
--更新
我没有实现这样的东西:
afterCommand: function (commandName) {
if (['click'].includes(commandName)) {
browser.waitUntilPageIsLoaded()
}
}
每次点击命令后,我都会等到页面加载完毕。适合我的情况。
【问题讨论】:
-
-
嗨,简!还在寻找这个问题的答案吗?我最近开始了为期 1 个月的任务,试图回答 all-the-unanswered-WebdriverIO-questions。我与 Custom Commands 合作已有一段时间了,我认为我拥有与他们合作的最佳秘诀。
标签:
javascript
webdriver-io
【解决方案1】:
我建议不要尝试覆盖核心(和记录的)功能,而是创建一个类似于您已有的功能的“waitThenClick”功能。
【解决方案2】:
我建议创建一个类来保存您的所有操作。默认情况下可以调用浏览器函数,你可以重写一些你想要的特殊操作。
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');
});
});
这样你可以有一个更清晰的维护代码。
【解决方案3】:
我不建议重写该函数。尝试在它之上构建一个命令。我认为在创建测试步骤时,在获取之前等待一个元素应该是强制性的。
browser.addCommand(`waitAndClick`, function () {
return browser
.waitForVisible(arguments[0])
.then(() => {
return browser.click.apply(this, arguments);
});
};);
您还可以为大多数操作实现此功能:“click”、“getValue”、“setValue”、“getCssProperty”、“getAttribute”等
【解决方案4】:
这就是我们所做的。尝试单击元素直到成功的函数。
免责声明:这适用于最高 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);
}
});
};