fluentui-react-native/apps/E2E/wdio.conf.win32.js

231 строка
8.9 KiB
JavaScript
Исходник Обычный вид История

const path = require('path');
const fs = require('fs');
const appPath = path.resolve(path.dirname(require.resolve('@office-iss/rex-win32/rex-win32.js')), 'ReactTest.exe');
const appArgs =
'basePath ' + path.join(__dirname, '..', 'win32', 'dist') + ' plugin defaultplugin bundle index.win32 component FluentTester';
const appDir = path.dirname(require.resolve('@office-iss/rex-win32/rex-win32.js'));
const defaultWaitForTimeout = 20000;
const defaultConnectionRetryTimeout = 60000;
const jasmineDefaultTimeout = 60000; // 60 seconds for Jasmine test timeout
exports.config = {
runner: 'local', // Where should your test be launched
[Win32] Create JS Bundle for E2E Spec Files and Publish as NPM Package (#2345) * Adding package that includes all FURN automated testing dependencies * Adding nuget publish for tester deps * Temporarily post nuget package for testing * Temporarily post nuget package for testing * Removing param * Making param false * Reverting .ado changes and adding fields in package.json * Testing nuget push * Adding yarn.lock * Revert "Adding yarn.lock" This reverts commit 0948725dcff38d5526144a9f5f2e6d77a4d63ff4. * Testing CI * Testing CI * Testing nuget publish * removing publish temporarily * Removing unwanted dep * Updating deps * Adding nuget publish job to ado * Removing unwanted changes * Removing unwanted changes * Removing unwanted changes * Integrating Webpack to create a JS bundle containing all win32 spec files * Creating bundle in publish pipeline so it's included in the npm package * Removing unwanted changes * Reverting unwanted changes * Reverting * Reverting testing change * Reverting newline * Change files * Reverting unnecessary .ado change * Reverting whitespace * Adding build script to /E2E * Moving E2E testing files to its own package within /apps. This allows us to export as an NPM package easier (and allows us to consume the testing code outside of this repo) * Updating pipeline refs to apps/E2E * Adding support for metro within apps/E2E * Fixing imports * Change files * Fixing Win32 wdio.conf.ts specs path * Fix imports * Adding missing dev dep * Updating yarn.lock * Re-creating yarn.lock * Updating yarn conflicts * Fixing links * Adding missing dep * Updating path to no hoisted packages * Fixing package path * Adding condition in BasePage
2022-11-29 06:36:02 +03:00
specs: ['../E2E/src/**/specs/*.win.ts'],
exclude: [],
capabilities: [
{
maxInstances: 1, // Maximum number of total parallel running workers.
platformName: 'windows',
'appium:automationName': 'windows',
'appium:deviceName': 'WindowsPC',
'appium:app': appPath,
'appium:appArguments': appArgs,
'appium:appWorkingDir': appDir,
},
],
/*
** ===============================================================================================
** Test Configurations - Define all options that are relevant for the WebdriverIO instance here
** ===============================================================================================
*/
logLevel: 'info', // Level of logging verbosity: trace | debug | info | warn | error | silent
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).
waitforTimeout: defaultWaitForTimeout, // Default timeout for all waitForXXX commands.
connectionRetryTimeout: defaultConnectionRetryTimeout, // Timeout for any WebDriver request to a driver or grid.
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.
port: 4723, // default appium port
Adding MacOS E2E Testing (#1233) * Yarn * Merge * Fixing repo * Update package * Merge * Removing change file * Tests are running and succeeding, but the import still isn't working. I need to figure out how to import Platform from RN to choose the selector in BasePage * Can't get WDIO to compile TS * Updating WDIO to 6.5.0 * Updating Babel to 6.5.0 and integrating babel config. This should work, but it doesn't * Making mac specific files * Adding macos specific testing specs+page objects * Fixing FocusZone spec for MacOS * Reverting babel files back to original. The change did not work as I expected. * Removing babel dependencies, not needed anymore * Updating babel * Nit changes * Nit comments and removing unnecessary properties * Nit comment * Updating file name+import * Nit changes to WebDriver macos config * Adding MacOS E2E testing to CI pipeline * Change files * Updating file extensions of Windows specific files * Removing Mac2 driver dependency from Win32/Windows package * Removing unneeded package-locl files * Fixing Appium logs * Removing unnecessary dep from webdriver config * Removing dep * Removing dep * Publishing MacOS build artifacts for CI * testing ci * Removing unnecessary step in CI Pipeline * Updating Mac webdriver config file to take screenshots when test fails * Testing CI * Nit fix * Reverting previous change * Macos doesn't have browser.maximize funtionality * Adding create a file functionality for reports * Testing CI Pipeline - Seeing what directories are in /macos/ after E2E Test runs * List contents of errorShots * Reading contents of CI * Testing CI * Testing CI * Finding applications folder * Tesing CI for correct path * Testing * Test * Testing CI * Download tccutil command line tool * Adding xcode to accessibility app permissions * Updating download * Attempting to disable SIP * Removing unnecessary commands from CI * Removing CI changes * Nit styling * Updating MacOS E2E Testubg documentation - How to run the tests locally * Updating yarn.lock * Nit: Spelling
2021-12-17 02:11:01 +03:00
services: [
[
'appium',
{
logPath: './reports/',
},
],
],
framework: 'jasmine',
jasmineOpts: {
defaultTimeoutInterval: jasmineDefaultTimeout,
},
reporters: ['spec'],
autoCompileOpts: {
autoCompile: true,
tsNodeOpts: {
files: true,
},
},
/*
** ===================
** 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
*/
beforeSession: (/* config, capabilities, specs */) => {
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';
process.env['NATIVE_TESTING'] = false;
},
/**
* 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
*/
before: async () => {
await browser.maximizeWindow();
},
/**
* 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).
*/
afterTest: async (test, context, results) => {
const resultString = results.passed ? 'Passed' : 'Failed';
console.log(`\nTest Case: "${test.description}".\nResult: "${resultString}".\nDuration: "${(results.duration / 600).toFixed(2)}s". \n`);
// 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;
}
// build file path
const filePath = './errorShots/ScreenshotOfFailure.png';
/* 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. */
const windowHandles = await browser.getWindowHandles();
if (windowHandles.length > 1) {
/* Switch to the Assert window - Take a screenshot and close the assert */
await browser.switchToWindow(windowHandles[0]);
await browser.saveScreenshot(filePath);
await browser.closeWindow();
/* Switch back to FluentTester and close. The test harness has trouble closing the app when an assert fired */
await browser.switchToWindow(windowHandles[1]);
await browser.closeWindow();
} else {
// save screenshot
await browser.saveScreenshot(filePath);
}
},
/**
* 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
*/
onComplete: (/* exitCode, config, capabilities, results */) => {
console.log('<<< TESTING FINISHED >>>');
},
/**
* 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) {
//}
};