Skip to content

Commit 6ed5892

Browse files
authored
Merge pull request #455 from angrykoala/dev
2.12.0
2 parents 4d14df7 + cdb2e20 commit 6ed5892

File tree

11 files changed

+100
-31
lines changed

11 files changed

+100
-31
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ jobs:
1616
- run: npm install
1717
- name: test
1818
run: |
19+
sudo apt-get update
20+
sudo apt-get install -y libgbm-dev
1921
npm run lint
2022
npm test || npm test
2123
env:

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
2.12.0 / 2020-04-26
2+
===================
3+
4+
* Puppeteer updated to v3
5+
* DragAndDrop method
6+
* Minor fix in types
7+
* Dependencies updated
8+
19
2.11.3 / 2020-03-07
210
===================
311

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,15 @@ Unfocus the first element matching the given selector.
504504
**hover(selector)**
505505
Hovers over the first element matching the given selector.
506506

507+
**dragAndDrop(source, target)**
508+
Drags the `source` selector and drops it on `target`.
509+
510+
```js
511+
await browser.dragAndDrop("#my-draggable", "#target");
512+
```
513+
514+
> Note that this method emulates expected events of this behavior instead of emulating mouse interaction
515+
507516
**scroll(value, xValue?)**
508517
Vertically scrolls the page to the given value on pixels, an optional xValue can be passed for horizontal scrolling. If value is a selector or DomElement, the page will scroll until that element is at view.
509518

