Webdriverio: Implementierung von get* wdio-Befehlen ändern

Erstellt am 23. Apr. 2017  ·  3Kommentare  ·  Quelle: webdriverio/webdriverio

Hallo

In unserem Projekt überschreiben wir den wdio-Befehl getText und fügen den neuen Befehl getTexts :

getText.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);

getTexts.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;
});

Dies hat uns geholfen, Hacks wie diesen zu vermeiden.

Mein Vorschlag

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?

Anwendungsfälle:

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);
...

Was können wir gegen dieses Problem tun?

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:

  • Wenn der Entwickler die neue Methode zum ersten Mal sieht, öffnet er die Dokumentation für wdio und sieht eine falsche Beschreibung
  • Wir werden keine IDE-Unterstützung für überschriebene Methoden haben

Es wäre viel bequemer und übersichtlicher, eine ähnliche Funktion in der Kern-API zu haben.

Discussion

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.

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen