Пользовательские команды
Если вы хотите расширить экземпляр browser
собственным набором команд, метод браузера addCommand
к вашим услугам. Вы можете написать свою команду асинхронным образом, так же как и в ваших спецификациях.
Параметры
Имя команды
Имя, которое определяет команду и будет присоединено к области видимости браузера или элемента.
Тип: String
Пользовательская функция
Функция, которая выполняется при вызове команды. Область видимости this
- это либо WebdriverIO.Browser
, либо WebdriverIO.Element
в зависимости от того, присоединяется ли команда к области видимости браузера или эл емента.
Тип: Function
Целевая область видимости
Флаг для определения, прикреплять ли команду к области видимости браузера или элемента. Если установлено значение true
, команда будет командой элемента.
Тип: Boolean
По умолчанию: false
Примеры
Этот пример показывает, как добавить новую команду, которая возвращает текущий URL и заголовок как один результат. Область видимости (this
) - это объект WebdriverIO.Browser
.
browser.addCommand('getUrlAndTitle', async function (customVar) {
// `this` ссылается на область видимости `browser`
return {
url: await this.getUrl(),
title: await this.getTitle(),
customVar: customVar
}
})
Кроме того, вы можете расширить экземпляр элемента собственным набором команд, передав true
в качестве последнего аргумента. Область видимости (this
) в этом случае является объектом WebdriverIO.Element
.
browser.addCommand("waitAndClick", async function () {
// `this` - это возвращаемое значение $(selector)
await this.waitForDisplayed()
await this.click()
}, true)
Пользовательские команды дают вам возможность объединить определенную последовательность команд, которые вы часто используете, в один вызов. Вы можете определить пользовательские команды в любой точке вашего тестового набора; просто убедитесь, что команда определена до ее первого использования. (Хук before
в вашем wdio.conf.js
- хорошее место для их создания.)
После определения вы можете использовать их следующим образом:
it('should use my custom command', async () => {
await browser.url('http://www.github.com')
const result = await browser.getUrlAndTitle('foobar')
assert.strictEqual(result.url, 'https://github.com/')
assert.strictEqual(result.title, 'GitHub · Where software is built')
assert.strictEqual(result.customVar, 'foobar')
})
Примечание: Если вы регистрируете пользовательскую команду в области видимости browser
, команда не будет доступна для элементов. Аналогично, если вы регистрируете команду в области видимости элемента, она не будет доступна в области видимости browser
:
browser.addCommand("myCustomBrowserCommand", () => { return 1 })
const elem = await $('body')
console.log(typeof browser.myCustomBrowserCommand) // выводит "function"
console.log(typeof elem.myCustomBrowserCommand()) // выводит "undefined"
browser.addCommand("myCustomElementCommand", () => { return 1 }, true)
const elem2 = await $('body')
console.log(typeof browser.myCustomElementCommand) // выводит "undefined"
console.log(await elem2.myCustomElementCommand('foobar')) // выводит "1"
const elem3 = await $('body')
elem3.addCommand("myCustomElementCommand2", () => { return 2 })
console.log(typeof browser.myCustomElementCommand2) // выводит "undefined"
console.log(await elem3.myCustomElementCommand2('foobar')) // выводит "2"
Примечание: Если вам нужно объединить пользовательскую команду в цепочку, команда должна заканчиваться символом $
,
browser.addCommand("user$", (locator) => { return ele })
browser.addCommand("user$", (locator) => { return ele }, true)
await browser.user$('foo').user$('bar').click()
Будьте осторожны, чтобы не перегрузить область видимости browser
слишком большим количеством пользовательских команд.
Мы рекомендуем определять пользовательскую логику в объектах страниц, чтобы они были привязаны к конкретной странице.
Multiremote
addCommand
работает аналогично для multiremote, за исключением того, что новая команда будет распространяться на дочерние экземпляры. Вы должны быть внимательны при использовании объекта this
, поскольку multiremote browser
и его дочерние экземпляры имеют разные this
.
Этот пример показывает, как добавить новую команду для multiremote.
import { multiremotebrowser } from '@wdio/globals'
multiremotebrowser.addCommand('getUrlAndTitle', async function (this: WebdriverIO.MultiRemoteBrowser, customVar: any) {
// `this` ссылается на:
// - Область видимости MultiRemoteBrowser для браузера
// - Область видимости Browser для экземпляров
return {
url: await this.getUrl(),
title: await this.getTitle(),
customVar: customVar
}
})
multiremotebrowser.getUrlAndTitle()
/*
{
url: [ 'https://webdriver.io/', 'https://webdriver.io/' ],
title: [
'WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO',
'WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO'
],
customVar: undefined
}
*/
multiremotebrowser.getInstance('browserA').getUrlAndTitle()
/*
{
url: 'https://webdriver.io/',
title: 'WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO',
customVar: undefined
}
*/