2020-05-20 02:28:41 +03:00
|
|
|
const path = require('path');
|
2020-07-10 21:51:09 +03:00
|
|
|
const fs = require('fs');
|
2020-05-20 02:28:41 +03:00
|
|
|
|
|
|
|
const appPath = path.resolve(path.dirname(require.resolve('@office-iss/rex-win32/rex-win32.js')), 'ReactTest.exe');
|
2023-09-07 00:42:48 +03:00
|
|
|
const appArgs =
|
|
|
|
'basePath ' + path.join(__dirname, '..', 'win32', 'dist') + ' plugin defaultplugin bundle index.win32 component FluentTester';
|
2020-05-20 02:28:41 +03:00
|
|
|
const appDir = path.dirname(require.resolve('@office-iss/rex-win32/rex-win32.js'));
|
|
|
|
|
2021-10-12 20:14:13 +03:00
|
|
|
const defaultWaitForTimeout = 20000;
|
2022-09-09 01:15:35 +03:00
|
|
|
const defaultConnectionRetryTimeout = 60000;
|
2022-09-06 21:18:42 +03:00
|
|
|
const jasmineDefaultTimeout = 60000; // 60 seconds for Jasmine test timeout
|
2020-05-20 02:28:41 +03:00
|
|
|
|
|
|
|
exports.config = {
|
|
|
|
runner: 'local', // Where should your test be launched
|
2022-11-29 06:36:02 +03:00
|
|
|
specs: ['../E2E/src/**/specs/*.win.ts'],
|
2022-10-17 20:53:05 +03:00
|
|
|
exclude: [],
|
|
|
|
|
2020-05-20 02:28:41 +03:00
|
|
|
capabilities: [
|
|
|
|
{
|
|
|
|
maxInstances: 1, // Maximum number of total parallel running workers.
|
|
|
|
platformName: 'windows',
|
2022-04-01 00:28:58 +03:00
|
|
|
'appium:automationName': 'windows',
|
|
|
|
'appium:deviceName': 'WindowsPC',
|
|
|
|
'appium:app': appPath,
|
|
|
|
'appium:appArguments': appArgs,
|
|
|
|
'appium:appWorkingDir': appDir,
|
2020-07-10 21:51:09 +03:00
|
|
|
},
|
2020-05-20 02:28:41 +03:00
|
|
|
],
|
|
|
|
|
|
|
|
/*
|
2022-09-06 21:18:42 +03:00
|
|
|
** ===============================================================================================
|
|
|
|
** Test Configurations - Define all options that are relevant for the WebdriverIO instance here
|
|
|
|
** ===============================================================================================
|
2020-05-20 02:28:41 +03:00
|
|
|
*/
|
|
|
|
|
|
|
|
logLevel: 'info', // Level of logging verbosity: trace | debug | info | warn | error | silent
|
2023-09-01 04:45:00 +03:00
|
|
|
bail: 1, // If you only want to run your tests until a specific amount of tests have failed use bail (default is 0 - don't bail, run all tests).
|
2020-06-05 02:13:22 +03:00
|
|
|
waitforTimeout: defaultWaitForTimeout, // Default timeout for all waitForXXX commands.
|
|
|
|
connectionRetryTimeout: defaultConnectionRetryTimeout, // Timeout for any WebDriver request to a driver or grid.
|
2023-09-01 04:45:00 +03:00
|
|
|
connectionRetryCount: 2, // Maximum count of request retries to the Selenium server.
|
|
|
|
specFileRetries: 2, // The number of times to retry the entire spec file when it fails as a whole.
|
2020-05-20 02:28:41 +03:00
|
|
|
|
|
|
|
port: 4723, // default appium port
|
2021-12-17 02:11:01 +03:00
|
|
|
services: [
|
|
|
|
[
|
|
|
|
'appium',
|
|
|
|
{
|
|
|
|
logPath: './reports/',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
],
|
2020-05-20 02:28:41 +03:00
|
|
|
|
|
|
|
framework: 'jasmine',
|
2022-09-01 19:45:52 +03:00
|
|
|
jasmineOpts: {
|
2022-09-06 21:18:42 +03:00
|
|
|
defaultTimeoutInterval: jasmineDefaultTimeout,
|
2020-05-20 02:28:41 +03:00
|
|
|
},
|
|
|
|
|
2021-10-21 01:15:04 +03:00
|
|
|
reporters: ['spec'],
|
2020-05-20 02:28:41 +03:00
|
|
|
|
2022-09-06 21:18:42 +03:00
|
|
|
autoCompileOpts: {
|
|
|
|
autoCompile: true,
|
|
|
|
|
|
|
|
tsNodeOpts: {
|
|
|
|
files: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
2020-05-20 02:28:41 +03:00
|
|
|
/*
|
|
|
|
** ===================
|
|
|
|
** Hooks
|
|
|
|
** ===================
|
|
|
|
** WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
|
|
|
|
** it and to build services around it. You can either apply a single function or an array of
|
|
|
|
** methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
|
|
|
|
** resolved to continue.
|
|
|
|
*/
|
|
|
|
/**
|
|
|
|
* Gets executed once before all workers get launched.
|
|
|
|
* @param {Object} config wdio configuration object
|
|
|
|
* @param {Array.<Object>} capabilities list of capabilities details
|
|
|
|
*/
|
|
|
|
// onPrepare: function (config, capabilities) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Gets executed before a worker process is spawned and can be used to initialise specific service
|
|
|
|
* for that worker as well as modify runtime environments in an async fashion.
|
|
|
|
* @param {String} cid capability id (e.g 0-0)
|
|
|
|
* @param {[type]} caps object containing capabilities for session that will be spawn in the worker
|
|
|
|
* @param {[type]} specs specs to be run in the worker process
|
|
|
|
* @param {[type]} args object that will be merged with the main configuration once worker is initialised
|
|
|
|
* @param {[type]} execArgv list of string arguments passed to the worker process
|
|
|
|
*/
|
|
|
|
// onWorkerStart: function (cid, caps, specs, args, execArgv) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Gets executed just before initialising the webdriver session and test framework. It allows you
|
|
|
|
* to manipulate configurations depending on the capability or spec.
|
|
|
|
* @param {Object} config wdio configuration object
|
|
|
|
* @param {Array.<Object>} capabilities list of capabilities details
|
|
|
|
* @param {Array.<String>} specs List of spec file paths that are to be run
|
|
|
|
*/
|
2023-02-09 22:09:21 +03:00
|
|
|
beforeSession: (/* config, capabilities, specs */) => {
|
2021-11-17 00:01:29 +03:00
|
|
|
fs.mkdirSync('./errorShots', { recursive: true });
|
Use selector chaining to improve element query performance (#2226)
* Add selector chaining in `By` method using root
* Add await keyword to `By` func calls
* Change files
* Fix bug in searching for elements outside rootView
In some instances, elements we're looking for, such as some menu
items, aren't children of the rootView we designate. This commit
adds an if statement to check for this.
This commit also fixes missing await keywords in NavigateAppPage and
NativeTestingPageObject.
* Add fallback for UWP failing pipeline
* Add environment var for platform-specific querying
* Change scrollToComponentButton to use environment var
* Use query chaining for ios tests
* Fix iOS tests failing
* Change files
* Change condition which makes root view accessible
* Integrate experimental link tests
* Fix e2etests failing in win ci
* Rename _rootView -> rootView
* Remove chained awaits from Query calls
* Revert "Remove chained awaits from Query calls"
This reverts commit 188c7f9cf41f7a7fdd5986adc28801b3e3121369.
* Change strategy in finding search root for queries
Previously, we designated a root view to start our searches from. For most
elements, this works, but in cases such as ContextualMenu on win32, those
children can't be found under our root, meaning we have to search the whole
tree. There are similar cases with UWP.
This commit changes how we find our search root by separating logic per
platform. UWP and Win32 e2etests have different ways in which they can
find the top window to start searches from. This way, there does not need
to be an edge case for ContextualMenuItems, and this way, we don't need
chained awaits.
Currently, strategies for finding a starting root for searches still need
to be implemented for iOS, macOS, and Android.
* Remove leftovers from testing
Removed leftover code from testing. Also adjusted UWP root
search strategy to be more specific.
* Revert "Remove leftovers from testing"
This reverts commit 04e6b45fb9f052258711f69a3756b0874c69a0fc.
* Revert "Change strategy in finding search root for queries"
This reverts commit 4269a0f28774890229d73289ac701ef59864c4af.
* Fix nits
Co-authored-by: Lawrence Win <winlarry@microsoft.com>
2022-10-27 20:45:11 +03:00
|
|
|
process.env['E2ETEST_PLATFORM'] = 'win32';
|
2024-05-15 22:10:51 +03:00
|
|
|
process.env['NATIVE_TESTING'] = false;
|
2020-07-10 21:51:09 +03:00
|
|
|
},
|
2020-05-20 02:28:41 +03:00
|
|
|
/**
|
|
|
|
* Gets executed before test execution begins. At this point you can access to all global
|
|
|
|
* variables like `browser`. It is the perfect place to define custom commands.
|
|
|
|
* @param {Array.<Object>} capabilities list of capabilities details
|
|
|
|
* @param {Array.<String>} specs List of spec file paths that are to be run
|
|
|
|
*/
|
2023-02-09 22:09:21 +03:00
|
|
|
before: async () => {
|
2022-09-06 21:18:42 +03:00
|
|
|
await browser.maximizeWindow();
|
2020-05-20 02:28:41 +03:00
|
|
|
},
|
|
|
|
/**
|
|
|
|
* Runs before a WebdriverIO command gets executed.
|
|
|
|
* @param {String} commandName hook command name
|
|
|
|
* @param {Array} args arguments that command would receive
|
|
|
|
*/
|
|
|
|
// beforeCommand: function (commandName, args) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Hook that gets executed before the suite starts
|
|
|
|
* @param {Object} suite suite details
|
|
|
|
*/
|
|
|
|
// beforeSuite: function (suite) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Function to be executed before a test (in Mocha/Jasmine) starts.
|
|
|
|
*/
|
|
|
|
// beforeTest: function (test, context) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
|
|
|
|
* beforeEach in Mocha)
|
|
|
|
*/
|
|
|
|
// beforeHook: function (test, context) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
|
|
|
|
* afterEach in Mocha)
|
|
|
|
*/
|
|
|
|
// afterHook: function (test, context, { error, result, duration, passed, retries }) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Function to be executed after a test (in Mocha/Jasmine).
|
|
|
|
*/
|
2023-02-09 22:09:21 +03:00
|
|
|
afterTest: async (test, context, results) => {
|
2022-10-11 01:03:58 +03:00
|
|
|
const resultString = results.passed ? 'Passed' : 'Failed';
|
2024-05-15 22:10:51 +03:00
|
|
|
console.log(`\nTest Case: "${test.description}".\nResult: "${resultString}".\nDuration: "${(results.duration / 600).toFixed(2)}s". \n`);
|
2022-10-11 01:03:58 +03:00
|
|
|
|
2021-10-21 01:15:04 +03:00
|
|
|
// if test passed, ignore, else take and save screenshot. Unless it's the first test that boots the app,
|
|
|
|
// it may be useful to have a screenshot of the app on load.
|
|
|
|
if (results.passed) {
|
|
|
|
return;
|
|
|
|
}
|
2020-07-10 21:51:09 +03:00
|
|
|
|
|
|
|
// build file path
|
2023-09-01 04:45:00 +03:00
|
|
|
const filePath = './errorShots/ScreenshotOfFailure.png';
|
2020-07-10 21:51:09 +03:00
|
|
|
|
2022-02-07 21:41:32 +03:00
|
|
|
/* If there are more than one instance of the app open, we know an assert popped up. Since the test already failed and a screenshot was captured
|
|
|
|
* we want to close the assert popup. If we don't it will stay open and negatively interact with logic in our CI pipeline. */
|
2022-09-06 21:18:42 +03:00
|
|
|
const windowHandles = await browser.getWindowHandles();
|
2022-02-07 21:41:32 +03:00
|
|
|
if (windowHandles.length > 1) {
|
|
|
|
/* Switch to the Assert window - Take a screenshot and close the assert */
|
2022-09-06 21:18:42 +03:00
|
|
|
await browser.switchToWindow(windowHandles[0]);
|
|
|
|
await browser.saveScreenshot(filePath);
|
|
|
|
await browser.closeWindow();
|
2022-02-07 21:41:32 +03:00
|
|
|
|
|
|
|
/* Switch back to FluentTester and close. The test harness has trouble closing the app when an assert fired */
|
2022-09-06 21:18:42 +03:00
|
|
|
await browser.switchToWindow(windowHandles[1]);
|
|
|
|
await browser.closeWindow();
|
2022-02-07 21:41:32 +03:00
|
|
|
} else {
|
|
|
|
// save screenshot
|
2022-09-06 21:18:42 +03:00
|
|
|
await browser.saveScreenshot(filePath);
|
2022-02-07 21:41:32 +03:00
|
|
|
}
|
2020-05-20 02:28:41 +03:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Hook that gets executed after the suite has ended
|
|
|
|
* @param {Object} suite suite details
|
|
|
|
*/
|
|
|
|
// afterSuite: function (suite) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Runs after a WebdriverIO command gets executed
|
|
|
|
* @param {String} commandName hook command name
|
|
|
|
* @param {Array} args arguments that command would receive
|
|
|
|
* @param {Number} result 0 - command success, 1 - command error
|
|
|
|
* @param {Object} error error object if any
|
|
|
|
*/
|
|
|
|
// afterCommand: function (commandName, args, result, error) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Gets executed after all tests are done. You still have access to all global variables from
|
|
|
|
* the test.
|
|
|
|
* @param {Number} result 0 - test pass, 1 - test fail
|
|
|
|
* @param {Array.<Object>} capabilities list of capabilities details
|
|
|
|
* @param {Array.<String>} specs List of spec file paths that ran
|
|
|
|
*/
|
|
|
|
// after: function (result, capabilities, specs) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Gets executed right after terminating the webdriver session.
|
|
|
|
* @param {Object} config wdio configuration object
|
|
|
|
* @param {Array.<Object>} capabilities list of capabilities details
|
|
|
|
* @param {Array.<String>} specs List of spec file paths that ran
|
|
|
|
*/
|
|
|
|
// afterSession: function (config, capabilities, specs) {
|
|
|
|
// },
|
|
|
|
/**
|
|
|
|
* Gets executed after all workers got shut down and the process is about to exit. An error
|
|
|
|
* thrown in the onComplete hook will result in the test run failing.
|
|
|
|
* @param {Object} exitCode 0 - success, 1 - fail
|
|
|
|
* @param {Object} config wdio configuration object
|
|
|
|
* @param {Array.<Object>} capabilities list of capabilities details
|
|
|
|
* @param {<Object>} results object containing test results
|
|
|
|
*/
|
2023-02-09 22:09:21 +03:00
|
|
|
onComplete: (/* exitCode, config, capabilities, results */) => {
|
2020-05-20 02:28:41 +03:00
|
|
|
console.log('<<< TESTING FINISHED >>>');
|
2020-07-10 21:51:09 +03:00
|
|
|
},
|
2020-05-20 02:28:41 +03:00
|
|
|
/**
|
|
|
|
* Gets executed when a refresh happens.
|
|
|
|
* @param {String} oldSessionId session ID of the old session
|
|
|
|
* @param {String} newSessionId session ID of the new session
|
|
|
|
*/
|
|
|
|
//onReload: function(oldSessionId, newSessionId) {
|
|
|
|
//}
|
2021-03-01 20:18:12 +03:00
|
|
|
};
|