Мультиудаленное управление
WebdriverIO позволяет запускать несколько автоматизированных сессий в одном тесте. Это удобно при тестировании функций, требующих нескольких пользователей (например, чат или WebRTC приложения).
Вместо создания нескольких удаленных экземпляров, где вам нужно выполнять общие команды, такие как newSession
или url
для каждого экземпляра, вы можете просто создать экземпляр multiremote и управлять всеми браузерами одновременно.
Для этого просто используйте функцию multiremote()
и передайте объект с именами в качестве ключей и capabilities
в качестве значений. Давая каждой возможности имя, вы можете легко выбирать и получать доступ к конкретному экземпляру при выполнении команд.
Multiremote не предназначен для параллельного выполнения всех ваших тестов. Он предназначен для координации нескольких браузеров и/или мобильных устройств для специальных интеграционных тестов (например, чат-приложений).
Все экземпляры multiremote возвращают массив результатов. Первый результат представляет возможность, определенную первой в объекте возможностей, второй результат - вторую возможность и так далее.
Использование автономного режима
Вот пример создания экземпляра multiremote в автономном режиме:
import { multiremote } from 'webdriverio'
(async () => {
const browser = await multiremote({
myChromeBrowser: {
capabilities: {
browserName: 'chrome'
}
},
myFirefoxBrowser: {
capabilities: {
browserName: 'firefox'
}
}
})
// открыть URL в обоих браузерах одновременно
await browser.url('http://json.org')
// выполнить команды одновременно
const title = await browser.getTitle()
expect(title).toEqual(['JSON', 'JSON'])
// кликнуть на элемент одновременно
const elem = await browser.$('#someElem')
await elem.click()
// кликнуть только в одном браузере (Firefox)
await elem.getInstance('myFirefoxBrowser').click()
})()
Использование WDIO Testrunner
Чтобы использовать multiremote в тестраннере WDIO, просто определите объект capabilities
в вашем wdio.conf.js
как объект с именами браузеров в качестве ключей (вместо списка возможностей):
export const config = {
// ...
capabilities: {
myChromeBrowser: {
capabilities: {
browserName: 'chrome'
}
},
myFirefoxBrowser: {
capabilities: {
browserName: 'firefox'
}
}
}
// ...
}
Это создаст две сессии WebDriver с Chrome и Firefox. Вместо Chrome и Firefox вы также можете запустить два мобильных устройства с помощью Appium или одно мобильное устройство и один браузер.
Вы также можете запускать multiremote параллельно, поместив объект возможностей браузера в массив. Убедитесь, что в каждом браузере включено поле capabilities
, так как это способ различения каждого режима.
export const config = {
// ...
capabilities: [{
myChromeBrowser0: {
capabilities: {
browserName: 'chrome'
}
},
myFirefoxBrowser0: {
capabilities: {
browserName: 'firefox'
}
}
}, {
myChromeBrowser1: {
capabilities: {
browserName: 'chrome'
}
},
myFirefoxBrowser1: {
capabilities: {
browserName: 'firefox'
}
}
}]
// ...
}
Вы даже можете запустить один из облачных сервисов вместе с локальными экземплярами Webdriver/Appium или Selenium Standalone. WebdriverIO автоматически определяет возможности облачного бэкенда, если вы указали bstack:options
(Browserstack), sauce:options
(SauceLabs) или tb:options
(TestingBot) в возможностях браузера.
export const config = {
// ...
user: process.env.BROWSERSTACK_USERNAME,
key: process.env.BROWSERSTACK_ACCESS_KEY,
capabilities: {
myChromeBrowser: {
capabilities: {
browserName: 'chrome'
}
},
myBrowserStackFirefoxBrowser: {
capabilities: {
browserName: 'firefox',
'bstack:options': {
// ...
}
}
}
},
services: [
['browserstack', 'selenium-standalone']
],
// ...
}
Здесь возможна любая комбинация ОС/браузера (включая мобильные и настольные браузеры). Вс е команды, которые ваши тесты вызывают через переменную browser
, выполняются параллельно с каждым экземпляром. Это помогает оптимизировать ваши интеграционные тесты и ускорить их выполнение.
Например, если вы открываете URL:
browser.url('https://socketio-chat-h9jt.herokuapp.com/')
Результат каждой команды будет объектом с именами браузеров в качестве ключей и результа тами команд в качестве значений:
// пример тестраннера wdio
await browser.url('https://www.whatismybrowser.com')
const elem = await $('.string-major')
const result = await elem.getText()
console.log(result[0]) // возвращает: 'Chrome 40 on Mac OS X (Yosemite)'
console.log(result[1]) // возвращает: 'Firefox 35 on Mac OS X (Yosemite)'
Обратите внимание, что каждая команда выполняется одна за другой. Это означает, что команда завершается, когда все браузеры ее выполнили. Это полезно, потому что сохраняет синхронизацию действий браузера, что облегчает понимание того, что происходит в данный момент.
Иногда необходимо выполнять разные действия в каждом браузере для тестирования. Например, если мы хотим протестировать чат-приложение, один браузер должен отправить текстовое сообщение, а другой браузер должен ждать его получения, а затем выполнить проверку.