تغییر زمینه
تغییر به یک زمینه خاص با استفاده از name، title یا url Webview مشخص.
این روش دستور پیشفرض context آپیوم را با ارائه انعطافپذیری و دقت بیشتر برای جابجایی بین زمینههای بومی و وبویو در برنامههای موبایل هیبریدی بهبود میبخشد.
نحوه کارکرد زمینهها
برای نمای کلی از برنامههای هیبریدی و وبویوها، به مستندات برنامههای هیبریدی مراجعه کنید.
در زیر خلاصهای از چگونگی پرداختن دستور switchContext به چالشهای رایج آمده است:
چالشهای اندروید
- وبویوها اغلب شامل چندین صفحه (مشابه تبهای مرورگر) هستند. شناسایی صفحه صحیح نیاز به متادیتای اضافی مانند
titleیاurlدارد که توسط روشهای پیشفرض آپیوم ارائه نمیشود. - روشهای پیشفرض آپیوم فقط نامهای زمینه اصلی (مانند
WEBVIEW_{packageName}) را بدون جزئیات در مورد محتوا یا صفحات درون وبویو برمیگردانند. - تغییر زمینه در اندروید شامل دو مرحله است که به صورت خودکار توسط این روش انجام میشود:
- تغییر به زمینه وبویو با استفاده از
WEBVIEW_{packageName}. - انتخاب صفحه مناسب درون وبویو با استفاده از روش
switchToWindow.
- تغییر به زمینه وبویو با استفاده از
چالشهای iOS
- وبویوها با شناسههای عمومی (مانند
WEBVIEW_{id}) شناسایی میشوند که اطلاعاتی در مورد محتوا یا صفحه برنامه مربوطه ارائه نمیدهند. - تعیین وبویو صحیح برای تعامل اغلب نیاز به آزمون و خطا دارد.
روش switchContext این فرآیند را با بازیابی متادیتای دقیق (مانند title، url و قابلیت مشاهده) ساده میکند تا تغییر زمینه دقیق و قابل اعتماد تضمین شود.
چرا از این روش استفاده کنیم؟
- تغییر سادهشده: اگر
titleیاurlوبویو مورد نظر را میدانید، این روش نیاز به فراخوانیهای اضافی بهgetContextsیا ترکیب چندین روش مانندswitchContext({id})وgetTitle()را حذف میکند. - تطبیق خودکار زمینه: بهترین تطابق برای یک زمینه را بر اساس موارد زیر پیدا میکند:
- شناسههای مختص پلتفرم (
bundleIdبرای iOS،packageNameبرای اندروید). - تطابقهای دقیق یا جزئی برای
titleیاurl(هم رشتهها و هم عبارات منظم را پشتیبانی میکند). - بررسیهای مختص اندروید برای اطمینان از متصل و قابل مشاهده بودن وبویوها.
- شناسههای مختص پلتفرم (
- کنترل دقیق: فواصل تلاش مجدد و مهلتهای سفارشی (فقط اندروید) به شما امکان میدهد تأخیر در راهاندازی وبویو را مدیریت کنید.
- دسترسی به روش پیشفرض آپیوم: در صورت نیاز، میتوانید از دستور پیشفرض آپیوم
switchContextاز طریقdriver.switchAppiumContext()استفاده کنید.
نکات و محدودیتها
- اگر
titleیاurlوبویو مورد نظر شناخته شده باشد، این روش میتواند به طور خودکار زمینه منطبق را پیدا کند و بدون فراخوانیهای اضافیgetContextsبه آن تغییر دهد. - گزینههای مختص اندروید مانند
androidWebviewConnectionRetryTimeوandroidWebviewConnectTimeoutبرای iOS قابل استفاده نیستند. - دلایل شکست تطبیق زمینه را برای کمک به اشکالزدایی ثبت میکند.
- هنگام استفاده از یک شیء به عنوان ورودی، یا
titleیاurlمورد نیاز است.
پارامترها
| نام | نوع | جزئیات |
|---|---|---|
context | string, SwitchContextOptions | نام زمینهای که باید به آن تغییر داده شود. یک شیء با گزینههای زمینه بیشتر میتواند ارائه شود. |
options | SwitchContextOptions | گزینههای دستور switchContext |
options.titleاختیاری | string, RegExp | عنوان صفحهای که باید به آن تغییر داده شود. این محتوای تگ عنوان یک صفحه وبویو خواهد بود. میتوانید از یک رشته که باید کاملاً مطابقت داشته باشد یا یک عبارت منظم استفاده کنید. مهم: هنگامی که از گزینهها استفاده میکنید، یا خاصیت title یا url مورد نیاز است. |
options.urlاختیاری | string, RegExp | URL صفحهای که باید به آن تغییر داده شود. این url یک صفحه وبویو خواهد بود. میتوانید از یک رشته که باید کاملاً مطابقت داشته باشد یا یک عبارت منظم استفاده کنید.مهم: هنگامی که از گزینهها استفاده میکنید، یا خاصیت title یا url مورد نیاز است. |
options.androidWebviewConnectionRetryTimeاختیاری | number | زمان به میلیثانیه برای انتظار بین هر تلاش مجدد برای اتصال به وبویو. پیشفرض 500 میلیثانیه است (اختیاری). فقط برای اندروید و فقط زمانی استفاده میشود که title یا url ارائه شده باشد. |
options.androidWebviewConnectTimeoutاختیاری | number | حداکثر مدت زمان به میلیثانیه برای انتظار تشخیص صفحه وبویو. پیشفرض 5000 میلیثانیه است (اختیاری). فقط برای اندروید و فقط زمانی استفاده میشود که title یا url ارائه شده باشد. |
مثالها
example.test.js
it('should switch to a webview by name and uses the default Appium `context`-method', async () => {
// For Android, the context will be '`WEBVIEW_{packageName}`'
await driver.switchContext('WEBVIEW_com.wdiodemoapp')
// For iOS, the context will be 'WEBVIEW_{number}'
await driver.switchContext('WEBVIEW_94703.19')
})
exact.title.test.js
it('should switch to a webview and match a webview based on an EXACT match of the `title` of the webview', async () => {
await driver.switchContext({
// In this case the title needs to be an exact match
title: 'Webview Title',
})
})
exact.url.test.js
it('should switch to a webview and match a webview based on an EXACT match of the `title` of the webview', async () => {
await driver.switchContext({
// In this case the url needs to be an exact match
url: 'https://webdriver.io',
})
})
regex.title.url.test.js
it('should switch to a webview and match a webview based on regex match of the `title` and `url` of the webview', async () => {
await driver.switchContext({
// The title should NOT end with 'foo'
title: /^(?!.*foo$)/,
// Matches any string that contains the substring `docs/api/mobile/switchContext`
url: /.*docs\/api\/mobile\/switchContext/,
})
})
android.context.waits.test.js
it('should switch to a webview for Android but wait longer to connect and find a webview based on provided options', async () => {
await driver.switchContext({
// In this case the title need to be an exact match
title: 'Webview Title',
// For Android we might need to wait a bit longer to connect to the webview, so we can provide some additional options
androidWebviewConnectionRetryTime: 1*1000, // Retry every 1 second
androidWebviewConnectTimeout: 10*1000, // Timeout after 10 seconds
})
})