In unserem Projekt überschreiben wir den wdio-Befehl getText
und fügen den neuen Befehl 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;
});
Dies hat uns geholfen, Hacks wie diesen zu vermeiden.
Ich habe einen Vorschlag, all diese Methoden auf ähnliche Weise zu ändern:
getText(s)
getValue(s)
getAttribute(s)
getTagName(s)
getCssProperty(ies)
Ich möchte dies tun, weil dieses Hilfsmittel wie ein Hack aussieht und in unseren Tests sehr oft vorkommt. Was denkst du darüber?
Wenn ein Entwickler einen Test schreibt, möchte er meistens den Text eines bestimmten Elements auf der Seite (durch den Selektor):
...
const header = browser.getText('h1');
assert.equals(header, 'Hello here!');
...
Aber jetzt müssen wir bei jedem Test folgende Prüfungen durchführen:
...
const header = browser.getText('h1');
assert(Array.isArray(header), 'We have more than one `h1` header on the page!');
assert.equals(header, 'Hello here!');
...
Wenn wir andererseits auf der Seite beispielsweise eine Liste von Elementen haben und den Inhalt der Elemente dieser Liste abrufen möchten, erwarten wir ein Array von Strings :
...
const emails = browser.getText('.address-book');
assert.equals(emails.length, 1);
...
Aber in dieser Situation verhält sich die Methode getText
seltsam und unerwartet. Jetzt müssen wir in jedem Test folgende Prüfungen durchführen:
...
let emails = browser.getText('.address-book');
if (!Array.isArray(emails)) { emails = [emails] }
assert.equals(emails.length, 1);
...
Erstens können wir solche Überprüfungen in jedem Test durchführen. Dies ist jedoch eine sehr ungeeignete Option.
Die zweite Möglichkeit besteht darin, getText
und andere ähnliche Befehle in allen Projekten zu überschreiben, in denen wir Tests verwenden. Diese Methode hat jedoch zwei wichtige Nachteile:
Es wäre viel bequemer und übersichtlicher, eine ähnliche Funktion in der Kern-API zu haben.
Ehrlich gesagt, es hört sich so an, als ob Ihre Probleme auf spröde Locator-Strategien zurückzuführen sind, nicht auf Webdriverio ...
Eine alternative Möglichkeit, Ihre Locator-Strategien zu korrigieren, besteht darin, die Befehle selbst im Vorher-Hook hinzuzufügen.
Eine alternative Möglichkeit, Ihre Locator-Strategien zu korrigieren, besteht darin, die Befehle selbst im Vorher-Hook hinzuzufügen.
Es ist unmöglich ohne https://github.com/webdriverio/wdio-sync/pull/71
Dies wird in v5 behoben, wo wir Elementbereiche einführen und Sie diese Befehle nur für einzelne Elemente aufrufen können.
Hilfreichster Kommentar
Ehrlich gesagt, es hört sich so an, als ob Ihre Probleme auf spröde Locator-Strategien zurückzuführen sind, nicht auf Webdriverio ...
Eine alternative Möglichkeit, Ihre Locator-Strategien zu korrigieren, besteht darin, die Befehle selbst im Vorher-Hook hinzuzufügen.