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.0Learn 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!!
