topological-nodered-wdio 0.5.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,163 +1,163 @@
1
- const wdio = require('webdriverio')
2
- let newSessionNode
3
-
4
- module.exports.getBrowser = (context) => {
5
- let browser = context.flow.get('wdio_browser')
6
- if (!browser || !browser.sessionId)
7
- throw new Error('No session defined - call newSession first')
8
-
9
- return browser
10
- }
11
-
12
- /*
13
- config = {
14
- logLevel: 'error',
15
- protocol: 'https',
16
- hostname: '<key>@chrome.browserless.io',
17
- port: 443,
18
- path: '/webdriver',
19
- capabilities: {
20
- browserName: 'chrome',
21
- chromeOptions: {
22
- args: ['--headless', '--no-sandbox']
23
- }
24
- }
25
- }
26
- */
27
- module.exports.newSession = async (config, node, context) => {
28
- let browser
29
- try {
30
- browser = await wdio.remote(config)
31
- context.flow.set('wdio_browser', browser)
32
- newSessionNode = node
33
- } catch (e) {
34
- throw e
35
- }
36
- return browser
37
- }
38
-
39
- module.exports.deleteSession = async (context) => {
40
- let b
41
- let browser = context.flow.get('wdio_browser')
42
- try {
43
- b = { sessionId: browser.sessionId }
44
- await browser.closeWindow()
45
- await browser.deleteSession()
46
- context.flow.set('wdio_browser', null)
47
- if (newSessionNode) module.exports.disconnected(newSessionNode)
48
- } catch (e) {}
49
- return b
50
- }
51
-
52
- module.exports.getElementId = async (browser, using, value) => {
53
- let elementId
54
- try {
55
- const element = await browser.findElement(using, value)
56
- if (element && Object.keys(element)) {
57
- elementId = element[Object.keys(element)[0]]
58
- } else {
59
- let e
60
- if (element && element.message) {
61
- e = element.message
62
- } else {
63
- e = 'Element not found'
64
- }
65
- throw new Error(e)
66
- }
67
- } catch (e) {
68
- throw e
69
- }
70
- return elementId
71
- }
72
-
73
- module.exports.getLocator = async (browser, using, value) => {
74
- let locator = ''
75
- switch (using) {
76
- case 'id':
77
- locator = `#${value}`
78
- break
79
- case 'name':
80
- locator = `[name='${value}']`
81
- break
82
- case 'className':
83
- locator = `.${value}`
84
- break
85
- case 'tagName':
86
- locator = value
87
- break
88
- case 'cssSelector':
89
- locator = value
90
- break
91
- case 'text':
92
- locator = `=${value}`
93
- break
94
- case 'partialText':
95
- locator = `*=${value}`
96
- break
97
- case 'xPath':
98
- locator = value
99
- break
100
- default:
101
- locator = value
102
- }
103
-
104
- return locator
105
- }
106
-
107
- module.exports.handleError = (e, node, msg) => {
108
- console.log(e)
109
- module.exports.errorStatus(node)
110
- node.error(e, msg)
111
- }
112
-
113
- module.exports.clearStatus = (node) => {
114
- node.status({})
115
- }
116
-
117
- module.exports.connectedStatus = (node) => {
118
- node.status({
119
- fill: 'green',
120
- shape: 'dot',
121
- text: 'connected'
122
- })
123
- }
124
-
125
- module.exports.disconnectedStatus = (node) => {
126
- node.status({
127
- fill: 'green',
128
- shape: 'ring',
129
- text: 'disconnected'
130
- })
131
- }
132
-
133
- module.exports.successStatus = (node) => {
134
- node.status({
135
- fill: 'green',
136
- shape: 'ring',
137
- text: 'done'
138
- })
139
- }
140
-
141
- module.exports.errorStatus = (node) => {
142
- node.status({
143
- fill: 'red',
144
- shape: 'ring',
145
- text: 'error'
146
- })
147
- }
148
-
149
- module.exports.log = async (node) => {
150
- let context = node.context()
151
- let stepCount = await (context.global.get('stepCount') || 0) + 1
152
- let document = await context.global.get('document') || ''
153
- await context.global.set('document', `${document}${stepCount}. Node: ${node.name} - ${node.log}\n`)
154
- await context.global.set('stepCount', stepCount)
155
- }
156
-
157
- module.exports.document = async (node) => {
158
- let context = node.context()
159
- let document = await context.global.get('document') || ''
160
- document = node.line? `${document}\n${node.name}${node.refUrl? `\nRef: ${node.refUrl}`:''}\n\n` :
161
- `${document}********************\n${node.name}${node.refUrl? `\nRef: ${node.refUrl}`:''}\n********************\n`
162
- await context.global.set('document', document.replaceAll('\\n','\n'))
163
- }
1
+ const wdio = require('webdriverio')
2
+ let newSessionNode
3
+
4
+ module.exports.getBrowser = (context) => {
5
+ let browser = context.flow.get('wdio_browser')
6
+ if (!browser || !browser.sessionId)
7
+ throw new Error('No session defined - call newSession first')
8
+
9
+ return browser
10
+ }
11
+
12
+ /*
13
+ config = {
14
+ logLevel: 'error',
15
+ protocol: 'https',
16
+ hostname: '<key>@chrome.browserless.io',
17
+ port: 443,
18
+ path: '/webdriver',
19
+ capabilities: {
20
+ browserName: 'chrome',
21
+ chromeOptions: {
22
+ args: ['--headless', '--no-sandbox']
23
+ }
24
+ }
25
+ }
26
+ */
27
+ module.exports.newSession = async (config, node, context) => {
28
+ let browser
29
+ try {
30
+ browser = await wdio.remote(config)
31
+ context.flow.set('wdio_browser', browser)
32
+ newSessionNode = node
33
+ } catch (e) {
34
+ throw e
35
+ }
36
+ return browser
37
+ }
38
+
39
+ module.exports.deleteSession = async (context) => {
40
+ let b
41
+ let browser = context.flow.get('wdio_browser')
42
+ try {
43
+ b = { sessionId: browser.sessionId }
44
+ await browser.closeWindow()
45
+ await browser.deleteSession()
46
+ context.flow.set('wdio_browser', null)
47
+ if (newSessionNode) module.exports.disconnected(newSessionNode)
48
+ } catch (e) {}
49
+ return b
50
+ }
51
+
52
+ module.exports.getElementId = async (browser, using, value) => {
53
+ let elementId
54
+ try {
55
+ const element = await browser.findElement(using, value)
56
+ if (element && Object.keys(element)) {
57
+ elementId = element[Object.keys(element)[0]]
58
+ } else {
59
+ let e
60
+ if (element && element.message) {
61
+ e = element.message
62
+ } else {
63
+ e = 'Element not found'
64
+ }
65
+ throw new Error(e)
66
+ }
67
+ } catch (e) {
68
+ throw e
69
+ }
70
+ return elementId
71
+ }
72
+
73
+ module.exports.getLocator = async (browser, using, value) => {
74
+ let locator = ''
75
+ switch (using) {
76
+ case 'id':
77
+ locator = `#${value}`
78
+ break
79
+ case 'name':
80
+ locator = `[name='${value}']`
81
+ break
82
+ case 'className':
83
+ locator = `.${value}`
84
+ break
85
+ case 'tagName':
86
+ locator = value
87
+ break
88
+ case 'cssSelector':
89
+ locator = value
90
+ break
91
+ case 'text':
92
+ locator = `=${value}`
93
+ break
94
+ case 'partialText':
95
+ locator = `*=${value}`
96
+ break
97
+ case 'xPath':
98
+ locator = value
99
+ break
100
+ default:
101
+ locator = value
102
+ }
103
+
104
+ return locator
105
+ }
106
+
107
+ module.exports.handleError = (e, node, msg) => {
108
+ console.log(e)
109
+ module.exports.errorStatus(node)
110
+ node.error(e, msg)
111
+ }
112
+
113
+ module.exports.clearStatus = (node) => {
114
+ node.status({})
115
+ }
116
+
117
+ module.exports.connectedStatus = (node) => {
118
+ node.status({
119
+ fill: 'green',
120
+ shape: 'dot',
121
+ text: 'connected'
122
+ })
123
+ }
124
+
125
+ module.exports.disconnectedStatus = (node) => {
126
+ node.status({
127
+ fill: 'green',
128
+ shape: 'ring',
129
+ text: 'disconnected'
130
+ })
131
+ }
132
+
133
+ module.exports.successStatus = (node) => {
134
+ node.status({
135
+ fill: 'green',
136
+ shape: 'ring',
137
+ text: 'done'
138
+ })
139
+ }
140
+
141
+ module.exports.errorStatus = (node) => {
142
+ node.status({
143
+ fill: 'red',
144
+ shape: 'ring',
145
+ text: 'error'
146
+ })
147
+ }
148
+
149
+ module.exports.log = async (node) => {
150
+ let context = node.context()
151
+ let stepCount = await (context.global.get('stepCount') || 0) + 1
152
+ let document = await context.global.get('document') || ''
153
+ await context.global.set('document', `${document}${stepCount}. Node: ${node.name} - ${node.log}\n`)
154
+ await context.global.set('stepCount', stepCount)
155
+ }
156
+
157
+ module.exports.document = async (node) => {
158
+ let context = node.context()
159
+ let document = await context.global.get('document') || ''
160
+ document = node.line? `${document}\n${node.name}${node.refUrl? `\nRef: ${node.refUrl}`:''}\n\n` :
161
+ `${document}********************\n${node.name}${node.refUrl? `\nRef: ${node.refUrl}`:''}\n********************\n`
162
+ await context.global.set('document', document.replaceAll('\\n','\n'))
163
+ }
@@ -1,91 +1,91 @@
1
- <script type="text/javascript">
2
- function setWindowAction() {
3
- let action = $('#node-input-action').val()
4
- $('#actionValue').hide()
5
- $('#actionIndex').hide()
6
- if (action === 'byName' || action === 'open') {
7
- $('#actionValue').show()
8
- }
9
- if (action == 'byIndex') {
10
- $('#actionIndex').show()
11
- }
12
- }
13
-
14
- RED.nodes.registerType('window-action', {
15
- category: 'Webdriver IO',
16
- color: '#a6bbcf',
17
- defaults: {
18
- name: { value: '' },
19
- action: { value: 'byName' },
20
- value: { value: '' },
21
- index: { value: '' }
22
- },
23
- inputs: 1,
24
- outputs: 1,
25
- icon: 'white-globe.png',
26
- label: function() {
27
- return this.name || 'window action'
28
- },
29
- oneditprepare: function() {
30
- setWindowAction()
31
- }
32
- })
33
- </script>
34
-
35
- <script type="text/x-red" data-template-name="window-action">
36
- <div class="form-row">
37
- <label for="node-input-action"><i class="fa fa-tasks"></i> Action</label>
38
- <select type="text" id="node-input-action" style="width:70%;" onchange="setWindowAction()">
39
- <option value="byName">Switch to Window by Name</option>
40
- <option value="byIndex">Switch to Window by Index</option>
41
- <option value="getHandle">Get Window handle</option>
42
- <option value="close">Close Window</option>
43
- <option value="open">Open Window</option>
44
- </select>
45
- </div>
46
- <div class="form-row" id="actionValue">
47
- <label for="node-input-value"><i class="fa fa-tasks"></i> Window Name</label>
48
- <input id="node-input-value" type="text" placeholder="URL or Title of window">
49
- </div>
50
- <div class="form-row" id="actionIndex">
51
- <label for="node-input-index"><i class="fa fa-tasks"></i> Index</label>
52
- <input id="node-input-index" type="text" placeholder="starts 0">
53
- </div>
54
- <div class="form-row">
55
- <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
56
- <input id="node-input-name" type="text">
57
- </div>
58
- </script>
59
-
60
- <script type="text/x-red" data-help-name="window-action">
61
- <h3>Selected action of the node performs on browser windows.</h3>
62
-
63
- <h3>Inputs</h3>
64
- <dl class="message-properties">
65
- <dt><code>msg.value</code>: <span class="property-type">string</span></dt>
66
- <dd>URL or Title the window to target</dd>
67
- <dt><code>msg.index</code><span class="property-type">string</span></dt>
68
- <dd>zero-based index to target the desired window<br></dd>
69
- </dl>
70
- <h3>Details</h3>
71
- <dl class="message-properties">
72
- <dt>Action: <span class="property-type">Select</span></dt>
73
- <dd>
74
- <ul>
75
- <li><b>Switch to Window by Name</b></li>
76
- <ul>
77
- <li>Use URL or Title to switch to the browser tab/window.</li>
78
- </ul>
79
- <li><b>Switch to Window by Index</b></li>
80
- <ul>
81
- <li>Use a zero-based index to target the browser tab/window</li>
82
- </ul>
83
- <li><b>Get window Handle</b></li>
84
- <li><b>Close Window</b></li>
85
- <li><b>Open Window</b></li>
86
- </ul>
87
- </dd>
88
- </dl>
89
-
90
- </script>
91
-
1
+ <script type="text/javascript">
2
+ function setWindowAction() {
3
+ let action = $('#node-input-action').val()
4
+ $('#actionValue').hide()
5
+ $('#actionIndex').hide()
6
+ if (action === 'byName' || action === 'open') {
7
+ $('#actionValue').show()
8
+ }
9
+ if (action == 'byIndex') {
10
+ $('#actionIndex').show()
11
+ }
12
+ }
13
+
14
+ RED.nodes.registerType('window-action', {
15
+ category: 'Webdriver IO',
16
+ color: '#a6bbcf',
17
+ defaults: {
18
+ name: { value: '' },
19
+ action: { value: 'byName' },
20
+ value: { value: '' },
21
+ index: { value: '' }
22
+ },
23
+ inputs: 1,
24
+ outputs: 1,
25
+ icon: 'white-globe.png',
26
+ label: function() {
27
+ return this.name || 'window action'
28
+ },
29
+ oneditprepare: function() {
30
+ setWindowAction()
31
+ }
32
+ })
33
+ </script>
34
+
35
+ <script type="text/x-red" data-template-name="window-action">
36
+ <div class="form-row">
37
+ <label for="node-input-action"><i class="fa fa-tasks"></i> Action</label>
38
+ <select type="text" id="node-input-action" style="width:70%;" onchange="setWindowAction()">
39
+ <option value="byName">Switch to Window by Name</option>
40
+ <option value="byIndex">Switch to Window by Index</option>
41
+ <option value="getHandle">Get Window handle</option>
42
+ <option value="close">Close Window</option>
43
+ <option value="open">Open Window</option>
44
+ </select>
45
+ </div>
46
+ <div class="form-row" id="actionValue">
47
+ <label for="node-input-value"><i class="fa fa-tasks"></i> Window Name</label>
48
+ <input id="node-input-value" type="text" placeholder="URL or Title of window">
49
+ </div>
50
+ <div class="form-row" id="actionIndex">
51
+ <label for="node-input-index"><i class="fa fa-tasks"></i> Index</label>
52
+ <input id="node-input-index" type="text" placeholder="starts 0">
53
+ </div>
54
+ <div class="form-row">
55
+ <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
56
+ <input id="node-input-name" type="text">
57
+ </div>
58
+ </script>
59
+
60
+ <script type="text/x-red" data-help-name="window-action">
61
+ <h3>Selected action of the node performs on browser windows.</h3>
62
+
63
+ <h3>Inputs</h3>
64
+ <dl class="message-properties">
65
+ <dt><code>msg.value</code>: <span class="property-type">string</span></dt>
66
+ <dd>URL or Title the window to target</dd>
67
+ <dt><code>msg.index</code><span class="property-type">string</span></dt>
68
+ <dd>zero-based index to target the desired window<br></dd>
69
+ </dl>
70
+ <h3>Details</h3>
71
+ <dl class="message-properties">
72
+ <dt>Action: <span class="property-type">Select</span></dt>
73
+ <dd>
74
+ <ul>
75
+ <li><b>Switch to Window by Name</b></li>
76
+ <ul>
77
+ <li>Use URL or Title to switch to the browser tab/window.</li>
78
+ </ul>
79
+ <li><b>Switch to Window by Index</b></li>
80
+ <ul>
81
+ <li>Use a zero-based index to target the browser tab/window</li>
82
+ </ul>
83
+ <li><b>Get window Handle</b></li>
84
+ <li><b>Close Window</b></li>
85
+ <li><b>Open Window</b></li>
86
+ </ul>
87
+ </dd>
88
+ </dl>
89
+
90
+ </script>
91
+
@@ -1,43 +1,43 @@
1
- const common = require('./wdio-common')
2
-
3
- module.exports = function(RED) {
4
- function windowAction(config) {
5
- RED.nodes.createNode(this, config)
6
- const node = this
7
- common.clearStatus(node)
8
-
9
- node.on('input', async (msg) => {
10
- try {
11
- let browser = await common.getBrowser(node.context())
12
-
13
- let value = config.value || msg.value
14
- let index = config.index || msg.index
15
-
16
- if (config.action === 'byName') {
17
- node.log = `Switch to the browser window with window title: "${value}".`
18
- await browser.switchWindow(value)
19
- } else if (config.action === 'byIndex') {
20
- node.log = `Switch to the browser window with window index: "${index}".`
21
- let handles = await browser.getWindowHandles()
22
- await browser.switchWindow(handles[index])
23
- } else if (config.action === 'getHandle') {
24
- node.log = `Get all the browser windows.`
25
- msg.payload = await browser.getWindowHandles()
26
- } else if (config.action === 'close') {
27
- node.log = `Close the active browser window.`
28
- await browser.closeWindow()
29
- } else if (config.action === 'open') {
30
- node.log = `Open a new window with url: "${value}".`
31
- await browser.createWindow(value)
32
- }
33
- await common.log(node)
34
- common.successStatus(node)
35
- node.send(msg)
36
- } catch (e) {
37
- await common.log(node)
38
- common.handleError(e, node, msg)
39
- }
40
- })
41
- }
42
- RED.nodes.registerType('window-action', windowAction)
43
- }
1
+ const common = require('./wdio-common')
2
+
3
+ module.exports = function(RED) {
4
+ function windowAction(config) {
5
+ RED.nodes.createNode(this, config)
6
+ const node = this
7
+ common.clearStatus(node)
8
+
9
+ node.on('input', async (msg) => {
10
+ try {
11
+ let browser = await common.getBrowser(node.context())
12
+
13
+ let value = config.value || msg.value
14
+ let index = config.index || msg.index
15
+
16
+ if (config.action === 'byName') {
17
+ node.log = `Switch to the browser window with window title: "${value}".`
18
+ await browser.switchWindow(value)
19
+ } else if (config.action === 'byIndex') {
20
+ node.log = `Switch to the browser window with window index: "${index}".`
21
+ let handles = await browser.getWindowHandles()
22
+ await browser.switchWindow(handles[index])
23
+ } else if (config.action === 'getHandle') {
24
+ node.log = `Get all the browser windows.`
25
+ msg.payload = await browser.getWindowHandles()
26
+ } else if (config.action === 'close') {
27
+ node.log = `Close the active browser window.`
28
+ await browser.closeWindow()
29
+ } else if (config.action === 'open') {
30
+ node.log = `Open a new window with url: "${value}".`
31
+ await browser.createWindow(value)
32
+ }
33
+ await common.log(node)
34
+ common.successStatus(node)
35
+ node.send(msg)
36
+ } catch (e) {
37
+ await common.log(node)
38
+ common.handleError(e, node, msg)
39
+ }
40
+ })
41
+ }
42
+ RED.nodes.registerType('window-action', windowAction)
43
+ }