From fc6748a46bd8e60ccd62625a4985a84516ccbc2e Mon Sep 17 00:00:00 2001 From: Kazuki Nakanishi Date: Tue, 19 Dec 2017 20:11:51 +0900 Subject: [PATCH] [UI test] Split test script into scenario and browser operation (#1516) --- .../pageobjects/workspace/debugTab_page.js | 35 ++++++++++ .../pageobjects/workspace/editWindow_page.js | 24 +++++++ .../editor/pageobjects/workspace/node_page.js | 52 +++++++++++++++ .../pageobjects/workspace/workspace_page.js | 62 ++++++++++++++++++ test/editor/specs/editor_spec.js | 64 ++++++++++--------- test/editor/wdio.conf.js | 2 +- 6 files changed, 209 insertions(+), 30 deletions(-) create mode 100644 test/editor/pageobjects/workspace/debugTab_page.js create mode 100644 test/editor/pageobjects/workspace/editWindow_page.js create mode 100644 test/editor/pageobjects/workspace/node_page.js create mode 100644 test/editor/pageobjects/workspace/workspace_page.js diff --git a/test/editor/pageobjects/workspace/debugTab_page.js b/test/editor/pageobjects/workspace/debugTab_page.js new file mode 100644 index 000000000..c46314b27 --- /dev/null +++ b/test/editor/pageobjects/workspace/debugTab_page.js @@ -0,0 +1,35 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +function open() { + browser.click('#red-ui-tab-debug'); +} + +function getMessage() { + var debugMessagePath = '//div[@class="debug-content debug-content-list"]//span[contains(@class, "debug-message-type")]'; + browser.waitForExist(debugMessagePath); + return browser.getText(debugMessagePath); +} + +function clearMessage() { + browser.click('//a[@id="debug-tab-clear"]'); +} + +module.exports = { + open: open, + getMessage: getMessage, + clearMessage: clearMessage, +}; diff --git a/test/editor/pageobjects/workspace/editWindow_page.js b/test/editor/pageobjects/workspace/editWindow_page.js new file mode 100644 index 000000000..25ceecc8f --- /dev/null +++ b/test/editor/pageobjects/workspace/editWindow_page.js @@ -0,0 +1,24 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +function clickOk() { + browser.click('#node-dialog-ok'); + browser.pause(300); +} + +module.exports = { + clickOk: clickOk, +}; diff --git a/test/editor/pageobjects/workspace/node_page.js b/test/editor/pageobjects/workspace/node_page.js new file mode 100644 index 000000000..3fd5ba630 --- /dev/null +++ b/test/editor/pageobjects/workspace/node_page.js @@ -0,0 +1,52 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +var icons = { + // input + "inject": "icons/node-red/inject.png", + // output + "debug": "icons/node-red/debug.png", + // function + "change": "icons/node-red/swap.png", +}; + +function getIdWithIcon(icon) { + //*[name()="image" and @*="icons/node-red/inject.png"]/../.. + var id = browser.getAttribute('//*[name()="image" and @*="' + icon + '"]/../..', 'id'); + return id; +} + +function Node(type) { + this.id = '//*[@id="' + getIdWithIcon(icons[type]) + '"]'; +} + +Node.prototype.edit = function() { + browser.click(this.id); + browser.click(this.id); + browser.pause(500); // Necessary for headless mode. +} + +Node.prototype.connect = function(targetNode) { + var outputPort = this.id + '/*[@class="port_output"]'; + var inputPort = targetNode.id + '/*[@class="port_input"]'; + browser.dragAndDrop(outputPort, inputPort) +} + +Node.prototype.clickLeftButton = function() { + browser.click(this.id + '/*[@class="node_button node_left_button"]'); +} + +module.exports = Node; diff --git a/test/editor/pageobjects/workspace/workspace_page.js b/test/editor/pageobjects/workspace/workspace_page.js new file mode 100644 index 000000000..95b8d2260 --- /dev/null +++ b/test/editor/pageobjects/workspace/workspace_page.js @@ -0,0 +1,62 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + + var when = require('when'); + +var events = require("../../../../red/runtime/events.js"); + +var node = require('./node_page'); + +var palette = { + "inject": "#palette_node_inject", + "debug": "#palette_node_debug", + "change": "#palette_node_change", +}; + +function addNode(type, x, y) { + var offsetX = x ? x : 0; + var offsetY = y ? y : 0; + browser.moveToObject(palette[type]); + browser.buttonDown(); + browser.moveToObject("#palette-search", offsetX + 300, offsetY + 100); // adjust to the top-left corner of workspace. + browser.buttonUp(); + return new node(type); +} + +function deleteAllNodes() { + browser.keys(['Control', 'a', 'a', 'Control']); // call twice to release the keys. + browser.keys(['Delete']); +} + +function deploy() { + browser.call(function () { + return when.promise(function(resolve, reject) { + events.on("runtime-event", function(event) { + if (event.id === 'runtime-deploy') { + resolve(); + } + }); + browser.click('#btn-deploy'); + }); + }); + browser.pause(500); // Necessary for headless mode. +} + +module.exports = { + addNode: addNode, + deleteAllNodes: deleteAllNodes, + deploy: deploy +}; diff --git a/test/editor/specs/editor_spec.js b/test/editor/specs/editor_spec.js index 3af7789e7..e14b89250 100644 --- a/test/editor/specs/editor_spec.js +++ b/test/editor/specs/editor_spec.js @@ -19,11 +19,19 @@ var should = require("should"); var fs = require('fs-extra'); var helper = require("../editor_helper"); -var events = require("../../../red/runtime/events.js"); +var editWindow = require('../pageobjects/workspace/editWindow_page'); +var debugTab = require('../pageobjects/workspace/debugTab_page'); +var workspace = require('../pageobjects/workspace/workspace_page'); +var nodeWidth = 200; describe('Node-RED main page', function() { + beforeEach(function() { + workspace.deleteAllNodes(); + }); + before(function() { + browser.windowHandleMaximize(); browser.call(function () { return when.promise(function(resolve, reject) { helper.startServer(function() { @@ -50,37 +58,35 @@ describe('Node-RED main page', function() { }); it('should output a timestamp', function() { - browser.moveToObject('#palette_node_inject'); - browser.buttonDown(); - browser.moveToObject('#palette_node_inject', 300, 50); - browser.buttonUp(); + var injectNode = workspace.addNode("inject"); + var debugNode = workspace.addNode("debug", nodeWidth); + injectNode.connect(debugNode); - browser.moveToObject('#palette_node_debug'); - browser.buttonDown(); - browser.moveToObject('#palette_node_debug', 300, -50); - browser.buttonUp(); + workspace.deploy(); - browser.moveToObject('.port_output'); - browser.buttonDown(); - browser.moveToObject('.port_input'); - browser.buttonUp(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().should.within(1500000000000, 3000000000000); + }); - browser.click('#btn-deploy'); - browser.call(function () { - return when.promise(function(resolve, reject) { - events.on("runtime-event", function(event) { - if (event.id === 'runtime-deploy') { - resolve(); - } - }); - }); - }); - // need additional wait to click on workspace. - browser.pause(500); + it('should set a message property to a fixed value', function() { + var injectNode = workspace.addNode("inject"); + var changeNode = workspace.addNode("change", nodeWidth); + var debugNode = workspace.addNode("debug", nodeWidth * 2); - browser.click('#red-ui-tab-debug'); - browser.click('.node_left_button'); - browser.waitForExist('.debug-message-type-number'); - browser.getText('.debug-message-type-number').should.within(1500000000000, 3000000000000); + changeNode.edit(); + browser.setValue('.node-input-rule-property-value', 'Hello World!'); + editWindow.clickOk(); + + injectNode.connect(changeNode); + changeNode.connect(debugNode); + + workspace.deploy(); + + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().should.be.equal('"Hello World!"'); }); }); diff --git a/test/editor/wdio.conf.js b/test/editor/wdio.conf.js index e24dee297..8aa28c340 100644 --- a/test/editor/wdio.conf.js +++ b/test/editor/wdio.conf.js @@ -63,7 +63,7 @@ exports.config = { browserName: 'chrome', chromeOptions: { // Runs tests without opening a broser. - args: ['--headless', '--disable-gpu'], + args: ['--headless', '--disable-gpu', 'window-size=1920,1080'], // Runs tests with opening a broser. // args: ['--disable-gpu'], },