المحددات
يوفر بروتوكول WebDriver عدة استراتيجيات للمحددات للاستعلام عن عنص ر. يقوم WebdriverIO بتبسيطها للحفاظ على بساطة تحديد العناصر. يرجى ملاحظة أنه على الرغم من أن أمر الاستعلام عن العناصر يسمى $ و $$، إلا أنها لا علاقة لها بـ jQuery أو Sizzle Selector Engine.
بينما هناك العديد من المحددات المختلفة المتاحة، فإن عددًا قليلًا منها فقط يوفر طريقة مرنة للعثور على العنصر المناسب. على سبيل المثال، بالنظر إلى الزر التالي:
<button
id="main"
class="btn btn-large"
name="submission"
role="button"
data-testid="submit"
>
Submit
</button>
نحن نوصي و لا نوصي بالمحددات التالية:
| المحدد | موصى به | ملاحظات |
|---|---|---|
$('button') | 🚨 أبدًا | الأسوأ - عام جدًا، بدون سياق. |
$('.btn.btn-large') | 🚨 أبدًا | سيء. مرتبط بالتصميم. عرضة للتغيير بشكل كبير. |
$('#main') | ⚠️ بشكل متقطع | أفضل. لكنه لا يزال مرتبطًا بالتصميم أو مستمعي أحداث JS. |
$(() => document.queryElement('button')) | ⚠️ بشكل متقطع | استعلام فعال، معقد في الكتابة. |
$('button[name="submission"]') | ⚠️ بشكل متقطع | مرتبط بسمة name التي لها دلالات HTML. |
$('button[data-testid="submit"]') | ✅ جيد | يتطلب سمة إضافية، غير متصل بإمكانية الوصول. |
$('aria/Submit') | ✅ جيد | جيد. يشبه كيفية تفاعل المستخدم مع الصفحة. يوصى باستخدام ملفات الترجمة حتى لا تنكسر اختباراتك عند تحديث الترجمات. ملاحظة: قد يكون هذا المحدد أبطأ من غيره على الصفحات الكبيرة. |
$('button=Submit') | ✅ دائمًا | الأفضل. يشبه كيفية تفاعل المستخدم مع الصفحة وهو سريع. يوصى باستخدام ملفات الترجمة حتى لا تنكسر اختباراتك عند تحديث الترجمات. |
محدد استعلام CSS
إذا لم يتم الإشارة إلى خلاف ذلك، سيقوم WebdriverIO بالاستعلام عن العناصر باستخدام نمط محدد CSS، على سبيل المثال:
loading...
نص الرابط
للحصول على عنصر الرابط بنص محدد، استعلم عن النص الذي يبدأ بعلامة يساوي (=).
على سبيل المثال:
loading...
يمكنك الاستعلام عن هذا العنصر عن طريق استدعاء:
loading...
نص الرابط الجزئي
للعثور على عنصر رابط يتطابق نصه المرئي جزئيًا مع قيمة البحث الخاصة بك،
استعلم عنه باستخدام *= في بداية سلسلة الاستعلام (مثل *=driver).
يمكنك الاستعلام عن العنصر من المثال أعلاه أيضًا عن طريق الاستدعاء:
loading...
ملاحظة: لا يمكنك مزج استراتيجيات محدد متعددة في محدد واحد. استخدم استعلامات العناصر المتسلسلة المتعددة للوصول إلى نفس الهدف، على سبيل المثال:
const elem = await $('header h1*=Welcome') // لا يعمل!!!
// استخدم بدلاً من ذلك
const elem = await $('header').$('*=driver')
عنصر بنص معين
يمكن تطبيق نفس التقنية على العناصر أيضًا. بالإضافة إلى ذلك، من الممكن أيضًا إجراء مطابقة بدون مراعاة حالة الأحرف باستخدام .= أو .*= داخل الاستعلام.
على سبيل المثال، هنا استعلام لعنوان من المستوى 1 بنص "Welcome to my Page":
loading...
يمكنك الاستعلام عن هذا العنصر عن طريق الاستدعاء:
loading...
أو استخدام استعلام النص الجزئي:
loading...
نفس الأمر ينطبق على أسماء id و class:
loading...
يمكنك الاستعلام عن هذا العنصر عن طريق الاستدعاء:
loading...
ملاحظة: لا يمكنك مزج استراتيجيات محدد متعددة في محدد واحد. استخدم استعلامات العناصر المتسلسلة المتعددة للوصول إلى نفس الهدف، على سبيل المثال:
const elem = await $('header h1*=Welcome') // لا يعمل!!!
// استخدم بدلاً من ذلك
const elem = await $('header').$('h1*=Welcome')
اسم العلامة
للاستعلام عن عنصر باسم علامة محدد، استخدم <tag> أو <tag />.
loading...
يمكنك الاستعلام عن هذا العنصر عن طريق الاستدعاء:
loading...
سمة الاسم
للاستعلام عن العناصر بسمة اسم محددة، يمكنك إما استخدام محدد CSS3 عادي أو استراتيجية الاسم المقدمة من JSONWireProtocol عن طريق تمرير شيء مثل [name="some-name"] كمعلمة محدد:
loading...
loading...
ملاحظة: استراتيجية المحدد هذه مهملة وتعمل فقط في المتصفحات القديمة التي يتم تشغيلها بواسطة بروتوكول JSONWireProtocol أو باستخدام Appium.
xPath
من الممكن أيضًا الاستعلام عن العناصر عبر xPath محدد.
محدد xPath له صيغة مثل //body/div[6]/div[1]/span[1].
loading...
يمكنك الاستعلام عن الفقرة الثانية عن طريق الاستدعاء:
loading...
يمكنك استخدام xPath أيضًا للتنقل لأعلى ولأسفل في شجرة DOM:
loading...
محدد اسم إمكانية الوصول
استعلم عن العناصر حسب أسمائها الوصولية. الاسم الوصولي هو ما يتم إعلانه بواسطة قارئ الشاشة عندما يتلقى هذا العنصر التركيز. يمكن أن تكون قيمة الاسم الوصولي محتوى مرئيًا أو بدائل نصية مخفية.
يمكنك قراءة المزيد حول هذا المحدد في منشور مدونة الإصدار
البحث بواسطة aria-label
loading...
loading...
البحث بواسطة aria-labelledby
loading...
loading...
البحث حسب المحتوى
loading...
loading...
البحث حسب العنوان
loading...
loading...
البحث بواسطة خاصية alt
loading...
loading...
ARIA - سمة الدور
للاستعلام عن العناصر بناءً على أدوار ARIA، يمكنك تحديد دور العنصر مباشرةً مثل [role=button] كمعلمة محدد:
loading...
loading...
سمة ID
استراتيجية محدد "id" غير مدعومة في بروتوكول WebDriver، يجب على المرء استخدام استراتيجيات محدد CSS أو xPath بدلاً من ذلك للعثور على العناصر باستخدام ID.
ومع ذلك، قد تظل بعض برامج التشغيل (مثل Appium You.i Engine Driver) تدعم هذا المحدد.
صيغ المحدد المدعومة حاليًا لـ ID هي:
//css locator
const button = await $('#someid')
//xpath locator
const button = await $('//*[@id="someid"]')
//id strategy
// Note: works only in Appium or similar frameworks which supports locator strategy "ID"
const button = await $('id=resource-id/iosname')
دالة JS
يمكنك أيضًا استخدام دوال JavaScript لجلب العناصر باستخدام واجهات برمجة التطبيقات الأصلية للويب. بالطبع، يمكنك فقط القيام بذلك داخل سياق الويب (مثل browser، أو سياق الويب في الجوال).
بالنظر إلى بنية HTML التالية:
loading...
يمكنك الاستعلام عن العنصر الشقيق لـ #elem على النحو التالي:
loading...
المحددات العميقة
بدءًا من الإصدار v9 من WebdriverIO، لا حاجة إلى هذا المحدد الخاص حيث يخترق WebdriverIO تلقائيًا DOM الظلي من أجلك. يوصى بالتخلي عن هذا المحدد عن طريق إزالة >>> في مقدمته.
تعتمد العديد من تطبيقات الواجهة الأمامية بشكل كبير على العناصر ذات DOM الظلي. من المستحيل تقنيًا الاستعلام عن العناصر داخل DOM الظلي بدون حلول بديلة. كانت shadow$ وshadow$$ مثل هذه الحلول البديلة التي كانت لها قيود. باستخدام المحدد العميق، يمكنك الآن الاستعلام عن جميع العناصر داخل أي DOM ظلي باستخدام أمر الاستعلام الشائع.
بفرض أن لدينا تطبيقًا بالهيكل التالي:

