getContexts
Метод WebdriverIO getContexts
є вдосконаленою версією стандартної команди Appium contexts
(та попередньої команди WebdriverIO getContexts
). Він надає детальну та корисну інформацію
про доступні контексти в сесії мобільного додатку, вирішуючи обмеження стандартних методів Appium.
Як працюють веб-представлення та чим цей метод допомагає
Для отримання докладнішої інформації зверніться до документації по гібридним додаткам. Нижче наведено короткий огляд проблем, які вирішує команда getContexts
:
Проблеми Android
- Одне веб-представлення (наприклад,
WEBVIEW_{packageName}
) може містити кілька сторінок (подібно до вкладок браузера). - Стандартні методи Appium не включають деталі про ці сторінки, такі як
title
,url
або видимість, що ускладнює ідентифікацію потрібної сторінки та може призвести до нестабільності.
Проблеми iOS
- Стандартний метод Appium повертає лише загальні ідентифікатори веб-представлень (наприклад,
WEBVIEW_{id}
) без додаткових метаданих. - Це ускладнює визначення, яке веб-представлення відповідає цільовому екрану додатка.
Вдосконалений метод getContexts
вирішує ці проблеми, повертаючи детальні об'єкти контексту, які включають:
- Для Android:
title
,url
,packageName
,webviewPageId
та деталі макету (screenX
,screenY
,width
таheight
). - Для iOS:
bundleId
,title
таurl
.
Ці вдосконалення роблять налагодження та взаємодію з гібридними додатками більш надійною.
Чому варто використовувати цей метод?
За замовчуванням метод Appium contexts
повертає лише масив рядків, що представляють доступні контексти:
- Для Android:
['NATIVE_APP', 'WEBVIEW_com.wdiodemoapp', ...]
- Для iOS:
['NATIVE_APP', 'WEBVIEW_84392.1', ...]
Хоча цього достатньо для простих сценаріїв, цим стандартним відповідям бракує критичних метаданих для тестування гібридних додатків:
- Для Android: Відсутність метаданих, специфічних для сторінки, ускладнює взаємодію з потрібним веб-представленням.
- Для iOS: Загальні ідентифікатори веб-представлень не дають уявлення про вміст чи екран додатка, який вони представляють.
Вдосконалений метод getContexts
забезпечує:
- Детальні метадані як для Android, так і для iOS.
- Можливості фільтрувати та налаштовувати контексти, що повертаються, для кращого таргетування та взаємодії.
- Вдосконалений метод
getContexts
працює як на платформах Android, так і iOS. Однак дані, що повертаються, можуть відрізнятися залежно від платформи та тестованого додатка. - Якщо ви не вказуєте опцію
returnDetailedContexts
, метод поводиться як стандартний метод Appiumcontexts
, повертаючи простий масив контекстів. - Щоб використовувати "стандартний" метод Appium
contexts
, використовуйтеdriver.getAppiumContexts()
. Для отримання додаткової інформації див. документацію по контекстам Appium.
Веб-представлення Android:
- Метадані, такі як
androidWebviewData
, доступні лише колиreturnAndroidDescriptionData
встановлено якtrue
. - Використання методу
getContexts
у браузері Chrome може іноді повертати неповні дані через невідповідність версій браузера/Webview/ChromeDriver. У таких випадках можуть повертатися значення за замовчуванням або неправильнийwebviewPageId
(наприклад,0
).
Параметри
Назва | Тип | Деталі |
---|---|---|
options необов'язково | GetContextsOptions | Опції getContexts (необов'язково) |
options.returnDetailedContexts необов'язково | boolean | За замовчуванням, ми повертаємо лише назви контекстів на основі стандартного API Appium contexts . Якщо ви хочете отримати всі дані, ви можете встановити це значення як true . За замовчуванням - false (необов'язково). |
options.androidWebviewConnectionRetryTime необов'язково | number | Час у мілісекундах для очікування між кожною спробою підключення до веб-представлення. За замовчуванням - 500 мс (необов'язково). ТІЛЬКИ ДЛЯ ANDROID |
options.androidWebviewConnectTimeout необов'язково | number | Максимальний час у мілісекундах для очікування виявлення сторінки веб-представлення. За замовчуванням - 5000 мс (необов'язково). ТІЛЬКИ ДЛЯ ANDROID |
options.filterByCurrentAndroidApp необов'язково | boolean | За замовчуванням ми повертаємо всі веб-представлення. Якщо ви хочете фільтрувати веб-представлення за поточним відкритим додатком Android, ви можете встановити це значення як true . За замовчуванням - false (необов'язково). ПРИМІТКА: Зверніть увагу, що ви також можете НЕ знайти жодного Webview на основі цього "обмеження". ТІЛЬКИ ДЛЯ ANDROID |
options.isAndroidWebviewVisible необов'язково | boolean | За замовчуванням ми повертаємо лише веб-представлення, які приєднані та видимі. Якщо ви хочете отримати всі веб-представлення, ви можете встановити це значення як false (необов'язково). За замовчуванням - true . ТІЛЬКИ ДЛЯ ANDROID |
options.returnAndroidDescriptionData необов'язково | boolean | За замовчуванням немає даних опису веб-представлення Android (Chrome). Якщо ви хочете отримати всі дані, ви можете встановити це значення як true . За замовчуванням - false (необов'язково). Увімкнувши цю опцію, ви отримаєте додаткові дані у відповіді, див. description.data.test.js для отримання додаткової інформації. ТІЛЬКИ ДЛЯ ANDROID |
Приклади
it('should return all contexts in the current session with the default Appium `contexts`-method.', async () => {
// For Android
await driver.getContexts()
// Returns ['NATIVE_APP', 'WEBVIEW_com.wdiodemoapp', ...]
//
// For iOS, the context will be 'WEBVIEW_{number}'
await driver.getContexts()
// Returns [ 'NATIVE_APP', 'WEBVIEW_84392.1', ... ]
})
it('should return all contexts in the current session with detailed info.', async () => {
// For Android
await driver.getContexts({returnDetailedContexts: true})
// Returns [
// { id: 'NATIVE_APP' },
// {
// id: 'WEBVIEW_com.wdiodemoapp',
// title: 'WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO',
// url: 'https://webdriver.io/',
// packageName: 'com.wdiodemoapp',
// webviewPageId: '58B0AA2DBBBBBE9008C35AE42385BB0D'
// },
// {
// id: 'WEBVIEW_chrome',
// title: 'Android | Get more done with Google on Android-phones and devices',
// url: 'https://www.android.com/',
// packageName: 'com.android.chrome',
// webviewPageId: '0'
// }
// ]
//
// For iOS, the context will be 'WEBVIEW_{number}'
await driver.getContexts({returnDetailedContexts: true})
// Returns: [
// { id: 'NATIVE_APP' },
// {
// id: 'WEBVIEW_86150.1',
// title: 'WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO',
// url: 'https://webdriver.io/',
// bundleId: 'org.reactjs.native.example.wdiodemoapp'
// },
// {
// id: 'WEBVIEW_86152.1',
// title: 'Apple',
// url: 'https://www.apple.com/',
// bundleId: 'com.apple.mobilesafari'
// }
// ]
})
it('should return Android description data for the webview', async () => {
// For Android
await driver.getContexts({returnDetailedContexts: true, returnAndroidDescriptionData: true})
// Returns [
// { id: 'NATIVE_APP' },
// {
// androidWebviewData: {
// // Indicates whether the web page is currently attached to a web view.
// // `true` means the page is attached and likely active, `false` indicates it is not.
// attached: true,
// // Indicates whether the web page is empty or not. An empty page typically means that
// // there is no significant content loaded in it. `true` indicates the page is empty,
// // `false` indicates it has content.
// empty: false,
// // Indicates whether the page has never been attached to a web view. If `true`, the
// // page has never been attached, which could indicate a new or unused page. If `false`,
// // the page has been attached at some point.
// neverAttached: false,
// // Indicates whether the web page is visible on the screen. `true` means the page is
// // visible to the user, `false` means it is not.
// visible: true,
// // This data can be super useful to determine where on the screen the webview is located
// // and can come in handy when you want to interact with elements on the screen based on
// // coordinates based on the top-left corner of the screen
// screenX: 0,
// screenY: 151,
// height: 2589,
// width: 1344
// },
// id: 'WEBVIEW_com.wdiodemoapp',
// title: 'WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO',
// url: 'https://webdriver.io/',
// packageName: 'com.wdiodemoapp',
// webviewPageId: '58B0AA2DBBBBBE9008C35AE42385BB0D'
// }
// ]
})