How to use driver.sessionCapabilities method in Appium

Best JavaScript code snippet using appium

gesture-e2e-specs.js

Source:gesture-e2e-specs.js Github

copy

Full Screen

...127 it('should double tap on an element', async function () {128 // FIXME: Multitouch does not work as expected in Xcode < 9.129 // cloud tests are run on Linux, so no Xcode version to check130 // TODO: This test fails for iOS < 13131 const { platformVersion } = await driver.sessionCapabilities();132 if ((!process.env.CLOUD && (await xcode.getVersion(true)).major < 9) ||133 util.compareVersions(platformVersion, '<', '13.0')) {134 return this.skip();135 }136 await driver.execute('mobile: scroll', {direction: 'down'});137 await driver.elementByAccessibilityId('Steppers').click();138 let stepper = await driver.elementByAccessibilityId('Increment');139 let action = new wd.TouchAction(driver);140 action.tap({el: stepper, count: 2});141 await action.perform();142 await driver.elementByAccessibilityId('2')143 .should.not.be.rejected;144 });145 it(`should swipe the table and the bottom cell's Y position should change accordingly`, async function () {146 let winEl = await driver.elementByClassName('XCUIElementTypeWindow');147 let pickerEl = await driver.elementByAccessibilityId('Picker View');148 let yInit = (await pickerEl.getLocation()).y;149 await driver.execute('mobile: swipe', {element: winEl, direction: 'up'}).should.not.be.rejected;150 let yMiddle = (await pickerEl.getLocation()).y;151 yMiddle.should.be.below(yInit);152 await driver.execute('mobile: swipe', {element: winEl, direction: 'down'}).should.not.be.rejected;153 let yFinal = (await pickerEl.getLocation()).y;154 yFinal.should.be.above(yMiddle);155 });156 describe('pinch and zoom', function () {157 beforeEach(async function () {158 await driver.execute('mobile: scroll', {direction: 'down'});159 await driver.elementByAccessibilityId('Web View').click();160 });161 // at this point this test relies on watching it happen, nothing is asserted162 // in automation, this just checks that errors aren't thrown163 it('should be able to pinch', async function () {164 const ctxs = await driver.execute('mobile: getContexts', {waitForWebviewMs: 30000});165 await driver.context(ctxs[1]);166 await driver.get(APPIUM_IMAGE);167 await driver.context(ctxs[0]);168 async function doZoom () {169 let el = await driver.elementByClassName('XCUIElementTypeApplication');170 let thumb = new wd.TouchAction(driver);171 thumb.press({el, x: 100, y: 0}).moveTo({el, x: 50, y: 0}).release();172 let foreFinger = new wd.TouchAction(driver);173 foreFinger.press({el, x: 100, y: 0}).moveTo({el, x: 105, y: 0}).release();174 let zoom = new wd.MultiAction(driver);175 zoom.add(thumb, foreFinger);176 await zoom.perform();177 }178 await doZoom();179 async function doPinch () {180 let el = await driver.elementByClassName('XCUIElementTypeApplication');181 let thumb = new wd.TouchAction(driver);182 thumb.press({el, x: 50, y: 0}).moveTo({el, x: 100, y: 0}).release();183 let foreFinger = new wd.TouchAction(driver);184 foreFinger.press({el, x: 100, y: 0}).moveTo({el, x: 50, y: 0}).release();185 let pinch = new wd.MultiAction(driver);186 pinch.add(thumb, foreFinger);187 await pinch.perform();188 }189 await doPinch();190 });191 });192 describe('special actions', function () {193 it('should open the control center', async function () {194 let isStatusBarAvailable = false;195 try {196 await driver.elementByClassName('XCUIElementTypeStatusBar')197 .should.eventually.be.rejectedWith(/An element could not be located/);198 } catch (err) {199 // if this exists,200 isStatusBarAvailable = true;201 await driver.elementByAccessibilityId('ControlCenterView')202 .should.eventually.be.rejectedWith(/An element could not be located/);203 }204 let x, y0, y1;205 const window = await driver.elementByClassName('XCUIElementTypeApplication');206 const {width, height} = await window.getSize();207 try {208 // Try locating the 'Cellular' element (which can be pulled down)209 const cellularEl = await driver.elementByAccessibilityId('Cellular');210 const location = await cellularEl.getLocation();211 x = location.x;212 y0 = location.y;213 } catch (e) {214 // Otherwise, pull down the middle of the top of the Simulator215 const isIphoneX = await (async () => {216 if (UICATALOG_CAPS.deviceName.toLowerCase().includes('iphone x')) {217 return true;218 }219 const { platformVersion, deviceName } = await driver.sessionCapabilities();220 const generic = getGenericSimulatorForIosVersion(platformVersion, deviceName);221 if (_.includes(_.toLower(generic), ('iphone x'))) {222 return true;223 }224 return false;225 })();226 x = width / 2;227 y0 = isIphoneX228 ? 15229 : height - 5;230 }231 y1 = height / 2;232 let action = new wd.TouchAction(driver);233 action.press({x, y: y0}).wait(500).moveTo({x, y: y1});...

Full Screen

Full Screen

basic-e2e-specs.js

Source:basic-e2e-specs.js Github

copy

Full Screen

...55 CFBundleIdentifier: 'com.example.apple-samplecode.UICatalog',56 device: 'iphone',57 };58 let expected = Object.assign({}, UICATALOG_CAPS, extraWdaCaps);59 let actual = await driver.sessionCapabilities();60 // `borwserName` can be different61 ['UICatalog', 'UIKitCatalog'].should.include(actual.browserName);62 delete actual.browserName;63 // don't really know a priori what the udid should be, so just ensure64 // it's there, and validate the rest65 actual.udid.should.exist;66 delete actual.udid;67 // if we are getting metrics for this run (such as on Travis) there will68 // be events in the result, but we cannot know what they should be69 delete actual.events;70 // sdk version can be a longer version71 actual.sdkVersion.indexOf(UICATALOG_CAPS.platformVersion).should.eql(0);72 delete actual.sdkVersion;73 // there might have been added wdaLocalPort and webDriverAgentUrl74 delete actual.wdaLocalPort;75 delete actual.webDriverAgentUrl;76 // now test for the visual and dimension data77 actual.statBarHeight.should.be.a('number');78 delete actual.statBarHeight;79 actual.pixelRatio.should.be.a('number');80 delete actual.pixelRatio;81 actual.viewportRect.should.exist;82 actual.viewportRect.height.should.be.a('number');83 actual.viewportRect.width.should.be.a('number');84 delete actual.viewportRect;85 delete expected.udid; // for real device tests86 if (expected.showXcodeLog === undefined) {87 delete expected.showXcodeLog;88 }89 if (process.env.CLOUD) {90 delete expected.app;91 delete expected[process.env.APPIUM_BUNDLE_CAP];92 delete expected.name;93 delete expected.build;94 // Cloud has several extraneous keys. Check if the caps contain expected subset only.95 actual.should.containSubset(expected);96 } else {97 actual.should.eql(expected);98 }99 });100 });101 describe('source -', function () {102 function checkSource (src) {103 // should have full elements104 src.should.include('<AppiumAUT>');105 src.should.include('<XCUIElementTypeApplication');106 // should not have any XCTest errors107 src.should.not.include('AX error');108 }109 describe('plain -', function () {110 it('should get the source for the page', async function () {111 let src = await driver.source();112 (typeof src).should.eql('string');113 checkSource(src);114 });115 });116 describe('json parsed -', function () {117 it('should get source with useJSONSource', async function () {118 await driver.updateSettings({useJSONSource: true});119 let src = await driver.source();120 checkSource(src);121 });122 });123 });124 describe('deactivate app -', function () {125 it('should background the app for the specified time', async function () {126 let before = Date.now();127 await driver.backgroundApp(4);128 (Date.now() - before).should.be.above(4000);129 (await driver.source()).indexOf('<AppiumAUT>').should.not.eql(-1);130 });131 });132 describe('screenshot -', function () {133 after(async function () {134 try {135 await driver.setOrientation('PORTRAIT');136 } catch (ign) {}137 });138 it('should get an app screenshot', async function () {139 let screenshot = await driver.takeScreenshot();140 screenshot.should.exist;141 screenshot.should.be.a('string');142 // make sure WDA didn't crash, by using it again143 let els = await driver.elementsByAccessibilityId('Alert Views');144 els.length.should.eql(1);145 });146 it('should get an app screenshot in landscape mode', async function () {147 let screenshot1 = (await driver.takeScreenshot());148 screenshot1.should.exist;149 try {150 await driver.setOrientation('LANDSCAPE');151 } catch (ign) {}152 // take a little pause while it orients, otherwise you get the screenshot153 // on an angle154 await B.delay(500);155 let screenshot2 = await driver.takeScreenshot();156 screenshot2.should.exist;157 screenshot2.should.not.eql(screenshot1);158 });159 });160 describe('viewportScreenshot -', function () {161 it('should get a cropped screenshot of the viewport without statusbar', async function () {162 const {statBarHeight, pixelRatio, viewportRect} = await driver.sessionCapabilities();163 const fullScreen = await driver.takeScreenshot();164 const viewScreen = await driver.execute('mobile: viewportScreenshot');165 const fullB64 = Buffer.from(fullScreen, 'base64');166 const viewB64 = Buffer.from(viewScreen, 'base64');167 const fullImg = new PNG({filterType: 4});168 await B.promisify(fullImg.parse, {context: fullImg})(fullB64);169 const viewImg = new PNG({filterType: 4});170 await B.promisify(viewImg.parse, {context: viewImg})(viewB64);171 fullImg.height.should.eql(viewImg.height + Math.round(pixelRatio * statBarHeight));172 viewImg.height.should.eql(viewportRect.height);173 fullImg.width.should.eql(viewImg.width);174 });175 });176 describe('logging -', function () {...

Full Screen

Full Screen

appium-method-handler.js

Source:appium-method-handler.js Github

copy

Full Screen

...23 * Ping server every 30 seconds to prevent `newCommandTimeout` from killing session24 */25 runKeepAliveLoop () {26 this.keepAlive = setInterval(() => {27 this.driver.sessionCapabilities(); // Pings the Appium server to keep it alive28 const now = +(new Date());29 // If the new command limit has been surpassed, prompt user if they want to keep session going30 // Give them 30 seconds to respond31 if (now - this._lastActiveMoment > NO_NEW_COMMAND_LIMIT) {32 this.sender.send('appium-prompt-keep-alive');33 // After the time limit kill the session (this timeout will be killed if they keep it alive)34 this.waitForUserTimeout = setTimeout(() => {35 this.close('Session closed due to inactivity');36 }, WAIT_FOR_USER_KEEP_ALIVE);37 }38 }, KEEP_ALIVE_PING_INTERVAL);39 }40 /**41 * Get rid of the intervals to keep the session alive42 */43 killKeepAliveLoop () {44 clearInterval(this.keepAlive);45 if (this.waitForUserTimeout) {46 clearTimeout(this.waitForUserTimeout);47 }48 }49 /**50 * Reset the new command clock and kill the wait for user timeout51 */52 keepSessionAlive () {53 this._lastActiveMoment = +(new Date());54 if (this.waitForUserTimeout) {55 clearTimeout(this.waitForUserTimeout);56 }57 }58 async fetchElement (strategy, selector) {59 const timer = new timing.Timer().start();60 let element = await this.driver.elementOrNull(strategy, selector);61 const duration = timer.getDuration();62 const executionTime = Math.round(duration.asMilliSeconds);63 if (element === null) {64 return {};65 }66 let id = element.value;67 // Cache this ID along with its variable name, variable type and strategy/selector68 let cachedEl = this.elementCache[id] = {69 el: element,70 variableType: 'string',71 strategy,72 selector,73 id,74 };75 return {76 ...cachedEl,77 strategy,78 selector,79 id,80 executionTime,81 };82 }83 async fetchElements (strategy, selector) {84 let els = await this.driver.elements(strategy, selector);85 let variableName = `els${this.elArrayVariableCounter++}`;86 let variableType = 'array';87 // Cache the elements that we find88 let elements = els.map((el, index) => {89 const res = {90 el,91 variableName,92 variableIndex: index,93 variableType: 'string',94 id: el.value,95 strategy,96 selector,97 };98 this.elementCache[el.value] = res;99 return res;100 });101 return {variableName, variableType, strategy, selector, elements};102 }103 async _execute ({elementId, methodName, args, skipRefresh}) {104 this._lastActiveMoment = +(new Date());105 let cachedEl;106 let res = {};107 if (!_.isArray(args)) {108 args = [args];109 }110 if (elementId) {111 // Give the cached element a variable name (el1, el2, el3,...) the first time it's used112 cachedEl = this.elementCache[elementId];113 if (!cachedEl.variableName && cachedEl.variableType === 'string') {114 cachedEl.variableName = `el${this.elVariableCounter++}`;115 }116 res = await cachedEl.el[methodName].apply(cachedEl.el, args);117 } else {118 // Specially handle the tap and swipe method119 if (methodName === SCREENSHOT_INTERACTION_MODE.TAP) {120 res = await (new wd.TouchAction(this.driver))121 .tap({x: args[0], y: args[1]})122 .perform();123 } else if (methodName === SCREENSHOT_INTERACTION_MODE.SWIPE) {124 const [startX, startY, endX, endY] = args;125 res = await (new wd.TouchAction(this.driver))126 .press({x: startX, y: startY})127 .wait(500)128 .moveTo({x: endX, y: endY})129 .release()130 .perform();131 } else if (methodName !== 'source' && methodName !== 'screenshot') {132 res = await this.driver[methodName].apply(this.driver, args);133 }134 }135 // Give the source/screenshot time to change before taking the screenshot136 await Bluebird.delay(500);137 let contextsSourceAndScreenshot;138 if (!skipRefresh) {139 contextsSourceAndScreenshot = await this._getContextsSourceAndScreenshot();140 }141 return {142 ...contextsSourceAndScreenshot,143 ...cachedEl,144 res,145 };146 }147 async executeElementCommand (elementId, methodName, args = [], skipRefresh = false) {148 return await this._execute({elementId, methodName, args, skipRefresh});149 }150 async executeMethod (methodName, args = [], skipRefresh = false) {151 return await this._execute({methodName, args, skipRefresh});152 }153 async _getContextsSourceAndScreenshot () {154 let contexts, contextsError, currentContext, currentContextError, platformName,155 source, sourceError, screenshot, screenshotError, statBarHeight, windowSize, windowSizeError;156 try {157 currentContext = await this.driver.currentContext();158 } catch (e) {159 if (e.status === 6) {160 throw e;161 }162 currentContextError = e;163 }164 // Note: These methods need to be executed in the native context because ChromeDriver behaves differently165 if (currentContext !== NATIVE_APP) {166 await this.driver.context(NATIVE_APP);167 }168 ({platformName, statBarHeight} = await this.driver.sessionCapabilities());169 try {170 windowSize = await this.driver.getWindowSize();171 } catch (e) {172 if (e.status === 6) {173 throw e;174 }175 windowSizeError = e;176 }177 try {178 contexts = await this._getContexts(platformName);179 } catch (e) {180 if (e.status === 6) {181 throw e;182 }...

Full Screen

Full Screen

basic.js

Source:basic.js Github

copy

Full Screen

...39 sessions.length.should.be.above(0);40 should.exist(sessions[0].id);41 });42 it('should get session caps', function*() {43 var sessionCaps = yield driver.sessionCapabilities();44 should.exist(sessionCaps.browserName);45 sessionCaps.browserName.should.equal('chrome');46 });47 it('should get a url, page title, and window handle', function*() {48 var testPage = baseUrl + 'guinea-pig.html';49 yield driver.get(testPage);50 var title = yield driver.title();51 title.should.equal("I am a page title");52 var handle = yield driver.windowHandle();53 handle.length.should.be.above(0);54 handles['window-1'] = handle;55 });56 it('should open a new window', function*() {57 var newWindow = baseUrl + 'guinea-pig2.html';...

Full Screen

Full Screen

index.js

Source:index.js Github

copy

Full Screen

...15 port: 472316 });17 let desiredCaps = sessionData;18 await this.driver.init(desiredCaps);19 console.log("DETIL KAPABILITAS: \n", await this.driver.sessionCapabilities());20 }21 async endSession() {22 await this.driver.quit();23 }24 async runAPI(command) {25 try {26 const response = await axios('http://' + this.address + ':8342' + command);27 return response['data'];28 }29 catch (err) {30 throw err;31 }32 }33 async testServer() {...

Full Screen

Full Screen

ci-metrics.js

Source:ci-metrics.js Github

copy

Full Screen

...48 };49 // rewrite `quit` to get the event timings and pass them on50 let quit = driver.quit;51 driver.quit = async function () {52 let caps = await driver.sessionCapabilities();53 let events = Object.assign({}, caps.events, {54 // TODO: add identification info when the parser can handle it55 // build: {56 // sessionId: driver.sessionID,57 // date: buildDate,58 // 'git-sha': gitRev,59 // },60 });61 if (events) {62 log.info(`Event timings: ${JSON.stringify(events)}`);63 // write to a JSON file, for consumption at the end of the run64 let ciMetricsDir = path.resolve('ci-metrics');65 log.debug(`CI Metrics in directory: ${ciMetricsDir}`);66 if (!await fs.exists(ciMetricsDir)) {...

Full Screen

Full Screen

viewport-e2e-specs.js

Source:viewport-e2e-specs.js Github

copy

Full Screen

...16 await deleteSession();17 }18 });19 it('should get device pixel ratio, status bar height, and viewport rect', async function () {20 const {viewportRect, statBarHeight, pixelRatio} = await driver.sessionCapabilities();21 pixelRatio.should.exist;22 pixelRatio.should.not.equal(0);23 statBarHeight.should.exist;24 statBarHeight.should.not.equal(0);25 viewportRect.should.exist;26 viewportRect.left.should.exist;27 viewportRect.top.should.exist;28 viewportRect.width.should.exist;29 viewportRect.height.should.exist;30 });31 it('should get scrollable element', async function () {32 let scrollableEl = await driver.elementByXPath('//*[@scrollable="true"]');33 scrollableEl.should.exist;34 });35 it('should get content size from scrollable element found as uiobject', async function () {36 let scrollableEl = await driver.elementByXPath('//*[@scrollable="true"]');37 let contentSize = await scrollableEl.getAttribute('contentSize');38 contentSize.should.exist;39 JSON.parse(contentSize).scrollableOffset.should.exist;40 });41 it('should get content size from scrollable element found as uiobject2', async function () {42 let scrollableEl = await driver.elementByXPath('//android.widget.ScrollView');43 let contentSize = await scrollableEl.getAttribute('contentSize');44 contentSize.should.exist;45 JSON.parse(contentSize).scrollableOffset.should.exist;46 });47 it('should get first element from scrollable element', async function () {48 let scrollableEl = await driver.elementByXPath('//*[@scrollable="true"]');49 let element = await scrollableEl.elementByXPath('/*[@firstVisible="true"]');50 element.should.exist;51 });52 it('should get a cropped screenshot of the viewport without statusbar', async function () {53 // TODO: fails on CI with a `Does the current view have 'secure' flag set?` error54 if (process.env.CI) {55 return this.skip();56 }57 const {viewportRect, statBarHeight} = await driver.sessionCapabilities();58 const fullScreen = await driver.takeScreenshot();59 const viewScreen = await driver.execute('mobile: viewportScreenshot');60 const fullB64 = Buffer.from(fullScreen, 'base64');61 const viewB64 = Buffer.from(viewScreen, 'base64');62 const fullImg = new PNG({filterType: 4});63 await B.promisify(fullImg.parse).call(fullImg, fullB64);64 const viewImg = new PNG({filterType: 4});65 await B.promisify(viewImg.parse).call(viewImg, viewB64);66 viewportRect.top.should.eql(statBarHeight);67 viewImg.height.should.eql(viewportRect.height);68 viewImg.width.should.eql(fullImg.width);69 fullImg.height.should.be.above(viewImg.height);70 });71});

Full Screen

Full Screen

actual-capabilities-specs.js

Source:actual-capabilities-specs.js Github

copy

Full Screen

1"use strict";2var setup = require("../common/setup-base")3 , desired = require("./apidemos/desired")4 , ADB = require('../../../lib/devices/android/adb')5 , Q = require("q");6describe("actual capabilities - session start", function () {7 var device;8 var version;9 before(function () {10 var adb = new ADB({}),11 adbShell = Q.denodeify(adb.shell.bind(adb));12 device = adb.udid;13 adbShell('getprop ro.build.version.release').then(function (res) {14 version = res[0];15 });16 });17 var driver;18 setup(this, desired).then(function (d) { driver = d; });19 it('should answer with actual capabilities', function (done) {20 driver21 .sessionCapabilities()22 .should.eventually.contain({23 deviceName: device,24 platformVersion: version25 })26 .nodeify(done);27 });...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1var webdriver = require('selenium-webdriver'),2 until = webdriver.until;3var driver = new webdriver.Builder()4 .forBrowser('chrome')5 .build();6driver.findElement(By.name('q')).sendKeys('webdriver');7driver.findElement(By.name('btnG')).click();8driver.wait(until.titleIs('webdriver - Google Search'), 1000);9driver.sessionCapabilities().then(function(caps) {10 console.log(caps);11});12driver.quit();13var webdriver = require('selenium-webdriver'),14 until = webdriver.until;15var driver = new webdriver.Builder()16 .forBrowser('chrome')17 .build();18driver.findElement(By.name('q')).sendKeys('webdriver');19driver.findElement(By.name('btnG')).click();20driver.wait(until.titleIs('webdriver - Google Search'), 1000);

Full Screen

Using AI Code Generation

copy

Full Screen

1driver.init({2}).then(function() {3 return driver.sessionCapabilities();4}).then(function(caps) {5 console.log(caps);6});7driver.init({8}).then(function() {9 return driver.sessionCapabilities();10}).then(function(caps) {11 console.log(caps);12});13driver.init({14}).then(function() {15 return driver.sessionCapabilities();16}).then(function(caps) {17 console.log(caps);

Full Screen

Using AI Code Generation

copy

Full Screen

1var capabilities = driver.sessionCapabilities();2console.log(capabilities);3var capabilities = driver.sessionCapabilities();4console.log(capabilities);5var logs = driver.sessionLogs();6console.log(logs);7var logsTypes = driver.sessionLogsTypes();8console.log(logsTypes);9var logsTypes = driver.sessionLogsTypes();10console.log(logsTypes);11var logsTypes = driver.sessionLogsTypes();12console.log(logsTypes);13var logsTypes = driver.sessionLogsTypes();14console.log(logsTypes);15var logsTypes = driver.sessionLogsTypes();16console.log(logsTypes);17var logsTypes = driver.sessionLogsTypes();18console.log(logsTypes);19var logsTypes = driver.sessionLogsTypes();20console.log(logsTypes);21var logsTypes = driver.sessionLogsTypes();22console.log(logsTypes);23var logsTypes = driver.sessionLogsTypes();24console.log(logsTypes);

Full Screen

Using AI Code Generation

copy

Full Screen

1var webdriver = require('selenium-webdriver');2}).build();3driver.sessionCapabilities().then(function (caps) {4 console.log(caps);5});6driver.quit();7{ browserName: 'chrome',8 warnings: {},9 appActivity: 'com.example.user.app.MainActivity' }10var webdriver = require('selenium-webdriver');11}).build();12driver.session().then(function (session) {13 console.log(session);14});15driver.quit();16{ id: 'a3d2a2c9-9e3b-4d4f-bf7c-4a4e5d

Full Screen

Using AI Code Generation

copy

Full Screen

1var webdriver = require('selenium-webdriver'),2 until = webdriver.until;3var driver = new webdriver.Builder()4 .forBrowser('chrome')5 .build();6driver.findElement(By.name('q')).sendKeys('webdriver');7driver.findElement(By.name('btnG')).click();8driver.wait(until.titleIs('webdriver - Google Search'), 1000);9driver.getSession().then(function(session) {10 driver.sessionCapabilities().then(function(capabilities) {11 console.log(capabilities);12 });13});14driver.quit();

Full Screen

Using AI Code Generation

copy

Full Screen

1var webdriverio = require('webdriverio');2var client = webdriverio.remote({3 desiredCapabilities: {4 }5});6client.init();7client.sessionCapabilities().then(function (caps) {8 console.log(caps);9});10client.getDeviceName().then(function (deviceName) {11 console.log(deviceName);12});13client.end();

Full Screen

Automation Testing Tutorials

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.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run Appium automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful