【问题标题】: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()
    }
  }

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

【问题讨论】:

  • 这是一个已知问题(请参阅github.com/webdriverio/webdriverio/issues/1539)。不过,我不建议遵循这种做法。
  • 嗨,简!还在寻找这个问题的答案吗?我最近开始了为期 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);
                }
            });
        };
        

        【讨论】:

          猜你喜欢
          • 2012-08-30
          • 1970-01-01
          • 2021-06-26
          • 2014-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-18
          • 1970-01-01
          相关资源
          最近更新 更多