@@ -2049,7 +2058,10 @@ jobs:
20492058
node-version: 12
20502059
- run: npm install
20512060
- name: test
2052-
run: npm test || npm test
2061+
run: |
2062+
sudo apt-get update
2063+
sudo apt-get install -y libgbm-dev
2064+
npm test || npm test
20532065
env:
20542066
CI: true
20552067
```

globals.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
declare namespace WendigoUtils {
2-
function isVisible(element: HTMLElement): boolean;
3-
function queryElement(selector: string | HTMLElement): HTMLElement;
2+
function isVisible(element: HTMLElement | null): boolean;
3+
function queryElement(selector: string | HTMLElement): HTMLElement | null;
44
function queryAll(selector: string | HTMLElement): Array<HTMLElement>;
55
function xPathQuery(xPath: string): Array<HTMLElement>;
66
function getStyles(element: string | HTMLElement): { [s: string]: string };

injection_scripts/wendigo_utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default function WendigoUtilsLoader(): void {
66
const _origDate = Date;
77

88
(window as any).WendigoUtils = {
9-
isVisible(element: Element | Document): boolean {
9+
isVisible(element: Element | Document | null): boolean {
1010
if (!element) return false;
1111
if (element === document) return true; // Top element, always visible
1212
else {
@@ -77,7 +77,7 @@ export default function WendigoUtilsLoader(): void {
7777
},
7878
findXPath(node: Element | Document): string {
7979
return WendigoPathFinder.xPath(node);
80-
}
80+
},
8181
};
8282
}
8383
}

lib/browser/mixins/browser_actions.ts

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ export default abstract class BrowserActions extends BrowserQueries {
142142
window.scroll(xval, val);
143143
} else {
144144
const element = WendigoUtils.queryElement(val);
145+
if(!element) throw new Error()
145146
element.scrollIntoView();
146147
}
147148
}, value, xvalue);
@@ -167,6 +168,7 @@ export default abstract class BrowserActions extends BrowserQueries {
167168
try {
168169
const result = await this.evaluate((q) => {
169170
const element = WendigoUtils.queryElement(q);
171+
if(!element) throw new Error()
170172
element.blur();
171173
}, selector);
172174
return result;
@@ -175,18 +177,55 @@ export default abstract class BrowserActions extends BrowserQueries {
175177
}
176178
}
177179

178-
// public async dragAndDrop(from: WendigoSelector, to: WendigoSelector): Promise<void> {
179-
// const fromElement = await this.query(from);
180-
// const toElement = await this.query(to);
181-
// if (!fromElement || !toElement) throw new QueryError("dragAndDrop", `Elements "${from} and ${to} not found."`);
182-
// const boxFrom = await fromElement.element.boundingBox();
183-
// const boxTo = await toElement.element.boundingBox();
184-
// if (!boxFrom || !boxTo) throw new FatalError("dragAndDrop", "Bounding box not found");
185-
// const mouse = this._page.mouse;
186-
// await mouse.up();
187-
// await mouse.move(boxFrom.x + (boxFrom.width / 2), boxFrom.y + (boxFrom.height / 2));
188-
// await mouse.down();
189-
// await mouse.move(boxTo.x + (boxTo.width / 2), boxTo.y + (boxTo.height / 2));
190-
// await mouse.up();
191-
// }
180+
@FailIfNotLoaded
181+
public async dragAndDrop(from: WendigoSelector, to: WendigoSelector): Promise<void> {
182+
try {
183+
await this.evaluate((q1, q2) => {
184+
// Based on https://stackoverflow.com/questions/49772472/how-to-simulate-a-drag-and-drop-action-in-puppeteer
185+
const source = WendigoUtils.queryElement(q1);
186+
const target = WendigoUtils.queryElement(q2);
187+
if (!source || !target) throw new Error()
188+
189+
let event = document.createEvent("CustomEvent") as any;
190+
191+
event.initCustomEvent("mousedown", true, true, null);
192+
event.clientX = source.getBoundingClientRect().top;
193+
event.clientY = source.getBoundingClientRect().left;
194+
source.dispatchEvent(event);
195+
196+
event = document.createEvent("CustomEvent");
197+
event.initCustomEvent("dragstart", true, true, null);
198+
event.clientX = source.getBoundingClientRect().top;
199+
event.clientY = source.getBoundingClientRect().left;
200+
source.dispatchEvent(event);
201+
202+
event = document.createEvent("CustomEvent");
203+
event.initCustomEvent("drag", true, true, null);
204+
event.clientX = source.getBoundingClientRect().top;
205+
event.clientY = source.getBoundingClientRect().left;
206+
source.dispatchEvent(event);
207+
208+
209+
event = document.createEvent("CustomEvent");
210+
event.initCustomEvent("dragover", true, true, null);
211+
event.clientX = target.getBoundingClientRect().top;
212+
event.clientY = target.getBoundingClientRect().left;
213+
target.dispatchEvent(event);
214+
215+
event = document.createEvent("CustomEvent");
216+
event.initCustomEvent("drop", true, true, null);
217+
event.clientX = target.getBoundingClientRect().top;
218+
event.clientY = target.getBoundingClientRect().left;
219+
target.dispatchEvent(event);
220+
221+
event = document.createEvent("CustomEvent");
222+
event.initCustomEvent("dragend", true, true, null);
223+
event.clientX = target.getBoundingClientRect().top;
224+
event.clientY = target.getBoundingClientRect().left;
225+
target.dispatchEvent(event);
226+
}, from, to);
227+
} catch (err) {
228+
throw new QueryError("dragAndDrop", `Element not found.`);
229+
}
230+
}
192231
}

lib/browser/mixins/browser_edit.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export default abstract class BrowserEdit extends BrowserInfo {
3030
try {
3131
await this.evaluate((q, attr, val) => {
3232
const element = WendigoUtils.queryElement(q);
33+
if(!element) throw new Error()
3334
if (val === null) element.removeAttribute(attr);
3435
else element.setAttribute(attr, val);
3536
}, selector, attribute, value);

lib/wendigo.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ export default class Wendigo {
108108
let context: BrowserContext;
109109
if (settings.incognito) {
110110
context = await instance.createIncognitoBrowserContext();
111-
} else context = await instance.defaultBrowserContext();
111+
} else context = instance.defaultBrowserContext();
112112

113113
return new PuppeteerContext(context);
114114
}

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "wendigo",
3-
"version": "2.11.3",
3+
"version": "2.12.0",
44
"description": "A proper monster for front-end automated testing",
55
"engines": {
66
"node": ">=8.0.0"
@@ -43,19 +43,19 @@
4343
"dependencies": {
4444
"compositer": "^1.3.6",
4545
"is-class": "0.0.9",
46-
"puppeteer": "~2.0.0"
46+
"puppeteer": "~3.0.1"
4747
},
4848
"devDependencies": {
4949
"@types/mocha": "^7.0.2",
50-
"@types/node": "^13.9.0",
50+
"@types/node": "^13.13.2",
5151
"@types/puppeteer": "~2.0.1",
5252
"basic-auth": "^2.0.1",
5353
"eslint": "^6.8.0",
5454
"express": "^4.17.1",
5555
"markdownlint-cli": "^0.22.0",
56-
"mocha": "^7.1.0",
57-
"sinon": "^9.0.0",
58-
"tslint": "^6.0.0",
56+
"mocha": "^7.1.1",
57+
"sinon": "^9.0.2",
58+
"tslint": "^6.1.1",
5959
"typescript": "^3.8.3"
6060
}
6161
}

tests/browser/drag.test.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
const Wendigo = require('../..');
44
const configUrls = require('../config.json').urls;
5+
const utils = require('../test_utils');
56

6-
// Tests #227
7-
describe.skip("Drag And Drop", function() {
7+
describe("Drag And Drop", function() {
88
this.timeout(5000);
99
let browser;
1010

1111
before(async() => {
12-
browser = await Wendigo.createBrowser();
12+
browser = await Wendigo.createBrowser({log: true});
1313
});
1414

1515
beforeEach(async() => {
@@ -23,7 +23,14 @@ describe.skip("Drag And Drop", function() {
2323
it("Drag And Drop Element", async() => {
2424
await browser.assert.text("#result", "NOT");
2525
await browser.dragAndDrop("#draggable-text", "#target");
26-
await browser.wait(100);
2726
await browser.assert.text("#result", "DROPPED");
2827
});
28+
29+
it("Drag And Drop Fails If Element Does Not Exists", async() => {
30+
await browser.assert.text("#result", "NOT");
31+
await utils.assertThrowsAsync(async() => {
32+
await browser.dragAndDrop("#not-element", "#target");
33+
}, `QueryError: [dragAndDrop] Element not found.`);
34+
await browser.assert.text("#result", "NOT");
35+
});
2936
});

tests/dummy_server/static/drag.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
// console.log("drop")
2626
ev.preventDefault();
2727
var textElem=document.querySelector("#result");
28-
textElem.textContent="DROP"
28+
textElem.textContent="DROPPED"
2929
}
3030
</script>
3131
</head>

0 commit comments

Comments
 (0)