Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,65 @@ export default wdioEslint.config([
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/no-explicit-any': 'off'
}
},
{
files: ['src/**/*.ts'],
plugins: {
local: {
rules: {
'enforce-options-list': {
create(context) {
const fileName = context.filename || context.getFilename()
const isConstantsFile = fileName.endsWith('src/constants.ts')
const definedOptions = new Set()
let listNode = null
const listElements = new Set()

return {
VariableDeclarator(node) {
if (node.id.type === 'Identifier') {
if (node.id.name.includes('DEFAULT_OPTIONS')) {
if (isConstantsFile) {
definedOptions.add(node.id.name)
} else {
context.report({
node: node.id,
message: `Option '${node.id.name}' must be included in 'src/constants.ts#defaultOptionsList', so it can be globally overridden.`
})
}
}
if (isConstantsFile && node.id.name === 'defaultOptionsList' && node.init && node.init.type === 'ArrayExpression') {
listNode = node
node.init.elements.forEach(el => {
if (el && el.type === 'Identifier') {
listElements.add(el.name)
}
})
}
}
},
'Program:exit'() {
if (!listNode) {
return
}

definedOptions.forEach(opt => {
if (!listElements.has(opt)) {
context.report({
node: listNode,
message: `Option '${opt}' must be included in 'defaultOptionsList', so it can be globally overridden in 'src/constants.ts'.`
})
}
})
}
}
}
}
}
}
},
rules: {
'local/enforce-options-list': 'error'
}
}
])
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@
"watch": "npm run compile -- --watch",
"prepare": "husky install",
"playgrounds:setup": "for dir in playgrounds/*/; do cd \"$dir\" && npm install && cd ../..; done",
"playgrounds:checks:all": "for dir in playgrounds/*/; do cd \"$dir\" && npm run checks:all && cd ../..; done"
"playgrounds:checks:all": "for dir in playgrounds/*/; do cd \"$dir\" && npm run checks:all && cd ../..; done",
"playgrounds:snapshots:update": "cd playgrounds/mocha && npm run snapshots:update && cd ../jest && npm run snapshots:update && cd ../.."
},
"dependencies": {
"@vitest/snapshot": "^4.0.16",
Expand Down
1 change: 0 additions & 1 deletion playgrounds/jasmine/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion playgrounds/jest/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion playgrounds/jest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"typecheck": "tsc --noEmit",
"test": "wdio run wdio.conf.ts",
"lint": "eslint .",
"checks:all": "npm run typecheck && npm run lint && npm test"
"checks:all": "npm run typecheck && npm run lint && npm test",
"snapshots:update": "npm run test -- --spec snapshot.test.ts --updateSnapshots"
},
"devDependencies": {
"@types/jest": "^30.0.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ exports[`DOM snapshots > should match command result snapshot 1`] = `

exports[`DOM snapshots > should match element outerHTML snapshot 1`] = `
"<div class="navbar__logo">
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIDAgNjQgNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+TG9nbyBSZWd1bGFyPC90aXRsZT4KICAgIDxnIGlkPSJMb2dvLVJlZ3VsYXIiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUiIGZpbGw9IiNFQTU5MDYiIHg9IjAiIHk9IjAiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgcng9IjUiPjwvcmVjdD4KICAgICAgICA8cGF0aCBkPSJNOCwxNiBMOCw0OCBMNiw0OCBMNiwxNiBMOCwxNiBaIE00MywxNiBDNTEuODM2NTU2LDE2IDU5LDIzLjE2MzQ0NCA1OSwzMiBDNTksNDAuODM2NTU2IDUxLjgzNjU1Niw0OCA0Myw0OCBDMzQuMTYzNDQ0LDQ4IDI3LDQwLjgzNjU1NiAyNywzMiBDMjcsMjMuMTYzNDQ0IDM0LjE2MzQ0NCwxNiA0MywxNiBaIE0yNywxNiBMMTQuMTA2LDQ3Ljk5OTIwNzggTDExLjk5OSw0Ny45OTkyMDc4IEwyNC44OTQsMTYgTDI3LDE2IFogTTQzLDE4IEMzNS4yNjgwMTM1LDE4IDI5LDI0LjI2ODAxMzUgMjksMzIgQzI5LDM5LjczMTk4NjUgMzUuMjY4MDEzNSw0NiA0Myw0NiBDNTAuNzMxOTg2NSw0NiA1NywzOS43MzE5ODY1IDU3LDMyIEM1NywyNC4yNjgwMTM1IDUwLjczMTk4NjUsMTggNDMsMTggWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==" alt="WebdriverIO" class="themedComponent_JvB9 themedComponent--dark_YZyB" />
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIDAgNjQgNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+TG9nbyBSZWd1bGFyPC90aXRsZT4KICAgIDxnIGlkPSJMb2dvLVJlZ3VsYXIiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUiIGZpbGw9IiNFQTU5MDYiIHg9IjAiIHk9IjAiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgcng9IjUiPjwvcmVjdD4KICAgICAgICA8cGF0aCBkPSJNOCwxNiBMOCw0OCBMNiw0OCBMNiwxNiBMOCwxNiBaIE00MywxNiBDNTEuODM2NTU2LDE2IDU5LDIzLjE2MzQ0NCA1OSwzMiBDNTksNDAuODM2NTU2IDUxLjgzNjU1Niw0OCA0Myw0OCBDMzQuMTYzNDQ0LDQ4IDI3LDQwLjgzNjU1NiAyNywzMiBDMjcsMjMuMTYzNDQ0IDM0LjE2MzQ0NCwxNiA0MywxNiBaIE0yNywxNiBMMTQuMTA2LDQ3Ljk5OTIwNzggTDExLjk5OSw0Ny45OTkyMDc4IEwyNC44OTQsMTYgTDI3LDE2IFogTTQzLDE4IEMzNS4yNjgwMTM1LDE4IDI5LDI0LjI2ODAxMzUgMjksMzIgQzI5LDM5LjczMTk4NjUgMzUuMjY4MDEzNSw0NiA0Myw0NiBDNTAuNzMxOTg2NSw0NiA1NywzOS43MzE5ODY1IDU3LDMyIEM1NywyNC4yNjgwMTM1IDUwLjczMTk4NjUsMTggNDMsMTggWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==" alt="WebdriverIO" class="themedComponent_wx_6 themedComponent--dark_CdPN" />
</div>"
`;

Expand Down
1 change: 0 additions & 1 deletion playgrounds/mocha/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion playgrounds/mocha/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"typecheck": "tsc --noEmit",
"test": "wdio run wdio.conf.ts",
"lint": "eslint .",
"checks:all": "npm run typecheck && npm run lint && npm test"
"checks:all": "npm run typecheck && npm run lint && npm test",
"snapshots:update": "npm run test -- --spec snapshot.test.ts --updateSnapshots"
},
"devDependencies": {
"@wdio/cli": "^9.4.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ exports[`DOM snapshots > should match command result snapshot 1`] = `

exports[`DOM snapshots > should match element outerHTML snapshot 1`] = `
"<div class="navbar__logo">
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIDAgNjQgNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+TG9nbyBSZWd1bGFyPC90aXRsZT4KICAgIDxnIGlkPSJMb2dvLVJlZ3VsYXIiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUiIGZpbGw9IiNFQTU5MDYiIHg9IjAiIHk9IjAiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgcng9IjUiPjwvcmVjdD4KICAgICAgICA8cGF0aCBkPSJNOCwxNiBMOCw0OCBMNiw0OCBMNiwxNiBMOCwxNiBaIE00MywxNiBDNTEuODM2NTU2LDE2IDU5LDIzLjE2MzQ0NCA1OSwzMiBDNTksNDAuODM2NTU2IDUxLjgzNjU1Niw0OCA0Myw0OCBDMzQuMTYzNDQ0LDQ4IDI3LDQwLjgzNjU1NiAyNywzMiBDMjcsMjMuMTYzNDQ0IDM0LjE2MzQ0NCwxNiA0MywxNiBaIE0yNywxNiBMMTQuMTA2LDQ3Ljk5OTIwNzggTDExLjk5OSw0Ny45OTkyMDc4IEwyNC44OTQsMTYgTDI3LDE2IFogTTQzLDE4IEMzNS4yNjgwMTM1LDE4IDI5LDI0LjI2ODAxMzUgMjksMzIgQzI5LDM5LjczMTk4NjUgMzUuMjY4MDEzNSw0NiA0Myw0NiBDNTAuNzMxOTg2NSw0NiA1NywzOS43MzE5ODY1IDU3LDMyIEM1NywyNC4yNjgwMTM1IDUwLjczMTk4NjUsMTggNDMsMTggWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==" alt="WebdriverIO" class="themedComponent_JvB9 themedComponent--dark_YZyB" />
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIDAgNjQgNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+TG9nbyBSZWd1bGFyPC90aXRsZT4KICAgIDxnIGlkPSJMb2dvLVJlZ3VsYXIiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUiIGZpbGw9IiNFQTU5MDYiIHg9IjAiIHk9IjAiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgcng9IjUiPjwvcmVjdD4KICAgICAgICA8cGF0aCBkPSJNOCwxNiBMOCw0OCBMNiw0OCBMNiwxNiBMOCwxNiBaIE00MywxNiBDNTEuODM2NTU2LDE2IDU5LDIzLjE2MzQ0NCA1OSwzMiBDNTksNDAuODM2NTU2IDUxLjgzNjU1Niw0OCA0Myw0OCBDMzQuMTYzNDQ0LDQ4IDI3LDQwLjgzNjU1NiAyNywzMiBDMjcsMjMuMTYzNDQ0IDM0LjE2MzQ0NCwxNiA0MywxNiBaIE0yNywxNiBMMTQuMTA2LDQ3Ljk5OTIwNzggTDExLjk5OSw0Ny45OTkyMDc4IEwyNC44OTQsMTYgTDI3LDE2IFogTTQzLDE4IEMzNS4yNjgwMTM1LDE4IDI5LDI0LjI2ODAxMzUgMjksMzIgQzI5LDM5LjczMTk4NjUgMzUuMjY4MDEzNSw0NiA0Myw0NiBDNTAuNzMxOTg2NSw0NiA1NywzOS43MzE5ODY1IDU3LDMyIEM1NywyNC4yNjgwMTM1IDUwLjczMTk4NjUsMTggNDMsMTggWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==" alt="WebdriverIO" class="themedComponent_wx_6 themedComponent--dark_CdPN" />
</div>"
`;

Expand Down
31 changes: 31 additions & 0 deletions playgrounds/mocha/test/specs/options.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { $ } from '@wdio/globals'
import { setOptions, getConfig } from 'expect-webdriverio'

describe('Global Options', () => {
const defaultWait = getConfig().wait

before(() => {
setOptions({ wait: 1 })
})

it('should set global wait option', () => {
expect(getConfig().wait).toBe(1)
expect(getConfig().wait).not.toBe(defaultWait)
expect(defaultWait).toBe(10000)
})

it('should allow setting and using global wait option', async () => {
const start = Date.now()

// Should fail immediately (wait: 1ms)
await expect(expect($('non-existent-element-' + Date.now())).toBeDisplayed()).rejects.toThrow()
const duration = Date.now() - start

// Ensure failure was fast (< 500ms) compared to default timeout
expect(duration).toBeLessThan(500)
})

after(() => {
setOptions({ wait: defaultWait })
})
})
13 changes: 13 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,16 @@ export const DEFAULT_OPTIONS: Required<ExpectWebdriverIO.DefaultOptions> = {
beforeAssertion: async () => {},
afterAssertion: async () => {},
}

export const DEFAULT_OPTIONS_TO_BE_DISPLAYED: Required<Omit<ExpectWebdriverIO.ToBeDisplayedOptions, 'message'>> = {
...DEFAULT_OPTIONS,
withinViewport: false,
contentVisibilityAuto: true,
opacityProperty: true,
visibilityProperty: true
}

export const defaultOptionsList = [
DEFAULT_OPTIONS,
DEFAULT_OPTIONS_TO_BE_DISPLAYED
]
19 changes: 13 additions & 6 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { expect as expectLib } from 'expect'
import type { WdioMatchersObject } from './types.js'
import * as wdioMatchers from './matchers.js'
import { DEFAULT_OPTIONS } from './constants.js'
import { DEFAULT_OPTIONS, defaultOptionsList } from './constants.js'
import createSoftExpect from './softExpect.js'
import { SoftAssertService } from './softAssert.js'

Expand Down Expand Up @@ -51,15 +51,22 @@ Object.defineProperty(expectWithSoft, 'clearSoftFailures', {

export const expect = expectWithSoft

// TODO one day to rename to something more aligned with setDefaultOptions
export const getConfig = (): ExpectWebdriverIO.DefaultOptions => DEFAULT_OPTIONS
export const setDefaultOptions = (options = {}): void => {
export const setDefaultOptions = (options: Partial<ExpectWebdriverIO.DefaultOptions>): void => {
Object.entries(options).forEach(([key, value]) => {
if (key in DEFAULT_OPTIONS) {
// @ts-ignore
DEFAULT_OPTIONS[key] = value
}
defaultOptionsList.forEach((option) => {
if (key in option) {
// @ts-ignore
option[key] = value
}
})
})
}

/**
* @deprecated use setDefaultOptions instead
*/
export const setOptions = setDefaultOptions

/**
Expand Down
14 changes: 3 additions & 11 deletions src/matchers/element/toBeDisplayed.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
import { executeCommandBe } from '../../utils.js'
import { DEFAULT_OPTIONS } from '../../constants.js'
import type { WdioElementMaybePromise } from '../../types.js'

const DEFAULT_OPTIONS_DISPLAYED: ExpectWebdriverIO.ToBeDisplayedOptions = {
...DEFAULT_OPTIONS,
withinViewport: false,
contentVisibilityAuto: true,
opacityProperty: true,
visibilityProperty: true
}
import { DEFAULT_OPTIONS_TO_BE_DISPLAYED } from '../../constants.js'

export async function toBeDisplayed(
received: WdioElementMaybePromise,
options: ExpectWebdriverIO.ToBeDisplayedOptions = DEFAULT_OPTIONS_DISPLAYED,
options: ExpectWebdriverIO.ToBeDisplayedOptions = DEFAULT_OPTIONS_TO_BE_DISPLAYED,
) {
this.expectation = this.expectation || 'displayed'

Expand All @@ -27,7 +19,7 @@ export async function toBeDisplayed(
opacityProperty,
visibilityProperty,
...commandOptions
} = { ...DEFAULT_OPTIONS_DISPLAYED, ...options }
} = { ...DEFAULT_OPTIONS_TO_BE_DISPLAYED, ...options }

const result = await executeCommandBe.call(this, received, el => el?.isDisplayed({
withinViewport,
Expand Down
43 changes: 42 additions & 1 deletion test/matchers/beMatchers.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { vi, test, describe, expect } from 'vitest'
import { vi, test, describe, expect, afterEach, beforeEach } from 'vitest'
import { $ } from '@wdio/globals'
import { matcherLastWordName } from '../__fixtures__/utils.js'
import * as Matchers from '../../src/matchers.js'
import { setOptions } from '../../src/index.js'
import { DEFAULT_OPTIONS } from '../../src/constants.js'
import { executeCommandBe } from '../../src/utils.js'

vi.mock('@wdio/globals')

Expand All @@ -17,6 +20,15 @@ const beMatchers = {
'toBeSelected': 'isSelected',
} satisfies Partial<Record<keyof typeof Matchers, keyof WebdriverIO.Element>>

vi.mock('../../src/utils.js', async (importOriginal) => {
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
const actual = await importOriginal<typeof import('../../src/utils.js')>()
return {
...actual,
executeCommandBe: vi.fn(actual.executeCommandBe)
}
})

describe('be* matchers', () => {
describe('Ensure all toBe matchers are covered', () => {

Expand Down Expand Up @@ -135,6 +147,35 @@ Expected: "${matcherLastWordName(matcherName)}"
Received: "not ${matcherLastWordName(matcherName)}"`
)
})

describe('global options', () => {
const defaultOptions = { ...DEFAULT_OPTIONS }

beforeEach(() => {
// Set global options to custom values before each test
setOptions({ wait: 99, interval: 101 })
})

afterEach(() => {
// Reset options after each test to avoid side effects
setOptions(defaultOptions)
expect(DEFAULT_OPTIONS.wait).not.toBe(99)
})

test('should use globally set default options', async () => {
const el = await $('sel')
el.isDisplayed = vi.fn().mockResolvedValue(true)

await matcherFn.call({}, el)

expect(DEFAULT_OPTIONS.wait).toBe(99)
expect(executeCommandBe).toHaveBeenCalledWith(
el,
expect.anything(),
expect.objectContaining({ wait: 99, interval: 101 })
)
})
})
})
})
})
52 changes: 50 additions & 2 deletions test/matchers/element/toBeDisplayed.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { vi, test, describe, expect } from 'vitest'
import { vi, test, describe, expect, afterEach, beforeEach } from 'vitest'
import { $ } from '@wdio/globals'

import { toBeDisplayed } from '../../../src/matchers/element/toBeDisplayed.js'
import { executeCommandBe } from '../../../src/utils.js'
import { DEFAULT_OPTIONS } from '../../../src/constants.js'
import { setDefaultOptions } from '../../../src/index.js'
import type { ChainablePromiseElement } from 'webdriverio'

vi.mock('@wdio/globals')
vi.mock('../../../src/utils.js', async (importOriginal) => {
Expand All @@ -15,7 +17,7 @@ vi.mock('../../../src/utils.js', async (importOriginal) => {
}
})

describe('toBeDisplayed', () => {
describe(toBeDisplayed, () => {
/**
* result is inverted for toBeDisplayed because it inverts isEnabled result
* `!await el.isEnabled()`
Expand Down Expand Up @@ -189,4 +191,50 @@ Expected: "displayed"
Received: "not displayed"`
)
})

describe('global options', () => {
const defaultOptions = { ...DEFAULT_OPTIONS }

let el: ChainablePromiseElement

beforeEach(async () => {
setDefaultOptions({ wait: 99, interval: 101 })
el = await $('sel')
el.isDisplayed = vi.fn().mockResolvedValue(true)

})

afterEach(() => {
setDefaultOptions(defaultOptions)
})

test('should use globally set default options with executeCommandBe', async () => {
await toBeDisplayed.call({}, el)

expect(executeCommandBe).toHaveBeenCalledWith(
el,
expect.anything(),
expect.objectContaining({ wait: 99, interval: 101 })
)
})

test('should use globally set default options with isDisplayed', async () => {

await toBeDisplayed.call({}, el)

expect(executeCommandBe).toHaveBeenCalledWith(
el,
expect.anything(),
expect.objectContaining({ wait: 99, interval: 101 })
)
expect(el.isDisplayed).toHaveBeenCalledWith(
{
withinViewport: false,
contentVisibilityAuto: true,
opacityProperty: true,
visibilityProperty: true
}
)
})
})
})
Loading