Webdriverio: تغيير تنفيذ أوامر get * wdio

تم إنشاؤها على ٢٣ أبريل ٢٠١٧  ·  3تعليقات  ·  مصدر: webdriverio/webdriverio

أهلا

في مشروعنا ، قمنا بإلغاء الأمر wdio getText وإضافة الأمر الجديد 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;
});

ساعدنا هذا في تجنب مثل هذه الاختراقات مثل هذه .

اقتراحي

لدي اقتراح لتغيير كل هذه الأساليب بطريقة مماثلة:

  • 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 وأوامر أخرى مماثلة في جميع المشاريع التي نستخدم فيها الاختبارات. لكن هذه الطريقة لها عيبان مهمان:

  • عندما يرى المطور الطريقة الجديدة لأول مرة ، يفتح وثائق wdio ويرى وصفًا غير صحيح
  • لن يكون لدينا دعم IDE للأساليب التي تم تجاوزها

سيكون من الأسهل والأكثر وضوحًا أن يكون لديك وظيفة مماثلة في واجهة برمجة التطبيقات الأساسية.

Discussion

التعليق الأكثر فائدة

بصراحة ، يبدو أن مشاكلك تنبع من استراتيجيات تحديد المواقع الهشة ، وليس webdriverio ...

سيكون الخيار البديل لإصلاح استراتيجيات محدد المواقع هو إضافة الأوامر بنفسك في الخطاف السابق.

ال 3 كومينتر

بصراحة ، يبدو أن مشاكلك تنبع من استراتيجيات تحديد المواقع الهشة ، وليس webdriverio ...

سيكون الخيار البديل لإصلاح استراتيجيات محدد المواقع هو إضافة الأوامر بنفسك في الخطاف السابق.

سيكون الخيار البديل لإصلاح استراتيجيات محدد المواقع هو إضافة الأوامر بنفسك في الخطاف السابق.

إنه مستحيل بدون https://github.com/webdriverio/wdio-sync/pull/71

سيتم إصلاح هذا في الإصدار الخامس حيث نقدم نطاقات العناصر ويمكنك فقط استدعاء هذه الأوامر على عناصر فردية.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات