覆盖单击命令webdriverio

时间:2017-01-25 14:51:28

标签: javascript webdriver-io

我想覆盖webdriverio中的click命令

在每次点击之前,我会检查定位器是否存在。我想要这样的东西:

browser.addCommand("click", function () {
      browser.waitUntil()      
      browser.click()
}, true);

实施此方法的最佳方法是什么?

- 更新

我没有实现这样的东西:

  afterCommand: function (commandName) {
    if (['click'].includes(commandName)) {
      browser.waitUntilPageIsLoaded()
    }
  }

每次单击命令后,我都会等到页面加载完毕。适合我的情况。

4 个答案:

答案 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);
        }
    });
};