UNPKG

3.43 kBJavaScriptView Raw
1/**
2 * Dependencies
3 */
4
5import url from 'url';
6import Promise from 'bluebird';
7import { remote } from 'webdriverio';
8import dbg from 'debug';
9import detectSeries from './utils/detect_series.js';
10
11/**
12 * Private
13 */
14
15const debug = dbg('mink:driver');
16
17/**
18 * Interface
19 */
20
21export 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// WebDriverIO client symlinks
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// Aliases
148Driver.prototype.isChecked = Driver.prototype.isSelected;
149Driver.prototype.check = Driver.prototype.click;
150Driver.prototype.uncheck = Driver.prototype.click;
151Driver.prototype.hover = Driver.prototype.moveToObject;
152Driver.prototype.setViewportSize = Driver.prototype.windowHandleSize;