Best JavaScript code snippet using appium-xcuitest-driver
driver.js
Source:driver.js
...248 }249 if (!this.opts.bundleId) {250 this.opts.bundleId = await this.extractBundleId(this.opts.app);251 }252 await this.runReset();253 const startLogCapture = async () => {254 const result = await this.startLogCapture();255 if (result) {256 this.logEvent('logCaptureStarted');257 }258 return result;259 };260 const isLogCaptureStarted = await startLogCapture();261 log.info(`Setting up ${this.isRealDevice() ? 'real device' : 'simulator'}`);262 if (this.isSimulator()) {263 this.localeConfig = await iosSettings.setLocale(this.opts.device, this.opts, {}, this.isSafari());264 await iosSettings.setPreferences(this.opts.device, this.opts, this.isSafari());265 // Cleanup of installd cache helps to save disk space while running multiple tests266 // without restarting the Simulator: https://github.com/appium/appium/issues/9410267 await this.opts.device.clearCaches('com.apple.mobile.installd.staging');268 await this.startSim();269 this.logEvent('simStarted');270 if (!isLogCaptureStarted) {271 // Retry log capture if Simulator was not running before272 await startLogCapture();273 }274 }275 if (this.opts.app) {276 await this.installApp();277 this.logEvent('appInstalled');278 }279 // if we only have bundle identifier and no app, fail if it is not already installed280 if (!this.opts.app && this.opts.bundleId && !this.safari) {281 if (!await this.opts.device.isAppInstalled(this.opts.bundleId)) {282 log.errorAndThrow(`App with bundle identifier '${this.opts.bundleId}' unknown`);283 }284 }285 await SHARED_RESOURCES_GUARD.acquire(XCUITestDriver.name,286 async () => await this.startWda(this.opts.sessionId, realDevice));287 await this.setInitialOrientation(this.opts.orientation);288 this.logEvent('orientationSet');289 if (this.isRealDevice() && this.opts.startIWDP) {290 try {291 await this.startIWDP();292 log.debug(`Started ios_webkit_debug proxy server at: ${this.iwdpServer.endpoint}`);293 } catch (err) {294 log.errorAndThrow(`Could not start ios_webkit_debug_proxy server: ${err.message}`);295 }296 }297 if (this.isSafari() || this.opts.autoWebview) {298 log.debug('Waiting for initial webview');299 await this.navToInitialWebview();300 this.logEvent('initialWebviewNavigated');301 }302 if (!this.isRealDevice()) {303 if (this.opts.calendarAccessAuthorized) {304 await this.opts.device.enableCalendarAccess(this.opts.bundleId);305 } else if (this.opts.calendarAccessAuthorized === false) {306 await this.opts.device.disableCalendarAccess(this.opts.bundleId);307 }308 }309 }310 async startWda (sessionId, realDevice) {311 this.wda = new WebDriverAgent(this.xcodeVersion, this.opts);312 await this.wda.cleanupObsoleteProcesses();313 if (this.opts.useNewWDA) {314 log.debug(`Capability 'useNewWDA' set to true, so uninstalling WDA before proceeding`);315 await this.wda.quit();316 await this.wda.uninstall();317 this.logEvent('wdaUninstalled');318 } else if (!util.hasValue(this.wda.webDriverAgentUrl) && (await this.wda.isRunning())) {319 log.info(`Will reuse previously cached WDA instance at '${this.wda.url.href}'. ` +320 `Set the wdaLocalPort capability to a value different from ${this.wda.url.port} ` +321 `if this is an undesired behavior.`);322 this.wda.webDriverAgentUrl = this.wda.url.href;323 }324 // local helper for the two places we need to uninstall wda and re-start it325 const quitAndUninstall = async (msg) => {326 log.debug(msg);327 log.debug('Quitting and uninstalling WebDriverAgent, then retrying');328 await this.wda.quit();329 await this.wda.uninstall();330 throw new Error(msg);331 };332 const startupRetries = this.opts.wdaStartupRetries || (this.isRealDevice() ? WDA_REAL_DEV_STARTUP_RETRIES : WDA_SIM_STARTUP_RETRIES);333 const startupRetryInterval = this.opts.wdaStartupRetryInterval || WDA_STARTUP_RETRY_INTERVAL;334 await retryInterval(startupRetries, startupRetryInterval, async () => {335 this.logEvent('wdaStartAttempted');336 try {337 this.cachedWdaStatus = await this.wda.launch(sessionId, realDevice);338 } catch (err) {339 this.logEvent('wdaStartFailed');340 let errorMsg = `Unable to launch WebDriverAgent because of xcodebuild failure: "${err.message}".`;341 if (this.isRealDevice()) {342 errorMsg += ` Make sure you follow the tutorial at ${WDA_REAL_DEV_TUTORIAL_URL}. ` +343 `Try to remove the WebDriverAgentRunner application from the device if it is installed ` +344 `and reboot the device.`;345 }346 await quitAndUninstall(errorMsg);347 }348 this.proxyReqRes = this.wda.proxyReqRes.bind(this.wda);349 this.jwpProxyActive = true;350 try {351 await retryInterval(15, 1000, async () => {352 this.logEvent('wdaSessionAttempted');353 log.debug('Sending createSession command to WDA');354 try {355 this.cachedWdaStatus = this.cachedWdaStatus || await this.proxyCommand('/status', 'GET');356 await this.startWdaSession(this.opts.bundleId, this.opts.processArguments);357 } catch (err) {358 log.debug('Failed to create WDA session. Retrying...');359 throw err;360 }361 });362 this.logEvent('wdaSessionStarted');363 } catch (err) {364 let errorMsg = `Unable to start WebDriverAgent session because of xcodebuild failure: "${err.message}".`;365 if (this.isRealDevice()) {366 errorMsg += ` Make sure you follow the tutorial at ${WDA_REAL_DEV_TUTORIAL_URL}. ` +367 `Try to remove the WebDriverAgentRunner application from the device if it is installed ` +368 `and reboot the device.`;369 }370 await quitAndUninstall(errorMsg);371 }372 if (!util.hasValue(this.opts.preventWDAAttachments)) {373 // XCTest prior to Xcode 9 SDK has no native way to disable attachments374 this.opts.preventWDAAttachments = this.xcodeVersion.major < 9;375 if (this.opts.preventWDAAttachments) {376 log.info('Enabled WDA attachments prevention by default to save the disk space. ' +377 'Set preventWDAAttachments capability to false if this is an undesired behavior.');378 }379 }380 if (this.opts.preventWDAAttachments) {381 await adjustWDAAttachmentsPermissions(this.wda, this.opts.preventWDAAttachments ? '555' : '755');382 this.logEvent('wdaPermsAdjusted');383 }384 if (this.opts.clearSystemFiles) {385 await markSystemFilesForCleanup(this.wda);386 }387 // we expect certain socket errors until this point, but now388 // mark things as fully working389 this.wda.fullyStarted = true;390 this.logEvent('wdaStarted');391 });392 }393 // create an alias so we can actually unit test createSession by stubbing394 // this395 async extractBundleId (app) {396 return await appUtils.extractBundleId(app);397 }398 async runReset (opts = null) {399 this.logEvent('resetStarted');400 if (this.isRealDevice()) {401 await runRealDeviceReset(this.opts.device, opts || this.opts);402 } else {403 await runSimulatorReset(this.opts.device, opts || this.opts);404 }405 this.logEvent('resetComplete');406 }407 async deleteSession () {408 await SHARED_RESOURCES_GUARD.acquire(XCUITestDriver.name, async () => {409 await this.stop();410 // reset the permissions on the derived data folder, if necessary411 if (this.opts.preventWDAAttachments) {412 await adjustWDAAttachmentsPermissions(this.wda, '755');413 }414 if (this.opts.clearSystemFiles) {415 await clearSystemFiles(this.wda, !!this.opts.showXcodeLog);416 } else {417 log.debug('Not clearing log files. Use `clearSystemFiles` capability to turn on.');418 }419 });420 if (this.isWebContext()) {421 log.debug('In a web session. Removing remote debugger');422 await this.stopRemote();423 }424 if (this.opts.resetOnSessionStartOnly === false) {425 await this.runReset();426 }427 if (this.isSimulator() && this.opts.udid && this.opts.customSSLCert) {428 await uninstallSSLCert(this.opts.customSSLCert, this.opts.udid);429 }430 if (this.isSimulator() && !this.opts.noReset && !!this.opts.device) {431 if (this.lifecycleData.createSim) {432 await resetXCTestProcesses(this.opts.udid, true);433 log.debug(`Deleting simulator created for this run (udid: '${this.opts.udid}')`);434 await this.opts.device.shutdown();435 await this.opts.device.delete();436 }437 }438 if (!_.isEmpty(this.logs)) {439 this.logs.syslog.stopCapture();440 this.logs = {};441 }442 if (this.iwdpServer) {443 this.stopIWDP();444 }445 if (this.opts.enableAsyncExecuteFromHttps && !this.isRealDevice()) {446 await this.stopHttpsAsyncServer();447 }448 this.resetIos();449 await super.deleteSession();450 }451 async stop () {452 this.jwpProxyActive = false;453 this.proxyReqRes = null;454 if (this.wda && this.wda.fullyStarted) {455 if (this.wda.jwproxy) {456 try {457 await this.proxyCommand(`/session/${this.sessionId}`, 'DELETE');458 } catch (err) {459 // an error here should not short-circuit the rest of clean up460 log.debug(`Unable to DELETE session on WDA: '${err.message}'. Continuing shutdown.`);461 }462 }463 if (this.wda && !this.wda.webDriverAgentUrl && this.opts.useNewWDA) {464 await this.wda.quit();465 }466 }467 }468 async executeCommand (cmd, ...args) {469 log.debug(`Executing command '${cmd}'`);470 if (cmd === 'receiveAsyncResponse') {471 return await this.receiveAsyncResponse(...args);472 }473 // TODO: once this fix gets into base driver remove from here474 if (cmd === 'getStatus') {475 return await this.getStatus();476 }477 return await super.executeCommand(cmd, ...args);478 }479 async configureApp () {480 function appIsPackageOrBundle (app) {481 return (/^([a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+)+$/).test(app);482 }483 // the app name is a bundleId assign it to the bundleId property484 if (!this.opts.bundleId && appIsPackageOrBundle(this.opts.app)) {485 this.opts.bundleId = this.opts.app;486 this.opts.app = '';487 }488 // we have a bundle ID, but no app, or app is also a bundle489 if ((this.opts.bundleId && appIsPackageOrBundle(this.opts.bundleId)) &&490 (this.opts.app === '' || appIsPackageOrBundle(this.opts.app))) {491 log.debug('App is an iOS bundle, will attempt to run as pre-existing');492 return;493 }494 // check for supported build-in apps495 if (this.opts.app && this.opts.app.toLowerCase() === 'settings') {496 this.opts.bundleId = 'com.apple.Preferences';497 this.opts.app = null;498 return;499 } else if (this.opts.app && this.opts.app.toLowerCase() === 'calendar') {500 this.opts.bundleId = 'com.apple.mobilecal';501 this.opts.app = null;502 return;503 }504 try {505 // download if necessary506 this.opts.app = await this.helpers.configureApp(this.opts.app, '.app', this.opts.mountRoot, this.opts.windowsShareUserName, this.opts.windowsSharePassword);507 } catch (err) {508 log.error(err);509 throw new Error(510 `Bad app: ${this.opts.app}. App paths need to be absolute, or relative to the appium ` +511 'server install dir, or a URL to compressed file, or a special app name.');512 }513 }514 async determineDevice () {515 // in the one case where we create a sim, we will set this state516 this.lifecycleData.createSim = false;517 // if we get generic names, translate them518 this.opts.deviceName = await translateDeviceName(this.xcodeVersion, this.opts.platformVersion, this.opts.deviceName);519 // check for a particular simulator520 if (this.opts.udid && (await simExists(this.opts.udid))) {521 const device = await getSimulator(this.opts.udid);522 return {device, realDevice: false, udid: this.opts.udid};523 }524 if (this.opts.udid) {525 if (this.opts.udid.toLowerCase() === 'auto') {526 try {527 this.opts.udid = await detectUdid();528 } catch (err) {529 // Trying to find matching UDID for Simulator530 log.warn(`Cannot detect any connected real devices. Falling back to Simulator. Original error: ${err.message}`);531 const device = await getExistingSim(this.opts);532 if (!device) {533 // No matching Simulator is found. Throw an error534 log.errorAndThrow(`Cannot detect udid for ${this.opts.deviceName} Simulator running iOS ${this.opts.platformVersion}`);535 }536 // Matching Simulator exists and is found. Use it537 this.opts.udid = device.udid;538 return {device, realDevice: false, udid: device.udid};539 }540 } else {541 // make sure it is a connected device. If not, the udid passed in is invalid542 const devices = await getConnectedDevices();543 log.debug(`Available devices: ${devices.join(', ')}`);544 if (devices.indexOf(this.opts.udid) === -1) {545 throw new Error(`Unknown device or simulator UDID: '${this.opts.udid}'`);546 }547 }548 const device = await getRealDeviceObj(this.opts.udid);549 return {device, realDevice: true, udid: this.opts.udid};550 }551 // figure out the correct simulator to use, given the desired capabilities552 let device = await getExistingSim(this.opts);553 // check for an existing simulator554 if (device) {555 return {device, realDevice: false, udid: device.udid};556 }557 // no device of this type exists, so create one558 log.info('Simulator udid not provided, using desired caps to create a new simulator');559 if (!this.opts.platformVersion) {560 log.info(`No platformVersion specified. Using latest version Xcode supports: '${this.iosSdkVersion}' ` +561 `This may cause problems if a simulator does not exist for this platform version.`);562 this.opts.platformVersion = this.iosSdkVersion;563 }564 if (this.opts.noReset) {565 // Check for existing simulator just with correct capabilities566 let device = await getExistingSim(this.opts);567 if (device) {568 return {device, realDevice: false, udid: device.udid};569 }570 }571 device = await this.createSim();572 return {device, realDevice: false, udid: device.udid};573 }574 async startSim () {575 const runOpts = {576 scaleFactor: this.opts.scaleFactor,577 connectHardwareKeyboard: !!this.opts.connectHardwareKeyboard,578 isHeadless: !!this.opts.isHeadless,579 devicePreferences: {},580 };581 // add the window center, if it is specified582 if (this.opts.SimulatorWindowCenter) {583 runOpts.devicePreferences.SimulatorWindowCenter = this.opts.SimulatorWindowCenter;584 }585 // This is to workaround XCTest bug about changing Simulator586 // orientation is not synchronized to the actual window orientation587 const orientation = _.isString(this.opts.orientation) && this.opts.orientation.toUpperCase();588 switch (orientation) {589 case 'LANDSCAPE':590 runOpts.devicePreferences.SimulatorWindowOrientation = 'LandscapeLeft';591 runOpts.devicePreferences.SimulatorWindowRotationAngle = 90;592 break;593 case 'PORTRAIT':594 runOpts.devicePreferences.SimulatorWindowOrientation = 'Portrait';595 runOpts.devicePreferences.SimulatorWindowRotationAngle = 0;596 break;597 }598 await this.opts.device.run(runOpts);599 }600 async createSim () {601 this.lifecycleData.createSim = true;602 // create sim for caps603 let sim = await createSim(this.opts, this.sessionId);604 log.info(`Created simulator with udid '${sim.udid}'.`);605 return sim;606 }607 async launchApp () {608 const APP_LAUNCH_TIMEOUT = 20 * 1000;609 this.logEvent('appLaunchAttempted');610 await launch(this.opts.device.udid, this.opts.bundleId);611 let checkStatus = async () => {612 let response = await this.proxyCommand('/status', 'GET');613 let currentApp = response.currentApp.bundleID;614 if (currentApp !== this.opts.bundleId) {615 throw new Error(`${this.opts.bundleId} not in foreground. ${currentApp} is in foreground`);616 }617 };618 log.info(`Waiting for '${this.opts.bundleId}' to be in foreground`);619 let retries = parseInt(APP_LAUNCH_TIMEOUT / 200, 10);620 await retryInterval(retries, 200, checkStatus);621 log.info(`${this.opts.bundleId} is in foreground`);622 this.logEvent('appLaunched');623 }624 async startWdaSession (bundleId, processArguments) {625 let args = processArguments ? processArguments.args : [];626 let env = processArguments ? processArguments.env : {};627 let shouldWaitForQuiescence = util.hasValue(this.opts.waitForQuiescence) ? this.opts.waitForQuiescence : true;628 let maxTypingFrequency = util.hasValue(this.opts.maxTypingFrequency) ? this.opts.maxTypingFrequency : 60;629 let shouldUseSingletonTestManager = util.hasValue(this.opts.shouldUseSingletonTestManager) ? this.opts.shouldUseSingletonTestManager : true;630 let shouldUseTestManagerForVisibilityDetection = false;631 if (util.hasValue(this.opts.simpleIsVisibleCheck)) {632 shouldUseTestManagerForVisibilityDetection = this.opts.simpleIsVisibleCheck;633 }634 if (!isNaN(parseFloat(this.opts.platformVersion)) && parseFloat(this.opts.platformVersion).toFixed(1) === '9.3') {635 log.info(`Forcing shouldUseSingletonTestManager capability value to true, because of known XCTest issues under 9.3 platform version`);636 shouldUseTestManagerForVisibilityDetection = true;637 }638 if (util.hasValue(this.opts.language)) {639 args.push('-AppleLanguages', `(${this.opts.language})`);640 args.push('-NSLanguages', `(${this.opts.language})`);641 }642 if (util.hasValue(this.opts.locale)) {643 args.push('-AppleLocale', this.opts.locale);644 }645 let desired = {646 desiredCapabilities: {647 bundleId,648 arguments: args,649 environment: env,650 shouldWaitForQuiescence,651 shouldUseTestManagerForVisibilityDetection,652 maxTypingFrequency,653 shouldUseSingletonTestManager,654 }655 };656 await this.proxyCommand('/session', 'POST', desired);657 }658 // Override Proxy methods from BaseDriver659 proxyActive () {660 return this.jwpProxyActive;661 }662 getProxyAvoidList () {663 if (this.isWebview()) {664 return NO_PROXY_WEB_LIST;665 }666 return NO_PROXY_NATIVE_LIST;667 }668 canProxy () {669 return true;670 }671 isSafari () {672 return !!this.safari;673 }674 isRealDevice () {675 return this.opts.realDevice;676 }677 isSimulator () {678 return !this.opts.realDevice;679 }680 isWebview () {681 return this.isSafari() || this.isWebContext();682 }683 validateLocatorStrategy (strategy) {684 super.validateLocatorStrategy(strategy, this.isWebContext());685 }686 validateDesiredCaps (caps) {687 // check with the base class, and return if it fails688 let res = super.validateDesiredCaps(caps);689 if (!res) {690 return res;691 }692 // make sure that the capabilities have one of `app` or `bundleId`693 if ((caps.browserName || '').toLowerCase() !== 'safari' &&694 !caps.app && !caps.bundleId) {695 let msg = 'The desired capabilities must include either an app or a bundleId for iOS';696 log.errorAndThrow(msg);697 }698 let verifyProcessArgument = (processArguments) => {699 if (!_.isNil(processArguments.args) && !_.isArray(processArguments.args)) {700 log.errorAndThrow('processArguments.args must be an array of string');701 }702 if (!_.isNil(processArguments.env) && !_.isObject(caps.processArguments.env)) {703 log.errorAndThrow('processArguments.env must be an object <key,value> pair {a:b, c:d}');704 }705 };706 // `processArguments` should be JSON string or an object with arguments and/ environment details707 if (caps.processArguments) {708 if (_.isString(caps.processArguments)) {709 try {710 // try to parse the string as JSON711 caps.processArguments = JSON.parse(caps.processArguments);712 verifyProcessArgument(caps.processArguments);713 } catch (err) {714 log.errorAndThrow(`processArguments must be a json format or an object with format {args : [], env : {a:b, c:d}}. Both environment and argument can be null. Error: ${err}`);715 }716 } else if (_.isObject(caps.processArguments)) {717 verifyProcessArgument(caps.processArguments);718 } else {719 log.errorAndThrow('processArguments must be an object, or a string JSON object with format {args : [], env : {a:b, c:d}}. Both environment and argument can be null.');720 }721 }722 // there is no point in having `keychainPath` without `keychainPassword`723 if ((caps.keychainPath && !caps.keychainPassword) || (!caps.keychainPath && caps.keychainPassword)) {724 log.errorAndThrow(`If 'keychainPath' is set, 'keychainPassword' must also be set (and vice versa).`);725 }726 if (caps.autoAcceptAlerts || caps.autoDismissAlerts) {727 log.warn(`The capabilities 'autoAcceptAlerts' and 'autoDismissAlerts' ` +728 `do not work for XCUITest-based tests. Please adjust your ` +729 `alert handling accordingly.`);730 }731 // `resetOnSessionStartOnly` should be set to true by default732 this.opts.resetOnSessionStartOnly = !util.hasValue(this.opts.resetOnSessionStartOnly) || this.opts.resetOnSessionStartOnly;733 this.opts.useNewWDA = util.hasValue(this.opts.useNewWDA) ? this.opts.useNewWDA : false;734 // finally, return true since the superclass check passed, as did this735 return true;736 }737 async installApp () {738 if (this.isSafari()) {739 return;740 }741 // if user has passed in desiredCaps.autoLaunch = false742 // meaning they will manage app install / launching743 if (this.opts.autoLaunch === false) {744 return;745 }746 if (this.isRealDevice()) {747 await installToRealDevice (this.opts.device, this.opts.app, this.opts.bundleId, this.opts.noReset);748 } else {749 await installToSimulator(this.opts.device, this.opts.app, this.opts.bundleId, this.opts.noReset);750 }751 if (util.hasValue(this.opts.iosInstallPause)) {752 // https://github.com/appium/appium/issues/6889753 let pause = parseInt(this.opts.iosInstallPause, 10);754 log.debug(`iosInstallPause set. Pausing ${pause} ms before continuing`);755 await B.delay(pause);756 }757 }758 async setInitialOrientation (orientation) {759 if (!_.isString(orientation)) {760 log.info('Skipping setting of the initial display orientation. ' +761 'Set the "orientation" capability to either "LANDSCAPE" or "PORTRAIT", if this is an undesired behavior.');762 return;763 }764 orientation = orientation.toUpperCase();765 if (!_.includes(['LANDSCAPE', 'PORTRAIT'], orientation)) {766 log.debug(`Unable to set initial orientation to '${orientation}'`);767 return;768 }769 log.debug(`Setting initial orientation to '${orientation}'`);770 try {771 await this.proxyCommand('/orientation', 'POST', {orientation});772 this.opts.curOrientation = orientation;773 } catch (err) {774 log.warn(`Setting initial orientation failed with: ${err.message}`);775 }776 }777 _getCommandTimeout (cmdName) {778 this.opts.commandTimeouts = normalizeCommandTimeouts(this.opts.commandTimeouts);779 if (this.opts.commandTimeouts) {780 if (cmdName && _.has(this.opts.commandTimeouts, cmdName)) {781 return this.opts.commandTimeouts[cmdName];782 }783 return this.opts.commandTimeouts[DEFAULT_TIMEOUT_KEY];784 }785 }786 /**787 * Get session capabilities merged with what WDA reports788 * This is a library command but needs to call 'super' so can't be on789 * a helper object790 */791 async getSession () {792 // call super to get event timings, etc...793 let driverSession = await super.getSession();794 let wdaCaps = await this.proxyCommand('/', 'GET');795 log.info("Merging WDA caps over Appium caps for session detail response");796 return Object.assign({udid: this.opts.udid}, driverSession, wdaCaps.capabilities);797 }798 async startIWDP () {799 this.logEvent('iwdpStarting');800 this.iwdpServer = new IWDP(this.opts.webkitDebugProxyPort, this.opts.udid);801 await this.iwdpServer.start();802 this.logEvent('iwdpStarted');803 }804 async stopIWDP () {805 if (this.iwdpServer) {806 await this.iwdpServer.stop();807 delete this.iwdpServer;808 }809 }810 async reset () {811 if (this.opts.noReset) {812 // This is to make sure reset happens even if noReset is set to true813 let opts = _.cloneDeep(this.opts);814 opts.noReset = false;815 opts.fullReset = false;816 const shutdownHandler = this.resetOnUnexpectedShutdown;817 this.resetOnUnexpectedShutdown = () => {};818 try {819 await this.runReset(opts);820 } finally {821 this.resetOnUnexpectedShutdown = shutdownHandler;822 }823 }824 await super.reset();825 }826}827for (let [cmd, fn] of _.toPairs(commands)) {828 XCUITestDriver.prototype[cmd] = fn;829}830export default XCUITestDriver;...
build.js
Source:build.js
1'use strict';2const { debug, print, strong, warn } = require('./utils/cnsl');3const { filepathName, findUniqueFilepath, isUniqueFilepath } = require('./utils/filepath');4const { maxInputStringLength, recommendedFileSizeLimit } = require('./settings');5const { truncate } = require('./utils/string');6const callable = require('./utils/callable');7const chalk = require('chalk');8const env = require('./utils/env');9const flatten = require('lodash/flatten');10const fs = require('fs');11const match = require('minimatch');12const parallel = require('async/parallel');13const path = require('path');14const prettyBytes = require('pretty-bytes');15const series = require('async/series');16const stopwatch = require('./utils/stopwatch');17const unique = require('lodash/uniq');18const waterfall = require('async/waterfall');19const zlib = require('zlib');20const RE_GENERATED_SHARED = /common|shared/;21/**22 * Build instance factory23 * @param {Object} props24 * - {Boolean} batch25 * - {Boolean} boilerplate26 * - {Boolean} bootstrap27 * - {Boolean} [browser]28 * - {Boolean} bundle29 * - {FileCache} [fileCache]30 * - {Function} [fileFactory]31 * - {String} generatedInputPattern32 * - {Number} index33 * - {String} input34 * - {Array} inputpaths35 * - {Boolean} [isAppServer]36 * - {Boolean} [isDynamicBuild]37 * - {Boolean} [isGeneratedBuild]38 * - {String} label39 * - {Number} level40 * - {String} output41 * - {Array} outputpaths42 * - {Build} parent43 * - {Object} runtimeOptions44 * - {String} type45 * - {Boolean} watchOnly46 * @returns {Build}47 */48module.exports = function buildFactory(props) {49 return new Build(props);50};51class Build {52 /**53 * Constructor54 * @param {Object} props55 * - {Boolean} batch56 * - {Boolean} boilerplate57 * - {Boolean} bootstrap58 * - {Boolean} [browser]59 * - {Boolean} bundle60 * - {FileCache} [fileCache]61 * - {Function} [fileFactory]62 * - {String} generatedInputPattern63 * - {Number} index64 * - {String} input65 * - {Array} inputpaths66 * - {Boolean} [isAppServer]67 * - {Boolean} [isDynamicBuild]68 * - {Boolean} [isGeneratedBuild]69 * - {String} label70 * - {Number} level71 * - {String} output72 * - {Array} outputpaths73 * - {Build} parent74 * - {Object} runtimeOptions75 * - {String} type76 * - {Boolean} watchOnly77 */78 constructor(props) {79 Object.assign(this, props);80 this.builds = [];81 this.childInputpaths = [];82 this.id = this.label || (this.index != null && this.index.toString());83 this.inputFiles = [];84 this.processFilesOptions = {};85 this.referencedFiles = [];86 this.results = [];87 this.timerID = this.inputpaths[0];88 this.outputFiles = [];89 this.printPrefix = new Array(this.level + 1).join('\u2219');90 // Handle printing long input/output arrays91 this.inputString = generatePathString(this.inputpaths);92 this.outputString = generatePathString(this.outputpaths);93 debug(`created Build instance with input: ${strong(this.inputString)} and output: ${strong(this.output)}`, 2);94 }95 /**96 * Determine if 'filepath' is a referenced file (child targets included)97 * @param {String} filepath98 * @returns {Boolean}99 */100 hasFile(filepath) {101 if (this.referencedFiles.some(refFile => refFile.filepath == filepath)) return true;102 if (this.builds.length) return this.builds.some(build => build.hasFile(filepath));103 return false;104 }105 /**106 * Run build107 * @param {Function} fn(err, results)108 */109 run(fn) {110 waterfall([callable(this, 'runProcess'), callable(this, 'runWrite'), callable(this, 'runReset')], fn);111 }112 /**113 * Run processing tasks114 * @param {Function} fn(err)115 */116 runProcess(fn) {117 waterfall(118 [119 // Initialize120 callable(this, 'init'),121 // Process input files122 callable(this, 'processFiles' /* , files */),123 // Print process progress124 callable(this, 'printProcessProgress' /* , referencedFiles */),125 // Print process progress126 callable(this, 'runProcessForChildren' /* , referencedFiles */),127 // Process generated build128 callable(this, 'processGeneratedBuild'),129 // Pre-process output files130 callable(this, 'preProcessWriteFiles')131 ],132 fn133 );134 }135 /**136 * Run write tasks137 * @param {Function} fn(err)138 */139 runWrite(fn) {140 waterfall(141 [142 // Write files143 callable(this, 'writeFiles', this.outputFiles),144 // Build child targets145 callable(this, 'runWriteForChildren' /* , referencedFiles, results */)146 ],147 fn148 );149 }150 /**151 * Run reset tasks152 * @param {Function} fn(err, results)153 */154 runReset(fn) {155 waterfall(156 [157 // Reset158 callable(this, 'reset', this.results),159 // Build child targets160 callable(this, 'runResetForChildren' /* , results */),161 // Write file progress162 callable(this, 'printWriteProgress' /* , results */)163 ],164 fn165 );166 }167 /**168 * Initialize state before run169 * @param {Function} fn(err, files)170 * @returns {null}171 */172 init(fn) {173 let type = this.watchOnly && this.runtimeOptions.watch ? 'watching' : 'building';174 if (this.isDynamicBuild) type += ' dynamic';175 this.inputFiles = [];176 this.referencedFiles = [];177 this.results = [];178 this.outputFiles = [];179 this.processFilesOptions = {180 batch: !this.bundle && this.batch,181 boilerplate: this.boilerplate,182 bootstrap: this.bootstrap,183 browser: this.browser,184 bundle: this.bundle,185 compress: this.runtimeOptions.compress,186 // TODO: only include helpers in root? Difficult on watch187 helpers: true,188 ignoredFiles: this.childInputpaths,189 importBoilerplate: false,190 watchOnly: this.watchOnly191 };192 stopwatch.start(this.timerID);193 // Skip if watch only and not running a watch build194 if (this.watchOnly && !this.runtimeOptions.watch) return fn(null, []);195 if (this.isGeneratedBuild) {196 print(`${this.printPrefix} ${type} ${strong(this.outputString)}`, 1);197 } else {198 print(199 `${this.printPrefix} ${type} ${strong(this.inputString)} ${this.outputString ? 'to ' + strong(this.outputString) : ''}`,200 1201 );202 }203 fn(204 null,205 this.inputpaths.reduce(206 (files, filepath) => {207 const file = this.fileFactory(filepath);208 if (!file) {209 warn(`${strong(filepath)} not found in project source`, 1);210 } else {211 // Force for dynamic builds212 file.options = this.fileFactoryOptions;213 files.push(file);214 this.inputFiles.push(file);215 }216 return files;217 },218 []219 )220 );221 }222 /**223 * Process 'files'224 * @param {Array} files225 * @param {Function} fn(err, files)226 */227 processFiles(files, fn) {228 env('INPUT', files, this.id);229 env('INPUT_HASH', files, this.id);230 env('INPUT_DATE', files, this.id);231 parallel(files.map(file => callable(file, 'run', 'standard', this.processFilesOptions)), err => {232 if (err) return fn(err);233 this.referencedFiles = files.reduce(234 (referencedFiles, file) => {235 referencedFiles.push(file);236 file.getAllDependencies().forEach(dependency => {237 if (!referencedFiles.includes(dependency)) referencedFiles.push(dependency);238 });239 return referencedFiles;240 },241 []242 );243 fn(null, this.referencedFiles);244 });245 }246 /**247 * Print progress248 * @param {Array} files249 * @param {Function} fn(err, files)250 */251 printProcessProgress(files, fn) {252 if (files.length) {253 print(254 '[processed ' +255 strong(files.length) +256 (files.length > 1 ? ' files' : ' file') +257 ' in ' +258 chalk.cyan(stopwatch.stop(this.timerID, true)) +259 ']',260 2 + this.printPrefix.length261 );262 }263 fn(null, files);264 }265 /**266 * Run processing for child builds267 * @param {Array} files268 * @param {Function} fn(err)269 * @returns {null}270 */271 runProcessForChildren(files, fn) {272 if (!this.builds.length) return fn();273 // Lock files to prevent inclusion in downstream targets274 this.lock(this.referencedFiles);275 series(this.builds.map(build => callable(build, 'runProcess')), (err, childFiles) => {276 if (err) return fn(err);277 this.unlock(this.referencedFiles);278 fn();279 });280 }281 /**282 * Process generated build based on children283 * @param {Function} fn(err)284 * @returns {null}285 */286 processGeneratedBuild(fn) {287 if (!this.isGeneratedBuild) return fn();288 const dummyFile = this.inputFiles[0];289 let matchingFiles = [];290 function getFiles(builds) {291 return builds.reduce(292 (files, build) => {293 files.push(294 ...build.inputFiles.reduce(295 (files, file) => {296 // Use dependencyReferences to include those missing from dependencies due to locking etc.297 return files.concat(298 ...file.dependencyReferences299 .filter(reference => reference.file != null)300 .map(reference => reference.file)301 );302 },303 []304 )305 );306 // Traverse children307 if (build.builds.length) files.push(...getFiles(build.builds));308 return files;309 },310 []311 );312 }313 if (RE_GENERATED_SHARED.test(this.generatedInputPattern)) {314 const seen = {};315 // Recursively generate 1D array of all inputFiles dependencies316 matchingFiles = getFiles(this.builds)317 // Include all files with at least 1 other match318 .reduce(319 (matchingFiles, file) => {320 if (!(file.id in seen)) {321 seen[file.id] = 1;322 } else if (!matchingFiles.includes(file)) {323 matchingFiles.push(file);324 }325 return matchingFiles;326 },327 []328 );329 } else {330 matchingFiles = unique(getFiles(this.builds)).filter(file =>331 match(file.filepath, this.generatedInputPattern, { matchBase: true, nocase: true }));332 }333 // Generate dummy dependency references334 const matchingDependencies = matchingFiles.map(file => {335 file.isDependency = false;336 return { filepath: file.filepath };337 });338 dummyFile.allDependencies = (dummyFile.allDependencyReferences = null);339 dummyFile.addDependencies(matchingDependencies, this.processFilesOptions);340 dummyFile.getAllDependencies().forEach(dependency => {341 if (!this.referencedFiles.includes(dependency)) this.referencedFiles.push(dependency);342 });343 fn();344 }345 /**346 * Pre-process write files347 * @param {Function} fn(err)348 */349 preProcessWriteFiles(fn) {350 this.outputFiles = this.inputFiles.filter(file => file.isWriteable(this.processFilesOptions.batch)).reduce((351 outputFiles,352 file,353 idx354 ) => {355 let filepath = '';356 this.inputpaths.some((inputpath, idx) => {357 if (inputpath == file.filepath) {358 filepath = this.outputpaths[idx];359 return true;360 }361 });362 // Don't write if no output path363 if (filepath) {364 // Handle generating unique paths365 if (isUniqueFilepath(filepath)) {366 // Remove existing367 const existing = findUniqueFilepath(filepath);368 if (existing) {369 try {370 fs.unlinkSync(existing);371 } catch (err) {372 /* ignore */373 }374 }375 }376 file.prepareForWrite(filepath, this.processFilesOptions);377 outputFiles.push(file);378 env('OUTPUT', file, this.id);379 env('OUTPUT_HASH', file, this.id);380 env('OUTPUT_DATE', file, this.id);381 env('OUTPUT_URL', file, this.id);382 }383 return outputFiles;384 }, []);385 fn(null);386 }387 /**388 * Write content for 'files'389 * @param {Array} files390 * @param {Function} fn(err, files, results)391 */392 writeFiles(files, fn) {393 const writeable = files.map(file => callable(file, 'write', this.processFilesOptions));394 // Results are [{ filepath, content, type }]395 parallel(writeable, (err, results) => {396 if (err) return fn(err);397 this.results = results;398 this.results.forEach(result => {399 result.printPrefix = this.printPrefix;400 });401 fn(null, files, results);402 });403 }404 /**405 * Run write for child builds406 * @param {Array} files407 * @param {Array} results408 * @param {Function} fn(err)409 * @returns {null}410 */411 runWriteForChildren(files, results, fn) {412 if (!this.builds.length) return fn();413 // Lock files to prevent inclusion in downstream targets414 this.lock(this.referencedFiles);415 series(this.builds.map(build => callable(build, 'runWrite')), (err, childResults) => {416 if (err) return fn(err);417 this.unlock(this.referencedFiles);418 fn();419 });420 }421 /**422 * Reset input files423 * @param {Array} results424 * @param {Array} fn(err, results)425 */426 reset(results, fn) {427 this.referencedFiles.forEach(file => file.reset());428 fn(null, results);429 }430 /**431 * Run reset for child builds432 * @param {Array} results433 * @param {Array} fn(err, results)434 * @returns {null}435 */436 runResetForChildren(results, fn) {437 if (!this.builds.length) return fn(null, results);438 series(this.builds.map(build => callable(build, 'runReset')), (err, childResults) => {439 if (err) return fn(err);440 fn(null, results.concat(flatten(childResults || [])));441 });442 }443 /**444 * Print progress445 * @param {Array} results446 * @param {Function} fn(err, results)447 * @returns {null}448 */449 printWriteProgress(results, fn) {450 if (this.parent) return fn(null, results);451 const prints = results.slice().reverse().map(result => {452 return callable(453 printResult,454 null,455 result,456 this.runtimeOptions.deploy,457 this.runtimeOptions.compress,458 result.printPrefix459 );460 });461 parallel(prints, err => {462 fn(err, results);463 });464 }465 /**466 * Set lock flag for 'files'467 * @param {Array} files468 */469 lock(files) {470 files.forEach(file => {471 file.isLocked = true;472 });473 }474 /**475 * Unset lock flag for 'files'476 * @param {Array} files477 */478 unlock(files) {479 files.forEach(file => {480 file.isLocked = false;481 });482 }483}484/**485 * Generate path string for 'paths'486 * @param {Array} paths487 * @returns {String}488 */489function generatePathString(paths) {490 let pathString = '';491 if (!paths || !paths.length) return pathString;492 if (paths.length > 1) {493 pathString = paths.map(pathItem => filepathName(pathItem));494 // Trim long lists495 if (pathString.length > maxInputStringLength) {496 const remainder = pathString.length - maxInputStringLength;497 pathString = `${pathString498 .slice(0, maxInputStringLength)499 .join(', ')} ...and ${remainder} other${remainder > 1 ? 's' : ''}`;500 } else {501 pathString = pathString.join(', ');502 }503 } else {504 pathString = filepathName(paths[0]);505 }506 return pathString;507}508/**509 * Print 'result'510 * @param {Object} result511 * @param {Boolean} isDeploy512 * @param {Boolean} isCompressed513 * @param {String} prefix514 * @param {Function} fn515 */516function printResult(result, isDeploy, isCompressed, prefix, fn) {517 const relpath = truncate(path.relative(process.cwd(), result.filepath));518 if ((result.type == 'js' || result.type == 'css') && isDeploy) {519 zlib.gzip(result.content, (err, buffer) => {520 if (err) return fn(err);521 const stat = fs.statSync(result.filepath);522 const bytes = stat.size;523 const over = bytes > recommendedFileSizeLimit;524 const overZipped = buffer.length > recommendedFileSizeLimit;525 print(chalk.green(`${chalk.green(prefix)} built and compressed ${strong(relpath)}`), 1);526 print(`[compressed size: ${chalk[over ? 'red' : 'green'](prettyBytes(bytes))}]`, 2 + prefix.length);527 print(`[gzipped size: ${chalk[overZipped ? 'red' : 'green'](prettyBytes(buffer.length))}]`, 2 + prefix.length);528 if (over || overZipped) {529 warn(530 `the output file exceeds the recommended ${strong(prettyBytes(recommendedFileSizeLimit))} size`,531 2 + prefix.length532 );533 print(534 'Consider splitting into smaller bundles to help improve browser startup execution time',535 2 + prefix.length536 );537 }538 fn();539 });540 } else {541 print(chalk.green(`${chalk.green(prefix)} built${isCompressed ? ' and compressed' : ''} ${strong(relpath)}`), 1);542 fn();543 }...
labs.js
Source:labs.js
...52 else53 {54 if(Memory.rooms[roomName].lab.reset)55 {56 this.runReset(roomName)57 return58 }59 sourceLab1 = Game.getObjectById(Memory.rooms[roomName].lab.source1)60 sourceLab2 = Game.getObjectById(Memory.rooms[roomName].lab.source2)61 for(labIdx in Memory.rooms[roomName].lab.producers)62 {63 labId = Memory.rooms[roomName].lab.producers[labIdx]64 lab = Game.getObjectById(labId)65 lab.runReaction(sourceLab1, sourceLab2)66 }67 }68 },69 decideReaction(roomName)70 {...
roleLabSupplier.js
Source:roleLabSupplier.js
...45 }46 var labInfo = labs.getLabInfo(creep.memory.home)47 if(labInfo.reset)48 {49 this.runReset(creep)50 return51 }52 var container = labs.getContainer(creep.memory.home)53 var reaction = labs.getReaction(creep.memory.home)54 var boost1 = labs.getBoost1(creep.memory.home)55 var boost2 = labs.getBoost2(creep.memory.home)56 if(!container || !reaction)57 {58 labPos = labs.getLabPosition(creep.memory.home)59 if(creep.pos.x != labPos.x || creep.pos.y!=labPos.y)60 {61 creep.moveTo(labPos)62 }63 return...
square-grid.js
Source:square-grid.js
1import React, { Component } from 'react'2import '../styles/square-grid.css'3import '../styles/square.css'4import '../styles/button-grid.css'5import '../styles/button.css'6class SquareGrid extends Component {7 constructor() {8 super()9 this.state = {10 sqrA: 'white',11 sqrB: 'white',12 sqrC: 'white',13 sqrD: 'white',14 color: '',15 colors: []16 }17 this.makeBlack = this.makeBlack.bind(this)18 }19 makeBlack = () => {20 if(this.state.sqrA !== '#222f3e'){21 this.setState({22 sqrA: '#222f3e',23 sqrB: '#222f3e',24 sqrC: '#222f3e',25 sqrD: '#222f3e'26 })27 } else {28 this.setState({29 sqrA: 'white',30 sqrB: 'white',31 sqrC: 'white',32 sqrD: 'white'33 })34 }35 }36 makePurple = () => {37 this.setState({38 sqrA: '#5f27cd',39 sqrB: '#5f27cd'40 })41 }42 makeBottomLeftBlue = () => {43 this.setState({sqrC: '#54a0ff'})44 }45 makeBottomRightBlue = () => {46 this.setState({sqrD: '#54a0ff'})47 }48 topLeft = () => {49 this.setState({sqrA: '#ee5253'})50 }51 topRight = () => {52 this.setState({sqrB: '#00d2d3'})53 }54 bottomLeft = () => {55 this.setState({sqrC: '#10ac84'})56 }57 bottomRight = () => {58 this.setState({sqrD: '#feca57'})59 }60 handleChange = e => {61 this.setState({color: e.target.value})62 }63 handleSubmit = e => {64 e.preventDefault();65 this.setState(prevState => {66 console.log(prevState.color)67 return {68 colors: [prevState.color,...prevState.colors]69 }70 }, () => {71 console.log(this.state.colors)72 73 })74 75 }76 runColors = () => {77 this.intervalId = setInterval(this.startColors, 1000)78 }79 startColors = () => {80 let a = Math.floor(Math.random() * this.state.colors.length)81 let b = Math.floor(Math.random() * this.state.colors.length)82 let c = Math.floor(Math.random() * this.state.colors.length)83 let d = Math.floor(Math.random() * this.state.colors.length)84 this.setState({85 sqrA: this.state.colors[a],86 sqrB: this.state.colors[b],87 sqrC: this.state.colors[c],88 sqrD: this.state.colors[d]89 })90 }91 stopColors = () => {92 clearInterval(this.intervalId)93 }94 runReset = () => {95 this.setState({colors: []})96 }97 render() {98 const styles = {99 sqrA: {100 backgroundColor: this.state.sqrA101 },102 sqrB: {103 backgroundColor: this.state.sqrB104 },105 sqrC: {106 backgroundColor: this.state.sqrC107 },108 sqrD: {109 backgroundColor: this.state.sqrD110 }111 }112 return (113 <div>114 <div className='square-grid'>115 <div className='square-single sqrA' style={styles.sqrA}></div>116 <div className='square-single sqrA' style={styles.sqrB}></div>117 <div className='square-single sqrA' style={styles.sqrC}></div>118 <div className='square-single sqrA' style={styles.sqrD}></div>119 </div>120 <div className='button-grid'>121 <button className="btn" onClick={this.makeBlack}>black</button>122 <button className="btn" onClick={this.makePurple}>purple</button>123 <button className="btn" onClick={this.makeBottomLeftBlue}>blue</button>124 <button className="btn" onClick={this.makeBottomRightBlue}>blue</button>125 <button className="btn" onClick={this.topLeft}>red</button>126 <button className="btn" onClick={this.topRight}>aqua</button>127 <button className="btn" onClick={this.bottomLeft}>green</button>128 <button className="btn" onClick={this.bottomRight}>yellow</button>129 </div>130 <div className='custom-grid'>131 <form onSubmit={this.handleSubmit}>132 <input type="text" name='color' placeholder='enter color' value={this.state.color} onChange={this.handleChange}/>133 <button>submit</button>134 </form>135 <button onClick={this.runColors}>Start Colors</button>136 <button onClick={this.stopColors}>Stop Colors</button>137 <button onClick={this.runReset}>Reset</button>138 </div>139 </div>140 )141 }142}...
roleLabAssistant.js
Source:roleLabAssistant.js
...59 }60 var labInfo = labs.getLabInfo(creep.memory.home)61 if(labInfo.reset)62 {63 this.runReset(creep)64 return65 }66 var source1 = Game.getObjectById(labInfo.source1)67 var source2 = Game.getObjectById(labInfo.source2)68 //Todo, add code to empty incorrect resources out of sourceLabs69 if(source1.store[reaction.chem1]<2500&& (container.store[reaction.chem1]>0 || creep.store[reaction.chem1]>0))70 {71 if(!creep.pos.isNearTo(container))72 {73 creep.moveTo(container)74 return75 }76 creep.moveTo(source1)77 creep.withdraw(container, reaction.chem1)...
ResetPassword.js
Source:ResetPassword.js
...57 <Text style={{marginLeft:30,marginRight:30}}>{getLabel("Yêu cầu khôi phục máºt khẩu")}</Text>58 </Button>59 </View>60 </Form>61 <GoogleReCaptchaModal onSuccess={(_token)=>this.runReset(_token)} ref={_ref=>this.verifyCaptcha = _ref}/>62 {this.state.running?63 <View style={loading}>64 <ActivityIndicator />65 </View>66 :null67 }68 </KeyboardAvoidingContent>69 </Content>70 <Footer path="User" navigation={this.props.navigation}/>71 </Container>72 );73 }...
refreshCommand.js
Source:refreshCommand.js
...20 let $step = this.input.getOption('step') || 1;21 if ($step > 1) {22 await this.runRollback($database, $path, $step);23 } else {24 await this.runReset($database, $path);25 }26 await this.callCommand('migrate', Object.filter({27 '--database': $database,28 '--path': $path,29 '--realpath': this.input.getOption('realpath'),30 '--force': true,31 }));32 if (this.needsSeeding()) {33 this.runSeeder($database);34 }35 return 0;36 }37 runRollback($database, $path, $step) {38 return this.callCommand('migrate:rollback', Object.filter({...
Using AI Code Generation
1const path = require('path');2const wd = require('wd');3const chai = require('chai');4const chaiAsPromised = require('chai-as-promised');5const { XCUITestDriver } = require('appium-xcuitest-driver');6chai.should();7chai.use(chaiAsPromised);8const PORT = 4723;9const HOST = 'localhost';10const BUNDLE_ID = 'com.my.app';11const DEVICE_UDID = 'my-udid';12const DEVICE_NAME = 'my-device-name';13const PLATFORM_VERSION = '12.1';14const PLATFORM_NAME = 'iOS';15const DEVICE_ORIENTATION = 'PORTRAIT';16const APP = path.resolve(__dirname, 'my-app.app');17const driver = wd.promiseChainRemote(HOST, PORT);18const xcuitestDriver = new XCUITestDriver({port: PORT, host: HOST});19const desiredCaps = {20};21describe('Appium XCUITest Driver', () => {22 before(async () => {23 await xcuitestDriver.createSession(desiredCaps);24 });25 it('should reset the app', async () => {26 await xcuitestDriver.runReset();27 });28 after(async () => {29 await xcuitestDriver.deleteSession();30 });31});32const wd = require('wd');33const chai = require('chai');34const chaiAsPromised = require('chai-as-promised');35const { XCUITestDriver } = require('appium-xcuitest-driver');36chai.should();37chai.use(chaiAsPromised);38const PORT = 4723;39const HOST = 'localhost';40const BUNDLE_ID = 'com.my.app';41const DEVICE_UDID = 'my-udid';42const DEVICE_NAME = 'my-device-name';43const PLATFORM_VERSION = '12.1';44const PLATFORM_NAME = 'iOS';45const DEVICE_ORIENTATION = 'PORTRAIT';46const driver = wd.promiseChainRemote(HOST, PORT);47const xcuitestDriver = new XCUITestDriver({port: PORT, host: HOST});48const desiredCaps = {
Using AI Code Generation
1var wd = require('wd');2var driver = wd.promiseChainRemote("localhost", 4723);3driver.init({4}).then(function () {5 return driver.runReset();6});7var wd = require('wd');8var driver = wd.promiseChainRemote("localhost", 4723);9driver.init({10}).then(function () {11 return driver.reset();12});13var wd = require('wd');14var driver = wd.promiseChainRemote("localhost", 4723);15driver.init({16}).then(function () {17 return driver.resetApp();18});19var wd = require('wd');20var driver = wd.promiseChainRemote("localhost", 4723);21driver.init({22}).then(function () {23 return driver.runReset();24});25var wd = require('wd');26var driver = wd.promiseChainRemote("localhost", 4723);27driver.init({28}).then(function () {29 return driver.reset();30});31var wd = require('wd');32var driver = wd.promiseChainRemote("localhost", 4723);33driver.init({
Using AI Code Generation
1const { XCUITestDriver } = require('appium-xcuitest-driver');2let driver = new XCUITestDriver();3driver.runReset();4class XCUITestDriver extends BaseDriver {5 async runReset() {6 }7}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!