گزینشگر ها (selectors)
پروتکل WebDriver چندین استراتژی گزینشگر برای درخواست یک عنصر فراهم می کند. WebdriverIO آنها را برای ساده نگه داشتن انتخاب عناصر ساده می کند. لطفاً توجه داشته باشید که با وجود اینکه دستور درخواست عناصر $
و $$
نامیده می شوند، آنها هیچ ارتباطی با jQuery یا موتور Sizzle Selector ندارند.
در حالی که انتخابکنندههای مختلف بسیار زیادی وجود دارد، تنها تعداد کمی از آنها راه مستحکم و انعطاف پذیری را برای یافتن عنصر مناسب ارائه میدهند. به عنوان مثال، دکمه زیر را در نظر بگیرید:
<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"]') | ✅خوب | به ویژگی اضافی نیاز دارد که به a11y متصل نیست. |
$('aria/Submit') or $('button=Submit') | ✅ همیشه | بهترین. شبیه نحوه تعامل کاربر با صفحه است. |
انتخابگر درخواست CSS
اگر غیر از این مشخص نشده باشد، WebdriverIO عناصر را با استفاده از الگوی انتخابگر CSS درخواست می کند، به عنوان مثال:
loading...
متن لینک
برای به دست آوردن یک عنصر انکر با یک متن خاص در آن، متنی را که با علامت تساوی (=
) شروع می شود درخواست کنید.
برای مثال:
loading...
می توانید این عنصر را با فراخوانی فرمان زیر درخواست کنید:
loading...
متن پیوند جزئی
برای یافتن یک عنصر انکر که متن قابل م شاهده آن تا حدی با مقدار جستجوی شما مطابقت دارد، با استفاده از *=
در جلوی رشته جستجو (به عنوان مثال *=driver
) آن را پرس و جو کنید.
شما می توانید عنصر مثال بالا را همچنین با فراخوانی فرمان زیر درخواست کنید:
loading...
نکته: شما نمیتوانید چند استراتژی انتخابگر را در یک انتخابگر ترکیب کنید. برای رسیدن به یک هدف، از درخواست های چند عنصر زنجیره ای استفاده کنید، به عنوان مثال:
const elem = await $('header h1*=Welcome') // doesn't work!!!
// use instead
const elem = await $('header').$('*=driver')
عنصر با متن خاص
همین تکنیک را می توان برای عناصر نیز به کار برد.
به عنوان مثال، در اینجا یک درخواست برای عنوان سطح 1 با متن "به صفحه من خوش آمدید" وجود دارد:
loading...
می توانید این عنصر را با فراخوانی فرمان زیر درخواست کنید:
loading...
یا با استفاده از درخواست بخشی از متن:
loading...
همین کار برای id
و نام کلاس
هم کار می کند:
loading...
می توانید این عنصر را با فراخوانی فرمان زیر درخواست کنید:
loading...
نکته: شما نمیتوانید چند استراتژی انتخابگر را در یک انتخابگر ترکیب کنید. برای رسیدن به یک هدف، از درخواست های چند عنصر زنجیره ای استفاده کنید، به عنوان مثال:
const elem = await $('header h1*=Welcome') // doesn't work!!!
// use instead
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 - Role
برای جست و جوی عناصر بر اساس ARIA Role، می توانید مستقیماً نقش عنصر را مانند [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
همچنین می توانید از توابع جاوا اسکریپت برای دریافت عناصر با استفاده از API های بومی وب استفاده کنید. البته، شما فقط می توانید این ک ار را در یک زمینه وب (به عنوان مثال، browser
، یا وب در تلفن همراه) انجام دهید.
ساختار HTML زیر را فرض کنید:
loading...
می توانید عنصر خواهر و برادر #elem
را به صورت زیر جستجو کنید:
loading...
انتخابگرهای عمیق
بسیاری از برنامه های فرانت اند به شدت به عناصر دارای Shadow DOM متکی هستند. از نظر فنی امکان درخواست عناصر در Shadow DOM بدون راه حل های خاص وجود ندارد. shadow$
و shadow$$
راه حل هایی بوده اند که محدودیت خود را داشتند. با انتخابگر عمیق، اکنون می توانید با استفاده از دستور query مشترک، همه عناصر را در هر DOM سایه ای درخواست کنید.
فرض کنید یک برنامه با ساختار زیر داریم:
با استفاده از این انتخابگر می توانید عنصر <button />
را که در یک Shadow DOM دیگر قرار دارد، جستجو کنید، به عنوان مثال:
loading...
انتخابگرهای موبایل
برای آزمایش موبایل هیبریدی، مهم است که سرور اتوماسیون قبل از اجرای دستورها در context صحیحی باشد. برای خودکار کردن حرکات، درایور در حالت ایدهآل باید روی بافت بومی تنظیم شود. اما برای انتخاب عناصر از DOM، درایور باید روی زمینه وبنمای پلتفرم تنظیم شود. فقط بعد از آن می توان از روش های ذکر شده در بالا استفاده کرد.
برای تست بومی موبایل، هیچ تغییری بین زمینهها وجود ندارد، زیرا باید از استراتژیهای تلفن همراه استفاده کنید و مستقیماً از فناوری اتوماسیون زیربنای دستگاه استفاده کنید. این امر به ویژه زمانی مفید است که یک تست به کنترل دقیقی بر یافتن عناصر نیاز دارد.
Android UiAutomator
فریم ورک UI Automator اندروید راه های زیادی برای یافتن عناصر ارائه می دهد. شما می توانید از UI Automator API، به ویژه کلاس UiSelector برای مکان یابی عناصر استفاده کنید. در Appium شما کد جاوا را به صورت رشته ای به سرور ارسال می کنید که آن را در محیط برنامه اجرا می کند و عنصر یا عناصر را برمی گرداند.
const selector = 'new UiSelector().text("Cancel").className("android.widget.Button")'
const button = await $(`android=${selector}`)
await button.click()
Android DataMatcher و ViewMatcher (فقط Espresso)
استراتژی DataMatcher اندروید راهی برای یافتن عناصر توسط 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()
تگ View اندروید (فقط Espresso)
استراتژی تگ view یک راه راحت برای یافتن عناصر با برچسب آنها ارائه می دهد.
const elem = await $('-android viewtag:tag_identifier')
await elem.click()