1 |
|
2 |
|
3 |
|
4 |
|
5 | import url from 'url';
|
6 | import Promise from 'bluebird';
|
7 | import { remote } from 'webdriverio';
|
8 | import dbg from 'debug';
|
9 | import detectSeries from './utils/detect_series.js';
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | const debug = dbg('mink:driver');
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | export default class Driver {
|
22 | constructor(parameters) {
|
23 | this.parameters = parameters;
|
24 | this.client = remote(parameters);
|
25 | this.baseUrl = parameters.baseUrl;
|
26 | }
|
27 |
|
28 | click(selector) {
|
29 | if (typeof selector === 'object' && selector.ELEMENT) {
|
30 | return this.client.elementIdClick(selector.ELEMENT);
|
31 | }
|
32 | return this.client.click(selector);
|
33 | }
|
34 |
|
35 | html(selector) {
|
36 | if (!selector) {
|
37 | return this.client.getSource();
|
38 | }
|
39 | return this.client.getHTML(selector).then(item => {
|
40 | if (Array.isArray(item)) return item.join('');
|
41 | return item;
|
42 | });
|
43 | }
|
44 |
|
45 | url(input) {
|
46 | if (!input) {
|
47 | return this.client.getUrl().then(text =>
|
48 | url.parse(text)
|
49 | );
|
50 | }
|
51 | return this.client.url(input);
|
52 | }
|
53 |
|
54 | sendKey(selector, key) {
|
55 | return this.client.click(selector).then(() =>
|
56 | this.client.keys(key)
|
57 | );
|
58 | }
|
59 |
|
60 | elements(selector) {
|
61 | return this.client.elements(selector)
|
62 | .then(response => response.value);
|
63 | }
|
64 |
|
65 | elementsCount(selector) {
|
66 | return this.elements(selector)
|
67 | .then(items => items.length);
|
68 | }
|
69 |
|
70 | elementsWithText(selector, text) {
|
71 | return this.elements(selector)
|
72 | .then(items => Promise.filter(items, WebElement =>
|
73 | this.client
|
74 | .elementIdText(WebElement.ELEMENT)
|
75 | .then(result => result.value === text)
|
76 | ));
|
77 | }
|
78 |
|
79 | elementsWithValue(selector, value) {
|
80 | return this.elements(selector)
|
81 | .then(items => Promise.filter(items, WebElement =>
|
82 | this.client
|
83 | .elementIdAttribute(WebElement.ELEMENT, 'value')
|
84 | .then(result => result.value === value)
|
85 | ));
|
86 | }
|
87 |
|
88 | button(mixed) {
|
89 | return detectSeries(
|
90 | [
|
91 | () => this.elements(mixed).catch(err => {
|
92 | debug(err);
|
93 | return [];
|
94 | }),
|
95 | () => this.elementsWithText('button', mixed),
|
96 | () => this.elementsWithValue('input[type=submit]', mixed),
|
97 | ],
|
98 | fn => fn(),
|
99 | WebElements => !!WebElements.length
|
100 | ).then(({ result }) => {
|
101 | if (!result) throw new Error('Button not found !');
|
102 | return result[0];
|
103 | });
|
104 | }
|
105 |
|
106 | link(mixed) {
|
107 | return detectSeries(
|
108 | [
|
109 | () => this.elements(mixed).catch(err => {
|
110 | debug(err);
|
111 | return [];
|
112 | }),
|
113 | () => this.elementsWithText('body a', mixed),
|
114 | ],
|
115 | fn => fn(),
|
116 | WebElements => !!WebElements.length
|
117 | ).then(({ result }) => {
|
118 | if (!result) throw new Error('Link not found !');
|
119 | return result[0];
|
120 | });
|
121 | }
|
122 | }
|
123 |
|
124 |
|
125 | [
|
126 | 'init',
|
127 | 'refresh',
|
128 | 'back',
|
129 | 'end',
|
130 | 'setValue',
|
131 | 'selectByVisibleText',
|
132 | 'submitForm',
|
133 | 'windowHandleSize',
|
134 | 'saveScreenshot',
|
135 | 'getValue',
|
136 | 'moveToObject',
|
137 | 'isEnabled',
|
138 | 'isExisting',
|
139 | 'isSelected',
|
140 | 'isVisible',
|
141 | ].forEach(method => {
|
142 | Driver.prototype[method] = function (...args) {
|
143 | return this.client[method].apply(this, args);
|
144 | };
|
145 | });
|
146 |
|
147 |
|
148 | Driver.prototype.isChecked = Driver.prototype.isSelected;
|
149 | Driver.prototype.check = Driver.prototype.click;
|
150 | Driver.prototype.uncheck = Driver.prototype.click;
|
151 | Driver.prototype.hover = Driver.prototype.moveToObject;
|
152 | Driver.prototype.setViewportSize = Driver.prototype.windowHandleSize;
|