diff --git a/.eslintrc b/.eslintrc index 95be16079b..1a45d44c88 100644 --- a/.eslintrc +++ b/.eslintrc @@ -114,6 +114,7 @@ "by": "readonly", "expect": "readonly", "browser": "readonly", + "app": "readonly", "Key": "readonly" } } diff --git a/lib/index.js b/lib/index.js index 3c181959b1..7b47a18ea4 100644 --- a/lib/index.js +++ b/lib/index.js @@ -345,7 +345,7 @@ Object.defineProperty(Nightwatch, 'by', { } }); -Object.defineProperty(Nightwatch, 'browser', { +const globalBrowserDescriptor = { configurable: true, get() { if (global.browser) { @@ -357,7 +357,11 @@ Object.defineProperty(Nightwatch, 'browser', { throw err; } -}); +}; + +Object.defineProperty(Nightwatch, 'browser', globalBrowserDescriptor); + +Object.defineProperty(Nightwatch, 'app', globalBrowserDescriptor); Object.defineProperty(Nightwatch, 'Key', { configurable: true, diff --git a/lib/testsuite/index.js b/lib/testsuite/index.js index 4c3197017f..1ac1ef6bc1 100644 --- a/lib/testsuite/index.js +++ b/lib/testsuite/index.js @@ -260,6 +260,13 @@ class TestSuite { return null; } + Object.defineProperty(global, 'app', { + configurable: true, + get: function() { + return global.browser; + } + }); + Object.defineProperty(global, 'by', { configurable: true, get: function() { diff --git a/test/apidemos/appium/appiumTest.js b/test/apidemos/appium/appiumTest.js new file mode 100644 index 0000000000..059fd0f8dd --- /dev/null +++ b/test/apidemos/appium/appiumTest.js @@ -0,0 +1,37 @@ +const assert = require('assert'); + +describe('appium api demo', function () { + after((app) => app.end()); + + const availableAppiumCommands = [ + 'startActivity', + 'getCurrentActivity', + 'getCurrentPackage', + 'getOrientation', + 'setOrientation', + 'getGeolocation', + 'setGeolocation', + 'pressKeyCode', + 'longPressKeyCode', + 'hideKeyboard', + 'isKeyboardShown', + 'getContexts', + 'getContext', + 'setContext' + ]; + + it('test appium available API commands', async function () { + // app variable is available globally + assert.strictEqual(app !== undefined, true); + + availableAppiumCommands.forEach((command) => { + assert.strictEqual(typeof app.appium[command], 'function'); + }); + }); + + it('Search for Nightwatch', async function() { + app // available globally + .click('id', 'com.app:id/search') + .sendKeys('id', 'com.app:id/search', 'Nightwatch'); + }); +}); diff --git a/test/src/apidemos/appium/testAppiumAPI.js b/test/src/apidemos/appium/testAppiumAPI.js new file mode 100644 index 0000000000..47dfc7d2b3 --- /dev/null +++ b/test/src/apidemos/appium/testAppiumAPI.js @@ -0,0 +1,98 @@ +const {strictEqual} = require('assert'); +const path = require('path'); +const common = require('../../../common.js'); +const MockServer = require('../../../lib/mockserver.js'); +const NightwatchClient = common.require('index.js'); + +describe('appium api demos', function () { + beforeEach(function (done) { + this.server = MockServer.init(undefined, {port: 4723}); + this.server.on('listening', () => { + done(); + }); + }); + + afterEach(function (done) { + this.server.close(function () { + done(); + }); + }); + + it('run appium api demo tests basic', function () { + const testsPath = path.join(__dirname, '../../../apidemos/appium/appiumTest.js'); + + const globals = { + waitForConditionPollInterval: 50, + + reporter(results) { + if (results.lastError) { + throw results.lastError; + } + } + }; + + MockServer + .addMock({ + url: '/wd/hub/session', + method: 'POST', + response: JSON.stringify({ + value: { + sessionId: '13521-10219-202', + version: 'TEST', + platform: 'TEST' + } + }) + }, true) + .addMock({ + url: '/wd/hub/session/13521-10219-202/elements', + postdata: { + using: 'id', + value: 'com.app:id/search' + }, + method: 'POST', + response: JSON.stringify({ + status: 0, + state: 'success', + value: [{'element-6066-11e4-a52e-4f735466cecf': '0'}] + }) + }, true, true) + .addMock({ + url: '/wd/hub/session/13521-10219-202/element/0/click', + method: 'POST', + response: JSON.stringify({ + value: null + }) + }, true) + .addMock({ + url: '/wd/hub/session/13521-10219-202/element/0/value', + method: 'POST', + postdata: JSON.stringify({ + text: 'Nightwatch', + value: 'Nightwatch'.split('') + }), + response: JSON.stringify({ + value: null + }) + }, true); + + return NightwatchClient.runTests(testsPath, { + selenium: { + host: 'localhost', + port: 4723, + start_process: false, + use_appium: true + }, + desiredCapabilities: { + browserName: '' + }, + output: false, + skip_testcases_on_fail: false, + silent: true, + persist_globals: true, + globals, + output_folder: false + }).then(_ => { + strictEqual(NightwatchClient.app !== undefined, true); + }); + }); +});