في مشروعنا ، قمنا بإلغاء الأمر 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
وأوامر أخرى مماثلة في جميع المشاريع التي نستخدم فيها الاختبارات. لكن هذه الطريقة لها عيبان مهمان:
سيكون من الأسهل والأكثر وضوحًا أن يكون لديك وظيفة مماثلة في واجهة برمجة التطبيقات الأساسية.
بصراحة ، يبدو أن مشاكلك تنبع من استراتيجيات تحديد المواقع الهشة ، وليس webdriverio ...
سيكون الخيار البديل لإصلاح استراتيجيات محدد المواقع هو إضافة الأوامر بنفسك في الخطاف السابق.
سيكون الخيار البديل لإصلاح استراتيجيات محدد المواقع هو إضافة الأوامر بنفسك في الخطاف السابق.
إنه مستحيل بدون https://github.com/webdriverio/wdio-sync/pull/71
سيتم إصلاح هذا في الإصدار الخامس حيث نقدم نطاقات العناصر ويمكنك فقط استدعاء هذه الأوامر على عناصر فردية.
التعليق الأكثر فائدة
بصراحة ، يبدو أن مشاكلك تنبع من استراتيجيات تحديد المواقع الهشة ، وليس webdriverio ...
سيكون الخيار البديل لإصلاح استراتيجيات محدد المواقع هو إضافة الأوامر بنفسك في الخطاف السابق.