Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
seleniumhq
GitHub Repository: seleniumhq/selenium
Path: blob/trunk/javascript/selenium-webdriver/test/bidi/input_test.js
2885 views
1
// Licensed to the Software Freedom Conservancy (SFC) under one
2
// or more contributor license agreements. See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership. The SFC licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License. You may obtain a copy of the License at
8
//
9
// http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied. See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
'use strict'
19
20
const assert = require('node:assert')
21
const fileServer = require('../../lib/test/fileserver')
22
const { ignore, Pages, suite } = require('../../lib/test')
23
const { Key, Origin } = require('selenium-webdriver/lib/input')
24
const { Browser, By, until } = require('selenium-webdriver')
25
const Input = require('selenium-webdriver/bidi/input')
26
27
suite(
28
function (env) {
29
describe('BiDi Input', function () {
30
let driver
31
32
beforeEach(async function () {
33
driver = await env.builder().build()
34
})
35
36
afterEach(function () {
37
return driver.quit()
38
})
39
40
it('can click element', async function () {
41
const browsingContextId = await driver.getWindowHandle()
42
const input = await Input(driver)
43
await driver.get(fileServer.whereIs('/data/actions/click.html'))
44
45
let box = await driver.findElement(By.id('box'))
46
assert.strictEqual(await box.getAttribute('class'), '')
47
48
const actions = await driver.actions().click(box).getSequences()
49
50
await input.perform(browsingContextId, actions)
51
52
await driver.wait(async () => {
53
assert.strictEqual(await box.getAttribute('class'), 'green')
54
return true
55
}, 10000)
56
})
57
58
it('can click in center of element', async function () {
59
const browsingContextId = await driver.getWindowHandle()
60
const input = await Input(driver)
61
await driver.get(fileServer.whereIs('/data/actions/record_click.html'))
62
63
const div = await driver.findElement(By.css('div'))
64
const rect = await div.getRect()
65
assert.deepStrictEqual(rect, { width: 500, height: 500, x: 0, y: 0 })
66
67
const actions = await driver.actions().click(div).getSequences()
68
69
await input.perform(browsingContextId, actions)
70
71
await driver.wait(
72
async () => {
73
const clicks = await driver.executeScript('return clicks')
74
return clicks.length > 0
75
},
76
10000,
77
'No clicks returned',
78
)
79
const clicks = await driver.executeScript('return clicks')
80
assert.deepStrictEqual(clicks, [[250, 250]])
81
})
82
83
it('can move relative to element center', async function () {
84
const browsingContextId = await driver.getWindowHandle()
85
const input = await Input(driver)
86
await driver.get(fileServer.whereIs('/data/actions/record_click.html'))
87
88
const div = await driver.findElement(By.css('div'))
89
const rect = await div.getRect()
90
assert.deepStrictEqual(rect, { width: 500, height: 500, x: 0, y: 0 })
91
92
const actions = await driver.actions().move({ x: 10, y: 10, origin: div }).click().getSequences()
93
94
await input.perform(browsingContextId, actions)
95
96
await driver.wait(
97
async () => {
98
const clicks = await driver.executeScript('return clicks')
99
return clicks.length > 0
100
},
101
10000,
102
'No clicks returned',
103
)
104
const clicks = await driver.executeScript('return clicks')
105
assert.deepStrictEqual(clicks, [[260, 260]])
106
})
107
108
ignore(env.browsers(Browser.SAFARI)).it('doubleClick(element)', async function () {
109
const browsingContextId = await driver.getWindowHandle()
110
const input = await Input(driver)
111
await driver.get(fileServer.whereIs('/data/actions/click.html'))
112
113
let box = await driver.findElement(By.id('box'))
114
assert.strictEqual(await box.getAttribute('class'), '')
115
116
const actions = await driver.actions().doubleClick(box).getSequences()
117
118
await input.perform(browsingContextId, actions)
119
120
await driver.wait(async () => (await box.getAttribute('class')) === 'blue', 10000)
121
assert.strictEqual(await box.getAttribute('class'), 'blue')
122
})
123
124
it('dragAndDrop()', async function () {
125
const browsingContextId = await driver.getWindowHandle()
126
const input = await Input(driver)
127
await driver.get(fileServer.whereIs('/data/actions/drag.html'))
128
129
let slide = await driver.findElement(By.id('slide'))
130
assert.strictEqual(await slide.getCssValue('left'), '0px')
131
assert.strictEqual(await slide.getCssValue('top'), '0px')
132
133
let br = await driver.findElement(By.id('BR'))
134
let actions = await driver.actions().dragAndDrop(slide, br).getSequences()
135
await input.perform(browsingContextId, actions)
136
assert.strictEqual(await slide.getCssValue('left'), '206px')
137
assert.strictEqual(await slide.getCssValue('top'), '206px')
138
139
let tr = await driver.findElement(By.id('TR'))
140
actions = await driver.actions().dragAndDrop(slide, tr).getSequences()
141
await input.perform(browsingContextId, actions)
142
assert.strictEqual(await slide.getCssValue('left'), '206px')
143
assert.strictEqual(await slide.getCssValue('top'), '1px')
144
})
145
146
it('move()', async function () {
147
const browsingContextId = await driver.getWindowHandle()
148
const input = await Input(driver)
149
await driver.get(fileServer.whereIs('/data/actions/drag.html'))
150
151
let slide = await driver.findElement(By.id('slide'))
152
assert.strictEqual(await slide.getCssValue('left'), '0px')
153
assert.strictEqual(await slide.getCssValue('top'), '0px')
154
155
const actions = await driver
156
.actions()
157
.move({ origin: slide })
158
.press()
159
.move({ x: 100, y: 100, origin: Origin.POINTER })
160
.release()
161
.getSequences()
162
163
input.perform(browsingContextId, actions)
164
165
await driver.wait(async () => (await slide.getCssValue('left')) === '101px', 10000)
166
assert.strictEqual(await slide.getCssValue('left'), '101px')
167
assert.strictEqual(await slide.getCssValue('left'), '101px')
168
})
169
170
xit('can move to and click element in an iframe', async function () {
171
const browsingContextId = await driver.getWindowHandle()
172
const input = await Input(driver)
173
await driver.get(fileServer.whereIs('click_tests/click_in_iframe.html'))
174
175
await driver.wait(until.elementLocated(By.id('ifr')), 5000).then((frame) => driver.switchTo().frame(frame))
176
177
let link = await driver.findElement(By.id('link'))
178
179
const actions = await driver.actions().click(link).getSequences()
180
input.perform(browsingContextId, actions)
181
await driver.switchTo().defaultContent()
182
return driver.wait(until.titleIs('Submitted Successfully!'), 10000)
183
})
184
185
it('can send keys to focused element', async function () {
186
const browsingContextId = await driver.getWindowHandle()
187
const input = await Input(driver)
188
await driver.get(Pages.formPage)
189
190
let el = await driver.findElement(By.id('email'))
191
assert.strictEqual(await el.getAttribute('value'), '')
192
193
await driver.executeScript('arguments[0].focus()', el)
194
195
const actions = await driver.actions().sendKeys('foobar').getSequences()
196
197
input.perform(browsingContextId, actions)
198
199
await driver.wait(async () => (await el.getAttribute('value')) === 'foobar', 10000)
200
assert.strictEqual(await el.getAttribute('value'), 'foobar')
201
})
202
203
it('can get the property of element', async function () {
204
const browsingContextId = await driver.getWindowHandle()
205
const input = await Input(driver)
206
await driver.get(Pages.formPage)
207
208
let el = await driver.findElement(By.id('email'))
209
assert.strictEqual(await el.getProperty('value'), '')
210
211
await driver.executeScript('arguments[0].focus()', el)
212
213
const actions = await driver.actions().sendKeys('foobar').getSequences()
214
215
await input.perform(browsingContextId, actions)
216
await driver.wait(async () => (await el.getProperty('value')) === 'foobar', 10000)
217
assert.strictEqual(await el.getProperty('value'), 'foobar')
218
})
219
220
it('can send keys to focused element (with modifiers)', async function () {
221
const browsingContextId = await driver.getWindowHandle()
222
const input = await Input(driver)
223
await driver.get(Pages.formPage)
224
225
let el = await driver.findElement(By.id('email'))
226
assert.strictEqual(await el.getAttribute('value'), '')
227
228
await driver.executeScript('arguments[0].focus()', el)
229
230
const actions = await driver
231
.actions()
232
.sendKeys('fo')
233
.keyDown(Key.SHIFT)
234
.sendKeys('OB')
235
.keyUp(Key.SHIFT)
236
.sendKeys('ar')
237
.getSequences()
238
239
await input.perform(browsingContextId, actions)
240
241
await driver.wait(async () => (await el.getAttribute('value')) === 'foOBar', 10000)
242
assert.strictEqual(await el.getAttribute('value'), 'foOBar')
243
})
244
245
it('can interact with simple form elements', async function () {
246
const browsingContextId = await driver.getWindowHandle()
247
const input = await Input(driver)
248
await driver.get(Pages.formPage)
249
250
let el = await driver.findElement(By.id('email'))
251
assert.strictEqual(await el.getAttribute('value'), '')
252
253
const actions = await driver.actions().click(el).sendKeys('foobar').getSequences()
254
255
await input.perform(browsingContextId, actions)
256
257
await driver.wait(async () => (await el.getAttribute('value')) === 'foobar', 10000)
258
assert.strictEqual(await el.getAttribute('value'), 'foobar')
259
})
260
261
it('can send keys to designated element', async function () {
262
const browsingContextId = await driver.getWindowHandle()
263
const input = await Input(driver)
264
await driver.get(Pages.formPage)
265
266
let el = await driver.findElement(By.id('email'))
267
assert.strictEqual(await el.getAttribute('value'), '')
268
269
const actions = await driver.actions().sendKeys(el, 'foobar').getSequences()
270
271
await input.perform(browsingContextId, actions)
272
273
await driver.wait(async () => (await el.getAttribute('value')) === 'foobar', 10000)
274
assert.strictEqual(await el.getAttribute('value'), 'foobar')
275
})
276
277
it('can scroll with the wheel input', async function () {
278
const browsingContextId = await driver.getWindowHandle()
279
const input = await Input(driver)
280
await driver.get(Pages.scrollingPage)
281
let scrollable = await driver.findElement(By.id('scrollable'))
282
283
const actions = await driver.actions().scroll(0, 0, 5, 10, scrollable).getSequences()
284
input.perform(browsingContextId, actions)
285
let events = await _getEvents(driver)
286
assert.strictEqual(events[0].type, 'wheel')
287
assert.ok(events[0].deltaX >= 5)
288
assert.ok(events[0].deltaY >= 10)
289
assert.strictEqual(events[0].deltaZ, 0)
290
assert.strictEqual(events[0].target, 'scrollContent')
291
})
292
293
it('can execute release in browsing context', async function () {
294
const browsingContextId = await driver.getWindowHandle()
295
const input = await Input(driver)
296
await driver.get(Pages.releaseAction)
297
298
let inputTextBox = await driver.findElement(By.id('keys'))
299
300
await driver.executeScript('arguments[0].focus()', inputTextBox)
301
302
const actions = await driver.actions().keyDown('a').keyDown('b').getSequences()
303
304
await input.perform(browsingContextId, actions)
305
306
await driver.executeScript('resetEvents()')
307
308
await input.release(browsingContextId)
309
310
const events = await driver.executeScript('return allEvents.events')
311
312
assert.strictEqual(events[0].code, 'KeyB')
313
assert.strictEqual(events[1].code, 'KeyA')
314
})
315
316
async function _getEvents(driver) {
317
await driver.wait(async () => {
318
const events = await driver.executeScript('return allEvents.events;')
319
return events.length > 0
320
}, 5000)
321
return (await driver.executeScript('return allEvents.events;')) || []
322
}
323
})
324
},
325
{ browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] },
326
)
327
328