Dalam proyek kami, kami mengganti perintah wdio getText
dan menambahkan perintah baru 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;
});
Ini membantu kami menghindari peretasan seperti ini .
Saya memiliki proposal untuk mengubah semua metode ini dengan cara yang serupa:
getText(s)
getValue(s)
getAttribute(s)
getTagName(s)
getCssProperty(ies)
Saya ingin melakukan ini karena cara ini terlihat seperti peretasan dan sangat sering terjadi dalam pengujian kami. Apa yang Anda pikirkan tentang ini?
Saat pengembang menulis tes, paling sering dia ingin mendapatkan teks dari beberapa elemen tertentu di halaman (oleh pemilih):
...
const header = browser.getText('h1');
assert.equals(header, 'Hello here!');
...
Tapi sekarang kita harus melakukan pemeriksaan seperti ini di setiap tes:
...
const header = browser.getText('h1');
assert(Array.isArray(header), 'We have more than one `h1` header on the page!');
assert.equals(header, 'Hello here!');
...
Di sisi lain , ketika kita memiliki halaman, misalnya, daftar elemen dan ingin mendapatkan isi dari elemen daftar ini, kita berharap untuk mendapatkan array string :
...
const emails = browser.getText('.address-book');
assert.equals(emails.length, 1);
...
Tetapi dalam situasi ini metode getText
berperilaku aneh dan tidak terduga. Sekarang kita harus melakukan pemeriksaan seperti ini di setiap tes:
...
let emails = browser.getText('.address-book');
if (!Array.isArray(emails)) { emails = [emails] }
assert.equals(emails.length, 1);
...
Pertama, kita bisa melakukan pemeriksaan tersebut di setiap tes. Tapi ini adalah pilihan yang sangat tidak cocok.
Opsi kedua — adalah mengganti getText
dan perintah serupa lainnya di semua proyek tempat kami menggunakan pengujian. Tetapi metode ini memiliki dua kelemahan penting:
Akan jauh lebih nyaman dan lebih jelas untuk memiliki fungsi serupa di API inti.
Sejujurnya sepertinya masalah Anda berasal dari strategi pencari yang rapuh, bukan webdriverio ...
Opsi alternatif untuk memperbaiki strategi locator Anda adalah dengan menambahkan perintah sendiri di hook sebelumnya.
Opsi alternatif untuk memperbaiki strategi locator Anda adalah dengan menambahkan perintah sendiri di hook sebelumnya.
Tidak mungkin tanpa https://github.com/webdriverio/wdio-sync/pull/71
Ini akan diperbaiki di v5 di mana kami memperkenalkan cakupan elemen dan Anda hanya dapat memanggil perintah ini pada elemen tunggal.
Komentar yang paling membantu
Sejujurnya sepertinya masalah Anda berasal dari strategi pencari yang rapuh, bukan webdriverio ...
Opsi alternatif untuk memperbaiki strategi locator Anda adalah dengan menambahkan perintah sendiri di hook sebelumnya.