Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add global app property. #3549

Merged
merged 4 commits into from Feb 8, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 14 additions & 0 deletions lib/index.js
Expand Up @@ -359,6 +359,20 @@ Object.defineProperty(Nightwatch, 'browser', {
}
});

Object.defineProperty(Nightwatch, 'app', {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: we can use defineProperties, and define both app and browser

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIUC Object.defineProperties cannot be used to add the same descriptor to two properties, but is used to add all the properties in one go. But since all the properties are added to Nightwatch separately in this file, it makes more sense to me to use defineProperty only just to have a consistent pattern through the file.

But if the problem is with the repetition of the same descriptor for the two properties, we can maybe do something like this?

const nightwatchApiDescriptor = {
  configurable: true,
  get() {
    if (global.browser) {
      return global.browser;
    }

    const err = new TypeError('Nightwatch client is not yet available.');
    err.addDetailedErr = true;

    throw err;
  }
};

Object.defineProperty(Nightwatch, 'browser', nightwatchApiDescriptor);

Object.defineProperty(Nightwatch, 'app', nightwatchApiDescriptor);

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, can you do the refactoring to avoid repeating the code?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

configurable: true,
get() {
if (global.browser) {
return global.browser;
}

const err = new TypeError('Nightwatch client is not yet available.');
err.addDetailedErr = true;

throw err;
}
});

Object.defineProperty(Nightwatch, 'Key', {
configurable: true,
get() {
Expand Down
7 changes: 7 additions & 0 deletions lib/testsuite/index.js
Expand Up @@ -260,6 +260,13 @@ class TestSuite {
return null;
}

Object.defineProperty(global, 'app', {
garg3133 marked this conversation as resolved.
Show resolved Hide resolved
configurable: true,
get: function() {
return global.browser;
}
});

Object.defineProperty(global, 'by', {
configurable: true,
get: function() {
Expand Down
33 changes: 33 additions & 0 deletions test/apidemos/appium/appiumTest.js
@@ -0,0 +1,33 @@
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 chrome available API commands', async function () {
// app variable is available globally
// eslint-disable-next-line
assert.strictEqual(app !== undefined, true);

availableAppiumCommands.forEach((command) => {
// eslint-disable-next-line
assert.strictEqual(typeof app.appium[command], 'function');
});
});
});
66 changes: 66 additions & 0 deletions test/src/apidemos/appium/testAppiumAPI.js
@@ -0,0 +1,66 @@
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: '1352110219202',
version: 'TEST',
platform: 'TEST'
}
})
});

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);
});
});
});