Skip to content

Commit 9514af4

Browse files
subhajit20garg3133
andauthored
Added missing isVisible command in new Element API (#4039)
Co-authored-by: Priyansh Garg <[email protected]>
1 parent 4ac5131 commit 9514af4

File tree

5 files changed

+189
-1
lines changed

5 files changed

+189
-1
lines changed
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Determines if an element is visible.
3+
*
4+
* For more info on working with DOM elements in Nightwatch, refer to the <a href="https://nightwatchjs.org/guide/writing-tests/finding-interacting-with-dom-elements.html">Finding & interacting with DOM Elements</a> guide page.
5+
*
6+
* @example
7+
* describe('isVisible demo', function() {
8+
* it('test isVisible', function(browser) {
9+
* browser.element('#search').isVisible().assert.equals(true);
10+
* });
11+
*
12+
* it('test async isVisible', async function(browser) {
13+
* const result = await browser.element('#search').isVisible();
14+
* browser.assert.equal(result, true);
15+
* });
16+
* });
17+
*
18+
* @since 3.5.0
19+
* @method isVisible
20+
* @memberof ScopedWebElement
21+
* @instance
22+
* @syntax browser.element(selector).isVisible()
23+
* @see https://www.w3.org/TR/webdriver/#element-displayedness
24+
* @returns {ScopedValue<boolean>}
25+
* @alias isDisplayed
26+
*/
27+
module.exports.command = function() {
28+
return this.runQueuedCommandScoped('isElementDisplayed');
29+
};

test/lib/mockserver.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,13 @@ class MockServer {
6161
res.writeHead(Number(item.statusCode), headers);
6262

6363
if (item.onRequest) {
64-
item.onRequest(item);
64+
let requestData = '';
65+
try {
66+
requestData = JSON.parse(postdata);
67+
// eslint-disable-next-line no-empty
68+
} catch (e) {}
69+
70+
item.onRequest(item, requestData);
6571
}
6672

6773
if (item.onResponse) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
const assert = require('assert');
2+
const {WebElement} = require('selenium-webdriver');
3+
const MockServer = require('../../../../lib/mockserver.js');
4+
const CommandGlobals = require('../../../../lib/globals/commands-w3c.js');
5+
const common = require('../../../../common.js');
6+
const Element = common.require('element/index.js');
7+
8+
describe('element().isVisible() command', function() {
9+
before(function (done) {
10+
CommandGlobals.beforeEach.call(this, done);
11+
});
12+
13+
after(function (done) {
14+
CommandGlobals.afterEach.call(this, done);
15+
});
16+
17+
it('test .element().isVisible() displayed', async function() {
18+
let elementId;
19+
20+
MockServer.addMock({
21+
url: '/session/13521-10219-202/execute/sync',
22+
method: 'POST',
23+
response: JSON.stringify({
24+
value: true
25+
}),
26+
onRequest(_, requestData) {
27+
elementId = requestData.args[0]['element-6066-11e4-a52e-4f735466cecf'];
28+
}
29+
}, true);
30+
31+
const resultPromise = this.client.api.element('#signupSection').isVisible();
32+
assert.strictEqual(resultPromise instanceof Element, false);
33+
assert.strictEqual(typeof resultPromise.find, 'undefined');
34+
35+
assert.strictEqual(resultPromise instanceof Promise, false);
36+
assert.strictEqual(typeof resultPromise.then, 'function');
37+
38+
const result = await resultPromise;
39+
assert.strictEqual(result instanceof WebElement, false);
40+
assert.strictEqual(result, true);
41+
assert.strictEqual(elementId, '0');
42+
});
43+
44+
it('test .element().isVisible() not displayed', async function() {
45+
let elementId;
46+
47+
MockServer.addMock({
48+
url: '/session/13521-10219-202/execute/sync',
49+
method: 'POST',
50+
response: JSON.stringify({
51+
value: false
52+
}),
53+
onRequest(_, requestData) {
54+
elementId = requestData.args[0]['element-6066-11e4-a52e-4f735466cecf'];
55+
}
56+
}, true);
57+
58+
const resultPromise = this.client.api.element('#signupSection').isVisible();
59+
assert.strictEqual(resultPromise instanceof Element, false);
60+
assert.strictEqual(typeof resultPromise.find, 'undefined');
61+
62+
assert.strictEqual(resultPromise instanceof Promise, false);
63+
assert.strictEqual(typeof resultPromise.then, 'function');
64+
65+
const result = await resultPromise;
66+
assert.strictEqual(result instanceof WebElement, false);
67+
assert.strictEqual(result, false);
68+
assert.strictEqual(elementId, '0');
69+
});
70+
71+
it('test .element().find().isVisible()', async function() {
72+
let elementId;
73+
74+
MockServer.addMock({
75+
url: '/session/13521-10219-202/execute/sync',
76+
method: 'POST',
77+
response: JSON.stringify({
78+
value: true
79+
}),
80+
onRequest(_, requestData) {
81+
elementId = requestData.args[0]['element-6066-11e4-a52e-4f735466cecf'];
82+
}
83+
}, true);
84+
85+
const resultPromise = this.client.api.element('#signupSection').find('#helpBtn').isVisible();
86+
assert.strictEqual(resultPromise instanceof Element, false);
87+
assert.strictEqual(typeof resultPromise.find, 'undefined');
88+
89+
assert.strictEqual(resultPromise instanceof Promise, false);
90+
assert.strictEqual(typeof resultPromise.then, 'function');
91+
92+
const result = await resultPromise;
93+
assert.strictEqual(result instanceof WebElement, false);
94+
assert.strictEqual(result, true);
95+
assert.strictEqual(elementId, '1');
96+
});
97+
98+
it('test .element.find().isVisible() not displayed', async function() {
99+
let elementId;
100+
101+
MockServer.addMock({
102+
url: '/session/13521-10219-202/execute/sync',
103+
method: 'POST',
104+
response: JSON.stringify({
105+
value: false
106+
}),
107+
onRequest(_, requestData) {
108+
elementId = requestData.args[0]['element-6066-11e4-a52e-4f735466cecf'];
109+
}
110+
}, true);
111+
112+
const resultPromise = this.client.api.element.find('#signupSection').isVisible();
113+
assert.strictEqual(resultPromise instanceof Element, false);
114+
assert.strictEqual(typeof resultPromise.find, 'undefined');
115+
116+
assert.strictEqual(resultPromise instanceof Promise, false);
117+
assert.strictEqual(typeof resultPromise.then, 'function');
118+
119+
const result = await resultPromise;
120+
assert.strictEqual(result instanceof WebElement, false);
121+
assert.strictEqual(result, false);
122+
assert.strictEqual(elementId, '0');
123+
});
124+
125+
it('test .element().isVisible() assert', async function() {
126+
let elementId;
127+
128+
MockServer.addMock({
129+
url: '/session/13521-10219-202/execute/sync',
130+
method: 'POST',
131+
response: JSON.stringify({
132+
value: true
133+
}),
134+
onRequest(_, requestData) {
135+
elementId = requestData.args[0]['element-6066-11e4-a52e-4f735466cecf'];
136+
}
137+
}, true);
138+
139+
const resultPromise = this.client.api.element('#signupSection').isVisible();
140+
assert.strictEqual(resultPromise instanceof Element, false);
141+
assert.strictEqual(typeof resultPromise.find, 'undefined');
142+
143+
assert.strictEqual(resultPromise instanceof Promise, false);
144+
assert.strictEqual(typeof resultPromise.then, 'function');
145+
146+
assert.strictEqual(await resultPromise.assert.equals(true), true);
147+
assert.strictEqual(await resultPromise.assert.not.equals(false), true);
148+
assert.strictEqual(elementId, '0');
149+
});
150+
});

types/tests/webElement.test-d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ describe('new element() api', function () {
141141
expectType<ElementValue<string | null>>(elem.getAttribute('attrib-name'));
142142
expectType<ElementValue<string | null>>(elem.getValue());
143143
expectType<ElementValue<boolean>>(elem.isEnabled());
144+
expectType<ElementValue<boolean>>(elem.isVisible());
144145

145146
expectType<ElementValue<ScopedElementRect>>(elem.getRect());
146147
expectType<ElementValue<ScopedElementRect>>(elem.getSize());

types/web-element.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ export interface ScopedElement extends Element, PromiseLike<WebElement> {
192192
waitUntil(signalOrOptions: WaitUntilActions | WaitUntilOptions, waitOptions?: WaitUntilOptions): Promise<WebElement>;
193193

194194
isEnabled(): ElementValue<boolean>;
195+
196+
isVisible(): ElementValue<boolean>;
195197
}
196198

197199
type WaitUntilOptions = {

0 commit comments

Comments
 (0)