在我们的项目中,我们覆盖 wdio 命令getText
并添加新命令getTexts
:
'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);
'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
和其他类似命令。 但是这种方法有两个重要的缺点:
在核心 API 中拥有类似的功能会更加方便和清晰。
老实说,听起来您的问题源于脆弱的定位器策略,而不是 webdriverio ...
修复定位器策略的另一种选择是自己在 before 钩子中添加命令。
修复定位器策略的另一种选择是自己在 before 钩子中添加命令。
这将在 v5 中修复,我们引入了元素范围,并且您只能在单个元素上调用这些命令。
最有用的评论
老实说,听起来您的问题源于脆弱的定位器策略,而不是 webdriverio ...
修复定位器策略的另一种选择是自己在 before 钩子中添加命令。