-
Notifications
You must be signed in to change notification settings - Fork 8.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FTR: fix WebDriver Actions calls #44605
Changes from all commits
a54cae1
c71d606
ee7361e
1ebef6c
63d6d23
2d1268e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -160,7 +160,7 @@ export default function ({ getService, getPageObjects }) { | |
|
||
const newDurationHours = await PageObjects.timePicker.getTimeDurationInHours(); | ||
expect(Math.round(newDurationHours)).to.be(3); | ||
const rowData = await PageObjects.discover.getDocTableIndex(1); | ||
const rowData = await PageObjects.discover.getDocTableField(1); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In case of failure, we were getting a long string with all fields. To simplify analysis |
||
expect(rowData).to.have.string('Sep 20, 2015 @ 02:56:02.323'); | ||
}); | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -155,49 +155,26 @@ export async function BrowserProvider({ getService }: FtrProviderContext) { | |
} | ||
|
||
/** | ||
* Moves the remote environment’s mouse cursor to the specified element or relative | ||
* position. | ||
* Moves the remote environment’s mouse cursor to the specified point {x, y} which is | ||
* offset to browser page top left corner. | ||
* https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#move | ||
* | ||
* @param {WebElementWrapper} element Optional | ||
* @param {number} xOffset Optional | ||
* @param {number} yOffset Optional | ||
* @param {x: number, y: number} point on browser page | ||
* @return {Promise<void>} | ||
*/ | ||
public async moveMouseTo(element: any, xOffset: number, yOffset: number): Promise<void>; | ||
public async moveMouseTo(element: WebElementWrapper): Promise<void>; | ||
public async moveMouseTo( | ||
element: WebElementWrapper, | ||
xOffset?: number, | ||
yOffset?: number | ||
): Promise<void> { | ||
public async moveMouseTo(point: { x: number; y: number }): Promise<void> { | ||
if (this.isW3CEnabled) { | ||
// Workaround for scrolling bug in W3C mode: move pointer to { x: 0, y: 0 } | ||
// https://github.com/mozilla/geckodriver/issues/776 | ||
await this.getActions() | ||
.move({ x: 0, y: 0 }) | ||
.perform(); | ||
if (element instanceof WebElementWrapper) { | ||
await this.getActions() | ||
.move({ x: xOffset || 10, y: yOffset || 10, origin: element._webElement }) | ||
.perform(); | ||
} else { | ||
await this.getActions() | ||
.move({ origin: { x: xOffset, y: yOffset } }) | ||
.perform(); | ||
} | ||
await this.getActions() | ||
.move({ x: point.x, y: point.y, origin: 'pointer' }) | ||
.perform(); | ||
} else { | ||
if (element instanceof WebElementWrapper) { | ||
await this.getActions() | ||
.pause(this.getActions().mouse) | ||
.move({ origin: element._webElement }) | ||
.perform(); | ||
} else { | ||
await this.getActions() | ||
.pause(this.getActions().mouse) | ||
.move({ origin: { x: xOffset, y: yOffset } }) | ||
.perform(); | ||
} | ||
await this.getActions() | ||
.pause(this.getActions().mouse) | ||
.move({ x: point.x, y: point.y, origin: 'pointer' }) | ||
.perform(); | ||
} | ||
} | ||
|
||
|
@@ -213,70 +190,47 @@ export async function BrowserProvider({ getService }: FtrProviderContext) { | |
from: { offset: { x: any; y: any }; location: any }, | ||
to: { offset: { x: any; y: any }; location: any } | ||
) { | ||
// tslint:disable-next-line:variable-name | ||
let _from; | ||
// tslint:disable-next-line:variable-name | ||
let _to; | ||
// tslint:disable-next-line:variable-name | ||
const _fromOffset = from.offset | ||
? { x: from.offset.x || 0, y: from.offset.y || 0 } | ||
: { x: 0, y: 0 }; | ||
// tslint:disable-next-line:variable-name | ||
const _toOffset = to.offset ? { x: to.offset.x || 0, y: to.offset.y || 0 } : { x: 0, y: 0 }; | ||
// tslint:disable-next-line:variable-name | ||
const _convertPointW3C = async (point: any, offset: { x: any; y: any }) => { | ||
if (point.location instanceof WebElementWrapper) { | ||
const position = await point.location.getPosition(); | ||
return { | ||
x: Math.round(position.x + offset.x), | ||
y: Math.round(position.y + offset.y), | ||
}; | ||
} else { | ||
return { | ||
x: Math.round(point.location.x + offset.x), | ||
y: Math.round(point.location.y + offset.y), | ||
}; | ||
} | ||
}; | ||
// tslint:disable-next-line:variable-name | ||
const _convertPoint = (point: any) => { | ||
return point.location instanceof WebElementWrapper | ||
? point.location._webElement | ||
: point.location; | ||
}; | ||
|
||
if (this.isW3CEnabled) { | ||
// tslint:disable-next-line:variable-name | ||
_from = await _convertPointW3C(from, _fromOffset); | ||
// tslint:disable-next-line:variable-name | ||
_to = await _convertPointW3C(to, _toOffset); | ||
// tslint:disable-next-line:variable-name | ||
const _offset = { x: _to.x - _from.x, y: _to.y - _from.y }; | ||
// The offset should be specified in pixels relative to the center of the element's bounding box | ||
const getW3CPoint = (data: any) => { | ||
if (!data.offset) { | ||
data.offset = {}; | ||
} | ||
return data.location instanceof WebElementWrapper | ||
? { x: data.offset.x || 0, y: data.offset.y || 0, origin: data.location._webElement } | ||
: { x: data.location.x, y: data.location.y, origin: 'pointer' }; | ||
}; | ||
|
||
const startPoint = getW3CPoint(from); | ||
const endPoint = getW3CPoint(to); | ||
await this.getActions() | ||
.move({ x: 0, y: 0 }) | ||
.perform(); | ||
return await this.getActions() | ||
.move({ x: _from.x, y: _from.y, origin: 'pointer' }) | ||
.move(startPoint) | ||
.press() | ||
.move({ x: _offset.x, y: _offset.y, origin: 'pointer' }) | ||
.move(endPoint) | ||
.release() | ||
.perform(); | ||
} else { | ||
// until Chromedriver is not supporting W3C Webdriver Actions API | ||
// tslint:disable-next-line:variable-name | ||
_from = _convertPoint(from); | ||
// tslint:disable-next-line:variable-name | ||
_to = _convertPoint(to); | ||
if (from.location instanceof WebElementWrapper && typeof to.location.x === 'number') { | ||
// The offset should be specified in pixels relative to the top-left corner of the element's bounding box | ||
const getOffset: any = (offset: { x: number; y: number }) => | ||
offset ? { x: offset.x || 0, y: offset.y || 0 } : { x: 0, y: 0 }; | ||
|
||
if (from.location instanceof WebElementWrapper === false) { | ||
throw new Error('Dragging point should be WebElementWrapper instance'); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To avoid confusing while getting this error. In non-w3c start point should be provided as WebElement |
||
} else if (typeof to.location.x === 'number') { | ||
return await this.getActions() | ||
.move({ origin: _from }) | ||
.move({ origin: from.location._webElement }) | ||
.press() | ||
.move({ x: _to.x, y: _to.y, origin: 'pointer' }) | ||
.move({ x: to.location.x, y: to.location.y, origin: 'pointer' }) | ||
.release() | ||
.perform(); | ||
} else { | ||
return await new LegacyActionSequence(driver) | ||
.mouseMove(_from, _fromOffset) | ||
.mouseMove(from.location._webElement, getOffset(from.offset)) | ||
.mouseDown() | ||
.mouseMove(_to, _toOffset) | ||
.mouseMove(to.location._webElement, getOffset(to.offset)) | ||
.mouseUp() | ||
.perform(); | ||
} | ||
|
@@ -320,34 +274,29 @@ export async function BrowserProvider({ getService }: FtrProviderContext) { | |
} | ||
|
||
/** | ||
* Inserts an action for moving the mouse x and y pixels relative to the specified origin. | ||
* The origin may be defined as the mouse's current position, the viewport, or the center | ||
* of a specific WebElement. Then adds an action for left-click (down/up) with the mouse. | ||
* Moves the remote environment’s mouse cursor to the specified point {x, y} which is | ||
* offset to browser page top left corner. | ||
* Then adds an action for left-click (down/up) with the mouse. | ||
* https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#click | ||
* | ||
* @param {WebElementWrapper} element Optional | ||
* @param {number} xOffset Optional | ||
* @param {number} yOffset Optional | ||
* @param {x: number, y: number} point on browser page | ||
* @return {Promise<void>} | ||
*/ | ||
public async clickMouseButton(element: any, xOffset: number, yOffset: number): Promise<void>; | ||
public async clickMouseButton(element: WebElementWrapper): Promise<void>; | ||
public async clickMouseButton(...args: unknown[]): Promise<void> { | ||
const arg0 = args[0]; | ||
if (arg0 instanceof WebElementWrapper) { | ||
public async clickMouseButton(point: { x: number; y: number }): Promise<void> { | ||
if (this.isW3CEnabled) { | ||
await this.getActions() | ||
.pause(this.getActions().mouse) | ||
.move({ origin: arg0._webElement }) | ||
.move({ x: 0, y: 0 }) | ||
.perform(); | ||
await this.getActions() | ||
.move({ x: point.x, y: point.y, origin: 'pointer' }) | ||
.click() | ||
.perform(); | ||
} else if (isNaN(args[1] as number) || isNaN(args[2] as number) === false) { | ||
} else { | ||
await this.getActions() | ||
.pause(this.getActions().mouse) | ||
.move({ origin: { x: args[1], y: args[2] } }) | ||
.move({ x: point.x, y: point.y, origin: 'pointer' }) | ||
.click() | ||
.perform(); | ||
} else { | ||
throw new Error('Element or coordinates should be provided'); | ||
} | ||
} | ||
|
||
|
@@ -378,16 +327,10 @@ export async function BrowserProvider({ getService }: FtrProviderContext) { | |
* @param {WebElementWrapper} element | ||
* @return {Promise<void>} | ||
*/ | ||
public async doubleClick(element?: WebElementWrapper): Promise<void> { | ||
if (element instanceof WebElementWrapper) { | ||
await this.getActions() | ||
.doubleClick(element._webElement) | ||
.perform(); | ||
} else { | ||
await this.getActions() | ||
.doubleClick() | ||
.perform(); | ||
} | ||
public async doubleClick(): Promise<void> { | ||
await this.getActions() | ||
.doubleClick() | ||
.perform(); | ||
} | ||
|
||
/** | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now this test is passing in Firefox as well