Skip to content

Commit 874ef18

Browse files
mgrybykchristian-bromann
authored andcommitted
Proposal to add element equals command (webdriverio#4802)
* webdriverio: add element equals command * rename to isEqual, compare ref in mobile * remove refetch, add test * fix doc issues
1 parent ec7d822 commit 874ef18

File tree

6 files changed

+155
-0
lines changed

6 files changed

+155
-0
lines changed

packages/wdio-sync/webdriverio-core.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,13 @@ declare namespace WebdriverIO {
389389
*/
390390
isEnabled(): boolean;
391391

392+
/**
393+
* Return true if the selected DOM-element matches with the provided one.
394+
*/
395+
isEqual(
396+
el: Element
397+
): boolean;
398+
392399
/**
393400
* Returns true if element exists in the DOM
394401
*/

packages/webdriverio/src/commands/element.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const isClickable = require('./element/isClickable').default
2020
export const isDisplayed = require('./element/isDisplayed').default
2121
export const isDisplayedInViewport = require('./element/isDisplayedInViewport').default
2222
export const isEnabled = require('./element/isEnabled').default
23+
export const isEqual = require('./element/isEqual').default
2324
export const isExisting = require('./element/isExisting').default
2425
export const isFocused = require('./element/isFocused').default
2526
export const isSelected = require('./element/isSelected').default
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
*
3+
* Return true if the selected element matches with the provided one.
4+
*
5+
* <example>
6+
:isEqual.js
7+
it('should detect if an element is clickable', () => {
8+
const el = $('#el')
9+
const sameEl = $('#el')
10+
const anotherEl = $('#anotherEl')
11+
12+
el.isEqual(sameEl) // outputs: true
13+
14+
el.isEqual(anotherEl) // outputs: false
15+
});
16+
* </example>
17+
*
18+
* @alias element.isEqual
19+
* @param {Element} el element to compare with
20+
* @return {Boolean} true if elements are equal
21+
*
22+
*/
23+
24+
import { ELEMENT_KEY } from '../../constants'
25+
import { getBrowserObject } from '../../utils'
26+
27+
const getWebElement = (el) => ({
28+
[ELEMENT_KEY]: el.elementId, // w3c compatible
29+
ELEMENT: el.elementId // jsonwp compatible
30+
})
31+
32+
export default async function isEqual (el) {
33+
const browser = getBrowserObject(this)
34+
35+
// mobile native
36+
if (browser.isMobile) {
37+
const context = await browser.getContext()
38+
if (context.toLowerCase().includes('native')) {
39+
return this.elementId === el.elementId
40+
}
41+
}
42+
43+
// browser or webview
44+
let result
45+
try {
46+
result = await browser.execute(
47+
/* istanbul ignore next */
48+
(el1, el2) => el1 === el2,
49+
getWebElement(this), getWebElement(el))
50+
} catch (err) {
51+
result = false
52+
}
53+
54+
return result
55+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import request from 'request'
2+
import { remote } from '../../../src'
3+
4+
describe('isEqual test', () => {
5+
let browser
6+
let elem
7+
8+
describe('web', () => {
9+
beforeAll(async () => {
10+
browser = await remote({
11+
baseUrl: 'http://foobar.com',
12+
capabilities: {
13+
browserName: 'foobar'
14+
}
15+
})
16+
elem = await browser.$('#foo')
17+
request.mockClear()
18+
})
19+
20+
it('should return true if elements are equal', async () => {
21+
expect(await elem.isEqual(elem)).toBe(true)
22+
})
23+
24+
it('should return false if elements are NOT equal', async () => {
25+
const elements = await browser.$$('#bar')
26+
expect(await elem.isEqual(elements[1])).toBe(false)
27+
})
28+
29+
it('should return false if execute command fails', async () => {
30+
const execute = browser.execute
31+
delete browser.execute
32+
expect(await elem.isEqual(elem)).toBe(false)
33+
browser.execute = execute
34+
})
35+
})
36+
37+
describe('mobile', () => {
38+
beforeAll(async () => {
39+
browser = await remote({
40+
baseUrl: 'http://foobar.com',
41+
capabilities: {
42+
mobileMode: true,
43+
browserName: 'foobar'
44+
}
45+
})
46+
elem = await browser.$('#foo')
47+
request.mockClear()
48+
})
49+
50+
it('should return true if elements are equal', async () => {
51+
request.setMockResponse(['NATIVE_APP'])
52+
expect(await elem.isEqual(elem)).toBe(true)
53+
})
54+
55+
it('should return false if elements are NOT equal', async () => {
56+
const elements = await browser.$$('#bar')
57+
request.setMockResponse(['NATIVE_APP'])
58+
expect(await elem.isEqual(elements[1])).toBe(false)
59+
})
60+
61+
it('should call execute if in webview', async () => {
62+
request.setMockResponse(['WEBVIEW'])
63+
const execute = browser.execute
64+
delete browser.execute
65+
browser.execute = jest.fn().mockReturnValue(true)
66+
67+
expect(await elem.isEqual(elem)).toBe(true)
68+
expect(browser.execute).toBeCalled()
69+
70+
delete browser.execute
71+
browser.execute = execute
72+
})
73+
})
74+
75+
afterEach(() => {
76+
request.mockClear()
77+
})
78+
})

packages/webdriverio/webdriverio-core-v5.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,13 @@ declare namespace WebdriverIO {
389389
*/
390390
isEnabled(): boolean;
391391

392+
/**
393+
* Return true if the selected DOM-element matches with the provided one.
394+
*/
395+
isEqual(
396+
el: Element
397+
): boolean;
398+
392399
/**
393400
* Returns true if element exists in the DOM
394401
*/

packages/webdriverio/webdriverio-core.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,13 @@ declare namespace WebdriverIO {
389389
*/
390390
isEnabled(): Promise<boolean>;
391391

392+
/**
393+
* Return true if the selected DOM-element matches with the provided one.
394+
*/
395+
isEqual(
396+
el: Element
397+
): Promise<boolean>;
398+
392399
/**
393400
* Returns true if element exists in the DOM
394401
*/

0 commit comments

Comments
 (0)