Best JavaScript code snippet using appium-xcuitest-driver
macaca-ios.js
Source:macaca-ios.js
...170 };171 yield _.waitForCondition(pageAvailable);172 let latestPage = _.last(availablePages);173 let pageId = latestPage.id;174 yield this.remote.connect(pageId);175 this.context = pageId;176 yield this.deleteWindow();177 return caps;178};179IOS.prototype.getSimulatorUdid = function * () {180 const devices = yield Simulator.getDevices();181 const availableDevices = devices.filter(device => device.available);182 let matchedDevice = null;183 logger.debug(`Get available devices ${JSON.stringify(availableDevices)}`);184 const deviceString = this.args.deviceName;185 _.each(availableDevices, device => {186 if (device.name === deviceString) {187 matchedDevice = device;188 }189 });190 if (!matchedDevice) {191 throw new Error(`Device ${deviceString} is not available!`);192 }193 return matchedDevice.udid;194};195IOS.prototype.startRealDevice = function * () {196 const bundleId = this.bundleId;197 const isInstalled = yield this.device.exists(bundleId);198 const app = this.args.app;199 const reuse = this.args.reuse;200 if (!app && !isInstalled) {201 throw new errors.UnknownError(`App '${bundleId}' is neither installed, nor provided!`);202 }203 if (isInstalled) {204 logger.debug(`App "${bundleId}" is already installed.`);205 logger.debug(`Adopting app reuse strategy: ${reuse}.`);206 switch (reuse) {207 case 0:208 case 1:209 if (app) {210 try {211 yield this.device.uninstall(bundleId);212 logger.debug(`Uninstall app "${bundleId}".`);213 yield this.device.installUntilReady(app, bundleId);214 logger.debug(`Install app '${bundleId}' successfully.`);215 } catch (err) {216 logger.debug(err.message);217 throw new errors.UnknownError(`Failed to install app '${bundleId}', please install the app manually.`);218 }219 }220 break;221 case 2:222 if (app) {223 try {224 yield this.device.installUntilReady(app, bundleId);225 logger.debug(`Install app '${bundleId}' successfully.`);226 } catch (err) {227 logger.debug(err.message);228 throw new errors.UnknownError(`Failed to install app '${bundleId}', please install the app manually.`);229 }230 }231 break;232 case 3:233 // Keep app state. Do nothing.234 break;235 }236 } else {237 logger.debug(`App '${bundleId}' is not installed.`);238 try {239 yield this.device.installUntilReady(app, bundleId);240 logger.debug(`Install app '${bundleId}' successfully.`);241 } catch (err) {242 logger.debug(err.message);243 throw new errors.UnknownError(`Failed to install app '${bundleId}', please install the app manually.`);244 }245 }246};247IOS.prototype.startSimulator = function * () {248 const isBooted = yield this.device.isBooted();249 const app = this.args.app;250 const bundleId = this.bundleId;251 const reuse = this.args.reuse;252 if (reuse && isBooted) {253 const isInstalled = yield this.device.exists(bundleId);254 if (!isInstalled && !app) {255 throw new errors.UnknownError(`App '${bundleId}' is neither installed, nor provided!`);256 }257 if (reuse === 1 && app) {258 yield this.device.uninstall(this.bundleId);259 yield this.device.installUntilReady(app, this.bundleId);260 }261 if (reuse === 2) {262 if (!isInstalled && app) {263 yield this.device.installUntilReady(app, this.bundleId);264 }265 }266 if (reuse === 3) {267 if (isInstalled) {268 this.args.app = '';269 }270 }271 return;272 }273 try {274 yield Simulator.killAll();275 } catch (e) {276 logger.debug(`Kill simulator failed ${e}`);277 }278 try {279 yield this.device.shutdown();280 } catch (e) {281 logger.debug(`Shutdown simulator ${this.device.deviceId} failed ${e}`);282 }283 if (!reuse) {284 yield this.device.erase();285 }286 yield this.device.open();287 yield _.retry(() => {288 return new Promise((resolve, reject) => {289 this.device290 .isBooted()291 .then(isBooted => {292 if (isBooted) {293 resolve();294 } else {295 reject(new errors.UnknownError(`Simulator ${this.device.deviceId} is not booted.`));296 }297 });298 });299 }, 3000, 10);300 const isInstalled = yield this.device.exists(bundleId);301 if (!isInstalled && !app) {302 throw new errors.UnknownError(`App '${bundleId}' is neither installed, nor provided!`);303 }304 // after device resume, should also based on app info and reuse to uninstall/install app305 if (reuse === 1 && app) {306 yield this.device.uninstall(this.bundleId);307 yield this.device.installUntilReady(app, this.bundleId);308 }309 if (reuse === 2) {310 if (!isInstalled && app) {311 yield this.device.installUntilReady(app, this.bundleId);312 }313 }314};315IOS.prototype.getDeviceString = function() {316 return this.args.deviceName + ' (' + this.args.platformVersion + ')';317};318IOS.prototype.stopDevice = function * () {319 logger.debug('Stoping iOS driver...');320 if (this.xctest) {321 this.xctest.stop();322 }323 if (this.remote) {324 this.remote.stop();325 }326 if (this.device && !this.args.reuse) {327 try {328 yield this.device.shutdown();329 } catch (e) {330 logger.debug(`Shutdown simulator ${this.device.deviceId} failed ${e}`);331 }332 try {333 yield Simulator.killAll();334 } catch (e) {335 logger.debug(`Kill simulator failed ${e}`);336 }337 }338 logger.debug('iOS driver cleaned up.');339};340IOS.prototype.isWebContext = function() {341 return this.context !== null && this.context !== 'NATIVE';342};343IOS.prototype.getContext = function * () {344 yield this.getContexts();345 if (!_.includes(this.contexts, String(this.context))) {346 logger.debug(`We dont have this context ${this.context}`);347 throw new errors.NoSuchWindow();348 }349 if (this.context && this.context !== NATIVE) {350 return `${WEBVIEW_PREFIX}${this.context}`;351 } else {352 return NATIVE;353 }354};355IOS.prototype.getContexts = function * () {356 const webviews = yield this.getWebviews();357 const ctx = webviews.map(page => page.id.toString());358 ctx.unshift(NATIVE);359 this.contexts = ctx;360 const names = webviews.map(page => `${WEBVIEW_PREFIX}${page.id}`);361 names.unshift(NATIVE);362 return names;363};364IOS.prototype.getWebviews = function * () {365 if (!this.remote) {366 this.remote = new RemoteDebugger({367 deviceId: this.udid368 });369 yield this.remote.start();370 }371 const pages = yield this.remote.getPages();372 if (pages.length === 0) {373 logger.debug('Cannot find any Webview');374 }375 return pages;376};377IOS.prototype.setContext = function * (name) {378 if ((name === this.context) ||379 (!name && NATIVE === this.context) ||380 (name === NATIVE && this.context === null)) {381 return null;382 } else if (name === NATIVE || !name) {383 this.proxy = this.xctest;384 this.context = null;385 this.frame = null;386 this.remote && this.remote.disconnect();387 } else {388 this.proxy = null;389 const index = name.replace(WEBVIEW_PREFIX, '');390 yield this.getContexts();391 if (!_.includes(this.contexts, index)) {392 logger.debug(`We dont have this context ${index}`);393 throw new errors.NoSuchWindow();394 }395 const pageId = parseInt(index, 10);396 if (this.context === pageId) {397 return null;398 }399 if (this.remote) {400 this.remote.disconnect();401 }402 yield this.remote.connect(pageId);403 this.context = pageId;404 this.frame = null;405 return null;406 }407};408IOS.prototype.get = function * (url) {409 if (this.isSafari || this.proxy) {410 yield this.device.openURL(url);411 yield _.sleep(2000);412 if (!this.remote) {413 this.remote = new RemoteDebugger({414 deviceId: this.udid415 });416 yield this.remote.start();417 }418 const availablePages = yield this.remote.getPages();419 const latestPage = _.last(availablePages);420 if (latestPage) {421 const pageId = latestPage.id;422 yield this.remote.connect(pageId);423 this.context = pageId;424 }425 this.frame = null;426 return null;427 } else {428 this.frame = null;429 return yield this.remote.navigateTo(url);430 }431};432IOS.prototype.getWindows = function * () {433 if (!this.isSafari) {434 throw new errors.NoSuchWindow();435 }436 const webviews = yield this.getWebviews();437 const ctx = webviews.map(page => page.id.toString());438 this.contexts = ctx;439 const names = webviews.map(page => `${WINDOW_PREFIX}${page.id}`);440 return names;441};442IOS.prototype.setWindow = function * (name) {443 if (name === this.context) {444 return null;445 } else {446 const index = name.replace(WINDOW_PREFIX, '');447 if (!_.includes(this.contexts, index)) {448 logger.debug(`We dont have this window ${index}`);449 throw new errors.NoSuchWindow();450 }451 const pageId = parseInt(index, 10);452 if (this.context === pageId) {453 return null;454 }455 if (this.remote) {456 this.remote.disconnect();457 }458 yield this.remote.connect(pageId);459 this.context = pageId;460 this.frame = null;461 return null;462 }463};464IOS.prototype.getScreenshot = function * (context) {465 const data = yield this.xctest.sendCommand(context.url, context.method, context.body);466 try {467 const result = typeof data === 'string' ? JSON.parse(data) : data;468 return result.value;469 } catch (e) {470 logger.debug(e);471 throw new errors.JavaScriptError(e.message);472 }...
context.js
Source:context.js
...44 if (this.remote) {45 await this.remote.disconnect();46 }47 this.curContext = idx;48 await this.remote.connect(idx);49 }50 }51 // attempt to start performance logging, if requested52 if (this.perfLogEnabled && this.remote) {53 logger.debug(`Starting performance log on '${this.curContext}'`);54 this.logs.performance = new IOSPerformanceLog(this.remote);55 this.logs.performance.startCapture();56 }57};58commands.getWindowHandle = async function () {59 if (!this.isWebContext()) {60 throw new errors.NotImplementedError();61 }62 return this.curContext;63};64commands.getWindowHandles = async function () {65 if (!this.isWebContext()) {66 throw new errors.NotImplementedError();67 }68 let pageArray = await this.listWebFrames();69 this.windowHandleCache = _.map(pageArray, this.massagePage);70 let idArray = _.pluck(this.windowHandleCache, 'id');71 // since we use this.contexts to manage selecting debugger pages, make72 // sure it gets populated even if someone did not use the73 // getContexts method74 if (!this.contexts) {75 this.contexts = idArray;76 }77 return idArray;78};79commands.setWindow = async function (name, skipReadyCheck) {80 if (!this.isWebContext()) {81 throw new errors.NotImplementedError();82 }83 if (!_.contains(_.pluck(this.windowHandleCache, 'id'), name)) {84 throw new errors.NoSuchWindowError();85 }86 let pageIdKey = parseInt(name, 10);87 if (!this.isRealDevice()) {88 await this.remote.selectPage(pageIdKey, skipReadyCheck);89 this.curContext = this.curWindowHandle = name;90 } else {91 if (name === this.curWindowHandle) {92 logger.debug(`Remote debugger is already connected to window '${name}'`);93 } else if (!_.contains(_.pluck(this.windowHandleCache, 'id'), name)) {94 throw new errors.NoSuchWindowError();95 } else {96 await this.remote.disconnect();97 this.curContext = this.curWindowHandle = name;98 await this.remote.connect(name);99 }100 }101};102helpers.webContextIndex = function () {103 return this.curContext.replace(WEBVIEW_BASE, '') - 1;104};105extensions.getContextsAndViews = async function () {106 logger.debug('Retrieving contexts and views');107 let webviews = await this.listWebFrames();108 let ctxs = [];109 this.contexts = [];110 for (let view of webviews) {111 ctxs.push({id: `${WEBVIEW_BASE}${view.id}`, view});112 this.contexts.push(view.id.toString());113 }114 return ctxs;115};116extensions.listWebFrames = async function () {117 if (!this.opts.bundleId) {118 logger.errorAndThrow('Cannot enter web frame without a bundle ID');119 }120 let pageArray;121 if (this.remote !== null && this.opts.bundleId !== null) {122 if (this.isRealDevice()) {123 pageArray = await this.remote.pageArrayFromJson();124 } else {125 pageArray = await this.remote.selectApp(this.opts.webviewConnectRetries);126 }127 } else {128 if (this.isRealDevice()) {129 this.remote = new WebKitRemoteDebugger({port: this.opts.webkitDebugProxyPort});130 return this.remote.pageArrayFromJson();131 }132 this.remote = new RemoteDebugger({133 bundleId: this.opts.bundleId,134 useNewSafari: this.useNewSafari(),135 pageLoadMs: this.pageLoadMs,136 platformVersion: this.opts.platformVersion137 });138 logger.info('attempting to connect to remote debugger');139 let appInfo = await this.remote.connect();140 logger.info('connected to remote debugger');141 if (!appInfo) {142 logger.debug('Unable to connect to the remote debugger.');143 return [];144 }145 logger.info('getting page array by calling "selectApp()"');146 pageArray = await this.remote.selectApp(this.opts.webviewConnectRetries);147 logger.info(`we got page array ${pageArray.length}`);148 this.remote.on(RemoteDebugger.EVENT_PAGE_CHANGE, this.onPageChange.bind(this));149 // TODO: do we need to close alerts here?150 // let tryClosingAlert = async () => {151 // let didDismiss = await this.closeAlertBeforeTest();152 // if (!didDismiss) {153 // throw new Error('Close alert failed. Retry.');...
ManagedProcess.js
Source:ManagedProcess.js
1var util = require('util')2var EventEmitter = require('wildemitter')3var Autowire = require('wantsit').Autowire4var timeoutify = require('timeoutify')5var ManagedProcess = function (info) {6 EventEmitter.call(this, {7 wildcard: true,8 delimiter: ':'9 })10 this._dnode = Autowire11 this._logger = Autowire12 this._config = Autowire13 // we're going to make the callbacks object non-enumerable14 delete this.callbacks15 Object.defineProperties(this, {16 callbacks: {17 value: {},18 writable: false19 },20 _rpc: {21 value: {},22 writable: false23 },24 _connected: {25 value: false,26 writable: true27 },28 _connecting: {29 value: false,30 writable: true31 },32 _remote: {33 value: null,34 writable: true35 }36 })37 this.workers = []38 this.update(info)39 // these methods are defined on the ProcessRPC class - must be kept in sync40 var methods = [41 'kill',42 'restart',43 'send',44 'signal',45 'reportStatus',46 'dumpHeap',47 'forceGc',48 'write',49 'setClusterWorkers',50 'fetchHeapSnapshot',51 'removeHeapSnapshot'52 ]53 methods.forEach(function (method) {54 this[method] = this._invoke.bind(this, method)55 }.bind(this))56}57util.inherits(ManagedProcess, EventEmitter)58ManagedProcess.prototype.update = function (info) {59 if (!info) {60 return61 }62 for (var key in info) {63 this[key] = info[key]64 }65 if (!this.cluster) {66 // these properties are only present on cluster managers67 delete this.workers68 delete this.setClusterWorkers69 // these are declared on the prototype so can't delete them70 this.addWorker = undefined71 this.removeWorker = undefined72 }73}74ManagedProcess.prototype.disconnect = function (callback) {75 if (!this._remote) {76 if (callback) {77 callback()78 }79 return80 }81 if (callback) {82 this._remote.once('end', callback)83 }84 this._connected = false85 this._remote.end()86 this._remote = null87}88ManagedProcess.prototype.connect = function (callback) {89 if (this._connected) {90 callback(undefined, this)91 return92 }93 this.once('_connected', callback)94 if (!this.socket) {95 this.emit('_connected', new Error('No socket defined'))96 return97 }98 // don't try to connect more than once99 if (this._connecting) {100 return101 }102 this._connecting = true103 this._remote = this._dnode({104 // forward received events on105 sendEvent: this.emit.bind(this)106 }, {107 timeout: this._config.guvnor ? this._config.guvnor.rpctimeout : this._config.rpctimeout108 })109 this._remote.on('error', function (error) {110 if (this._connecting) {111 this._connecting = false112 this.emit('_connected', error)113 }114 }.bind(this))115 this._remote.on('remote', function (remote) {116 this._logger.debug('Connected to remote process')117 this._connecting = false118 this._connected = true119 this._bindRemoteMethods(remote)120 this.emit('_connected', undefined, this)121 }.bind(this))122 try {123 this._remote.connect(this.socket)124 } catch(e) {125 callback(e)126 }127}128ManagedProcess.prototype._bindRemoteMethods = function (remote) {129 for (var method in remote) {130 if (method === 'dumpHeap' || method === 'forceGc' || method === 'fetchHeapSnapshot') {131 // these are slow so don't timeoutify132 this._logger.debug('Exposing remote method %s without timeout', method)133 this._rpc[method] = remote[method].bind(remote)134 } else {135 this._logger.debug('Timeoutifying remote method', method)136 this._rpc[method] = timeoutify(remote[method].bind(remote), this._config.guvnor ? this._config.guvnor.timeout : this._config.timeout)137 }138 }139}140ManagedProcess.prototype._invoke = function (method) {141 var args = Array.prototype.slice.call(arguments)142 var callback = args[args.length - 1]143 if (typeof callback !== 'function') {144 callback = function (error) {145 if (error) {146 throw error147 }148 }149 }150 // defer execution if we're not connected yet151 if (!this._connected) {152 this.connect(function (args, callback, error) {153 if (error) {154 return callback(error)155 }156 this._invoke.apply(this, args)157 }.bind(this, args, callback))158 return159 }160 // remove the method name from the arguments array161 args = args.slice(1)162 if (typeof this._rpc[method] !== 'function') {163 return callback(new Error('No method ' + method + ' defined!'))164 }165 try {166 this._rpc[method].apply(this._rpc, args)167 } catch (error) {168 callback(error)169 }170}171ManagedProcess.prototype.addWorker = function (worker) {172 if (!this.workers.some(function (existingWorker) {173 return existingWorker.id === worker.id174 })) {175 this.workers.push(worker)176 }177}178ManagedProcess.prototype.removeWorker = function (worker) {179 for (var i = 0; i < this.workers.length; i++) {180 if (this.workers[i].id === worker.id) {181 this.workers.splice(i, 1)182 }183 }184}...
rippleaccountProxy.js
Source:rippleaccountProxy.js
...8 this.restServer = params.restServer;9 this.remote = new Remote({10 servers: [ self.remoteServer ]11 });12 this.remote.connect(function() { 13 console.log("Connected to : " + self.remoteServer);14 });15};16RippleaccountProxy.prototype.init = function(callback) {17 var self = this;18 this.app.all('/ripple/id/*', function(req, res) {19 var options = {20 method: req.method,21 url: self.rippleaccountProxyHost + req.query.id,22 headers: {23 "Content-Type": "application/json",24 "Accept": "application/json"25 }26 };...
network.service.js
Source:network.service.js
...33 this.disconnectTimeout = null;34 };35 Network.prototype.init = function ()36 {37 this.remote.connect();38 };39 /**40 * Setup listeners for identity state.41 *42 * This function causes the network object to start listening to43 * changes in the identity state and automatically subscribe to44 * accounts accordingly.45 */46 Network.prototype.listenId = function (id)47 {48 var self = this;49 };50 Network.prototype.handleConnect = function (e)51 {...
driver.js
Source:driver.js
...29 bundleId: this.opts.bundleId,30 platformVersion: this.opts.platformVersion31 });32 log.info('creating connection to remote debugger');33 await this.remote.connect();34 log.info('connected to remote debugger, getting pages');35 let pages = await retryInterval(100, 200, async () => {36 let pages = await this.remote.selectApp();37 if (!pages.length) {38 throw new Error('no app connected');39 }40 return pages;41 });42 if (!pages.length) {43 throw new Error('Could not find Safari or an app with webviews running');44 }45 log.info('Selecting first page');46 await this.remote.selectPage(pages[0].id);47 log.info('Safari session ready to receive commands');...
network.js
Source:network.js
...28 this.connected = false;29 };30 Network.prototype.init = function ()31 {32 this.remote.connect();33 };34 /**35 * Setup listeners for identity state.36 *37 * This function causes the network object to start listening to38 * changes in the identity state and automatically subscribe to39 * accounts accordingly.40 */41 Network.prototype.listenId = function (id)42 {43 var self = this;44 };45 Network.prototype.handleConnect = function (e)46 {...
engine.js
Source:engine.js
...47};48Engine.prototype._startupRipple = function ()49{50 var self = this;51 this.remote.connect();52 this.remote.once('connected', function () {53 winston.info("Connected to Ripple network");54 self._notifyStartupComplete();55 });56};57Engine.prototype._notifyStartupComplete = function ()58{59 this.emit('started');60};61Engine.prototype.shutdown = function ()62{63 this.db.end();64 this.remote.disconnect();65};...
Using AI Code Generation
1var webdriverio = require('webdriverio');2var options = {3 desiredCapabilities: {4 },5};6var client = webdriverio.remote(options);7 .init()8 .getTitle().then(function(title) {9 console.log('Title was: ' + title);10 })11 .end();12var webdriverio = require('webdriverio');13var options = {14 desiredCapabilities: {15 },16};17var client = webdriverio.remote(options);18 .init()19 .getTitle().then(function(title) {20 console.log('Title was: ' + title);21 })22 .end();23var webdriverio = require('webdriverio');24var options = {25 desiredCapabilities: {26 },27};28var client = webdriverio.remote(options);29 .init()30 .getTitle().then(function(title) {31 console.log('Title was: ' + title);32 })33 .end();
Using AI Code Generation
1var webdriverio = require('webdriverio');2var options = {3 desiredCapabilities: {4 }5};6var client = webdriverio.remote(options);7client.init()8 .then(function () {9 return client.connect();10 })11 .then(function () {12 return client.getOrientation();13 })14 .then(function (orientation) {15 console.log('orientation is', orientation);16 })17 .then(function () {18 return client.setOrientation('LANDSCAPE');19 })20 .then(function () {21 return client.getOrientation();22 })23 .then(function (orientation) {24 console.log('orientation is', orientation);25 })26 .then(function () {27 return client.end();28 })29 .catch(function (err) {30 console.error('Error!', err);31 });32var webdriverio = require('webdriverio');33var options = {34 desiredCapabilities: {35 }36};37var client = webdriverio.remote(options);38client.init()39 .then(function () {40 return client.execute('mobile: scroll', {direction: 'down'});41 })42 .then(function () {43 return client.end();44 })45 .catch(function (err) {46 console.error('Error!', err);47 });
Using AI Code Generation
1var wd = require('wd');2var assert = require('assert');3var desired = {4};5driver.init(desired)6 .then(function () {7 })8 .then(function () {9 return driver.sleep(5000);10 })11 .then(function () {12 })13 .then(function () {14 return driver.sleep(5000);15 })16 .then(function () {17 })18 .then(function () {19 return driver.sleep(5000);20 })21 .then(function () {22 return driver.quit();23 })24 .done();25var wd = require('wd');26var assert = require('assert');27var desired = {28};29driver.init(desired)30 .then(function () {31 })32 .then(function () {33 return driver.sleep(5000);34 })35 .then(function () {36 })37 .then(function () {38 return driver.sleep(5000);39 })40 .then(function () {41 })42 .then(function () {43 return driver.sleep(5000);
Using AI Code Generation
1var webdriverio = require('webdriverio');2var opts = {3 desiredCapabilities: {4 }5};6var client = webdriverio.remote(opts);7 console.log('Title was: ' + title);8});9var webdriverio = require('webdriverio');10var opts = {11 desiredCapabilities: {12 }13};14var client = webdriverio.remote(opts);
Using AI Code Generation
1var XCUITestDriver = require('appium-xcuitest-driver');2var driver = new XCUITestDriver();3 if(err) {4 console.log("Error connecting to appium session: " + err);5 } else {6 console.log("Connected to appium session");7 }8});
Using AI Code Generation
1const wdio = require('webdriverio');2const opts = {3 capabilities: {4 }5};6const client = wdio.remote(opts);7client.connect().then(() => {8 return client.pause(5000);9}).then(() => {10 return client.deleteSession();11}).catch((err) => {12 console.log(err);13});14 at Object.waitForCondition (/Users/jenkins/node_modules/webdriverio/build/lib/utils/ErrorHandler.js:149:12)15 at runMicrotasksCallback (internal/process/next_tick.js:103:5)16 at _combinedTickCallback (internal/process/next_tick.js:138:11)17 at process._tickCallback (internal/process/next_tick.js:180:9)18* Appium version (or git revision) that exhibits the issue: 1.7.2-beta19* Last Appium version that did not exhibit the issue (if applicable):20* Node.js version (unless using Appium.app|exe): 9.4.0
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!!