باستخدام هذا المحدد، يمكنك الاستعلام عن عنصر <button /> المتداخل داخل DOM ظلي آخر، على سبيل المثال:
loading...
محددات الجوال
بالنسبة لاختبار الجوال الهجين، من المهم أن يكون خادم الأتمتة في السياق الصحيح قبل تنفيذ الأوامر. لأتمتة الإيماءات، يجب أن يتم تعيين برنامج التشغيل على السياق الأصلي بشكل مثالي. ولكن لتحديد العناصر من DOM، سيحتاج برنامج التشغيل إلى التعيين إلى سياق عرض الويب للمنصة. فقط بعد ذلك يمكن استخدام الطرق المذكورة أعلاه.
بالنسبة لاختبار الجوال الأصلي، لا يوجد تبديل بين السياقات، حيث يجب عليك استخدام استراتيجيات الجوال واستخدام تقنية أتمتة الجهاز الأساسية مباشرةً. هذا مفيد بشكل خاص عندما يحتاج الاختبار إلى بعض التحكم الدقيق في العثور على العناصر.
Android UiAutomator
يوفر إطار عمل UI Automator في Android عددًا من الطرق ل لعثور على العناصر. يمكنك استخدام واجهة برمجة تطبيقات UI Automator، وخاصة فئة UiSelector لتحديد مواقع العناصر. في Appium، ترسل كود Java، كسلسلة، إلى الخادم، الذي ينفذه في بيئة التطبيق، مع إعادة العنصر أو العناصر.
const selector = 'new UiSelector().text("Cancel").className("android.widget.Button")'
const button = await $(`android=${selector}`)
await button.click()
Android DataMatcher و ViewMatcher (Espresso فقط)
توفر استراتيجية DataMatcher في Android طريقة للعثور على العناصر بواسطة Data Matcher
const menuItem = await $({
"name": "hasEntry",
"args": ["title", "ViewTitle"]
})
await menuItem.click()
وبالمثل View Matcher
const menuItem = await $({
"name": "hasEntry",
"args": ["title", "ViewTitle"],
"class": "androidx.test.espresso.matcher.ViewMatchers"
})
await menuItem.click()