Webdriverio: 更改 get* wdio 命令的实现

创建于 2017-04-23  ·  3评论  ·  资料来源: webdriverio/webdriverio

你好

在我们的项目中,我们覆盖 wdio 命令getText并添加新命令getTexts

获取文本.js

'use strict';

let assert = require('assert');

/**
 * <strong i="10">@alias</strong> browser.getText
 * <strong i="11">@param</strong> {String} selector
 * <strong i="12">@returns</strong> {String}
 */

let _getText = browser.getText;

browser.addCommand('getText', function (selector) {
    let result = _getText.apply(browser, arguments);

    if (Array.isArray(result)) {
        throw new assert.AssertionError({
            message: 'Found several elements, expected one',
            expected: 'One item on page',
            actual: 'Several elements',
        });
    }

    return result;
}, true);

获取文本.js

'use strict';

/**
 * <strong i="16">@alias</strong> browser.getTexts
 * <strong i="17">@param</strong> {String} selector
 * <strong i="18">@returns</strong> {String[]}
 */

let _getText = browser.getText;

browser.addCommand('getTexts', function (selector) {
    let result = _getText.apply(browser, arguments);

    if (!Array.isArray(result)) {
        return [result];
    }

    return result;
});

这有助于我们避免此类黑客的这一个

我的提议

我有一个建议,以类似的方式改变所有这些方法:

  • getText(s)
  • getValue(s)
  • getAttribute(s)
  • getTagName(s)
  • getCssProperty(ies)

我想这样做是因为这个权宜之计看起来像一个黑客,并且经常出现在我们的测试中。 你怎么看待这件事?

用例:

当开发人员编写测试时,他通常希望获取页面上某些特定元素的文本(通过选择器):

...
const header = browser.getText('h1');
assert.equals(header, 'Hello here!');
...

但是现在我们必须在每个测试中做这样的检查:

...
const header = browser.getText('h1');
assert(Array.isArray(header), 'We have more than one `h1` header on the page!');
assert.equals(header, 'Hello here!');
...

另一方面,例如,当我们在页面上有一个元素列表并想要获取此列表元素的内容时,我们希望获取一个字符串数组

...
const emails = browser.getText('.address-book');
assert.equals(emails.length, 1);
...

但是在这种情况下,方法getText行为很奇怪而且出乎意料。 现在我们必须在每个测试中做这样的检查:

...
let emails = browser.getText('.address-book');
if (!Array.isArray(emails)) { emails = [emails] }
assert.equals(emails.length, 1);
...

对于这个问题,我们能做些什么?

首先,我们可以在每次测试中进行此类检查。 但这是一个非常不合适的选择。
第二个选项是在我们使用测试的所有项目中覆盖getText和其他类似命令。 但是这种方法有两个重要的缺点:

  • 当开发者第一次看到新方法时,他打开 wdio 的文档,看到一个不正确的描述
  • 我们不会有 IDE 支持重写的方法

在核心 API 中拥有类似的功能会更加方便和清晰。

Discussion

最有用的评论

老实说,听起来您的问题源于脆弱的定位器策略,而不是 webdriverio ...

修复定位器策略的另一种选择是自己在 before 钩子中添加命令。

所有3条评论

老实说,听起来您的问题源于脆弱的定位器策略,而不是 webdriverio ...

修复定位器策略的另一种选择是自己在 before 钩子中添加命令。

修复定位器策略的另一种选择是自己在 before 钩子中添加命令。

没有https://github.com/webdriverio/wdio-sync/pull/71是不可能的

这将在 v5 中修复,我们引入了元素范围,并且您只能在单个元素上调用这些命令。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Pylipala picture Pylipala  ·  4评论

aminerouh picture aminerouh  ·  3评论

LaiaPR picture LaiaPR  ·  4评论

peterjwest picture peterjwest  ·  4评论

kiraLinden picture kiraLinden  ·  3评论