From 08ff458f0b5c3a7289d4840eca8710f504fbaf60 Mon Sep 17 00:00:00 2001 From: salmank Date: Sun, 30 Nov 2025 16:40:50 +0530 Subject: [PATCH] Updated Doc: How to Migrate Appium Tests From BrowserStack, Sauce Labs, and Local Grid --- .../username-accesskey.png | Bin 0 -> 24751 bytes ...m-tests-from-browserstack-and-saucelabs.md | 664 +++++------------- 2 files changed, 160 insertions(+), 504 deletions(-) create mode 100644 assets/images/getting-started-app-automation/username-accesskey.png diff --git a/assets/images/getting-started-app-automation/username-accesskey.png b/assets/images/getting-started-app-automation/username-accesskey.png new file mode 100644 index 0000000000000000000000000000000000000000..a382c717092ea085ee8b793ff4f8acbefa87f3f8 GIT binary patch literal 24751 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

pWT%jx#+d_^~@SRbb_WY2{ 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 -## From Local Grid, BrowserStack Or SauceLabs To LambdaTest - --- -LambdaTest offers an online Appium automation grid to perform App automation. The online Appium Grid is available on local grid, BrowserStack, SauceLabs and LambdaTest. Therefore, you can effortlessly migrate your current Appium automation scripts (or suites) from local grid, Sauce Labs or BrowserStack to LambdaTest. +import CodeBlock from '@theme/CodeBlock'; +import {YOUR_LAMBDATEST_USERNAME, YOUR_LAMBDATEST_ACCESS_KEY} from "@site/src/component/keys"; -In this documentation, we look at how to leverage LambdaTest cloud for App automation and migrate your test scripts (or test suites) from your local grid, Sauce labs or BrowserStack. You can use LambdaTest's desired capabilities in your tests, authenticate your test session, and execute tests on the cloud. +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; -## Introduction +LambdaTest offers an online Appium automation grid to perform app automation. The online Appium Grid is available on BrowserStack, Sauce Labs and LambdaTest. Therefore, you can effortlessly migrate your current Appium automation scripts (or suites) from local grid, Sauce Labs or BrowserStack to LambdaTest. ---- +You can check out this guide to know about the [supported Appium versions on LambdaTest](https://www.lambdatest.com/support/docs/supported-appium-versions/). -Migrating your current local grid, BroweseStack or Sauce Labs tests to LambdaTest requires a few tweaks in your code. In this guide, we'll look at how to leverage LambdaTest's desired capabilities in your tests, authenticate your test session, and execute tests on our cloud browsers. -## Migration From BrowserStack And SauceLabs +## Migrating Tests From BrowserStack and Sauce Labs --- -## Changes In The Test Script +## Changes in the Test Script -To move from the local grid, BroweseStack or Sauce Labs to LambdaTest, you need to make some changes to your test suites such as authentication, desired capabilities etc. +To move from BrowserStack or Sauce Labs to LambdaTest, you need to make some changes to your test suites such as authentication, desired capabilities etc. -### Authentication +### Step 1: Authentication --- -Firstly, you need to change the authentication in the configuration settings of your test suite. For running tests on LambdaTest Appium Grid, you need to have a valid `user_name` and `access_key` to perform tests on our cloud Grid. In case you don’t have an account on LambdaTest, visit the LambdaTest **signup** page and create a new account. +Firstly, you need to change the authentication in the configuration settings of your test suite. For running tests on LambdaTest Appium Grid, you need to have a valid Username and Access Key to run tests. In case you don’t have an account on LambdaTest, you can [sign up on LambdaTest](https://accounts.lambdatest.com/register). The following are the changes in the parameters: - Username - Access Key -You can find the `Username` and `Access Key` in the **LambdaTest Profile Section** of the **Automation Dashboard**. +You can find the `Username` and `Access Key` from your LambdaTest Account Settings under [Password & Security](https://accounts.lambdatest.com/security/username-accesskey). -Image +Image -When migrating from BrowserStack or SauceLabs to LambdaTest, you need to make the following changes in the existing code: +When migrating from BrowserStack or Sauce Labs to LambdaTest, you need to make the following changes in the existing code: -1. UserName -2. AccessKey +1. User name +2. Access Key 3. Hub URL 4. Desired Capabilities Here is a side-by-side comparison of each of the fields that we have highlighted above: -| Property | Type | BrowserStack | SauceLabs | LambdaTest | +| Property | Type | BrowserStack | Sauce Labs | LambdaTest | | --------- | ------ | ----------------------------------------------- | --------------------------------------------- | --------------------------------------------- | -| UserName | String | UserName to access Appium Grid on BrowserStack | UserName to access Appium Grid on Sauce Labs | UserName to access Appium Grid on LambdaTest | -| AccessKey | String | AccessKey to access Appium Grid on BrowserStack | AccessKey to access Appium Grid on Sauce Labs | AccessKey to access Appium Grid on LambdaTest | +| Username | String | UserName to access Appium Grid on BrowserStack | UserName to access Appium Grid on Sauce Labs | UserName to access Appium Grid on LambdaTest | +| Access Key | String | AccessKey to access Appium Grid on BrowserStack | AccessKey to access Appium Grid on Sauce Labs | AccessKey to access Appium Grid on LambdaTest | | Hub URL | String | @hub-cloud.browserstack.com/wd/hub | ondemand.us-west-1.saucelabs.com/wd/hub | @hub.lambdatest.com/wd/hub | -For a Python-based implementation, here are the changes in the script for the authentication process. - -**BrowserStack** - -```python -userName = "BrowserStack_UserName" -accessKey = "BrowserStack_AccessKey" -``` - -**SauceLabs** -```python -userName = "SAUCE_USERNAME" -accessKey = "SAUCE_ACCESS_KEY" -``` -**LambdaTest** -```python -userName = "LambdaTest_UserName" -accessKey = "LambdaTest_AccessKey" -``` -### Changes To The Hub URL - ---- - -Now you have to modify the hub URL in your test suite's configuration settings. The Hub URL is of the String type and specifies the Hub location to which the Appium tests will be routed for execution. - -For a Python-based implementation, here are the changes in the script for Hub URL. - -**BrowserStack** - -``` -@hub-cloud.browserstack.com/wd/hub -``` - -**SauceLabs** - -``` -@ondemand.us-west-1.saucelabs.com/wd/hub -``` - -**LambdaTest** - -``` -@mobile-hub.lambdatest.com/wd/hub -``` - -### Desired Capability Generator +### Step 2: Specifying Desired Capabilities --- @@ -149,488 +103,190 @@ Capabilities generator allows you to specify the desired capabilities (or capabi 1. Device 2. Operating system -You can also select other advanced options available in the LambdaTest Capabilities Generator. - -For the migration, we have taken Java-based Appium tests. Below are the screenshots of the capability generator of BrowserStack and LambdaTest. - -#### **BrowserStack** - ---- - -Image +You can also select other advanced options available in the LambdaTest [Automation Capabilities Generator](https://www.lambdatest.com/capabilities-generator/). -#### **Sauce Labs** - ---- - -Image - -#### **LambdaTest** - ---- -Image + -The comparison of the capabilities generated by BrowserStack and LambdaTest capabilities generator: - -| Capabilities | BrowserStack | SauceLabs | LambdaTest | -| ---------------- | ------------ | --------------- | --------------- | -| Device | device | deviceName | deviceName | -| Operating System | os_version | platformVersion | platformVersion | - -The following is an overview of the comparison of Desired Capabilities for the Java language: - -**BrowserStack** - -```js -//demo.java -DesiredCapabilities capabilities = new DesiredCapabilities(); -capabilities.setCapability("os_version", "9.0"); -capabilities.setCapability("device", "Google Pixel 3"); -capabilities.setCapability("browserstack.appium_version", "1.21.0"); -``` - -**SauceLabs** + ```java -//demo.java -MutableCapabilities caps = new MutableCapabilities(); -caps.setCapability("platformName", "Android"); -caps.setCapability("browserName", "Chrome"); -caps.setCapability("appium:deviceName", "Google Pixel 3 GoogleAPI Emulator"); -caps.setCapability("appium:platformVersion", "12.0"); -MutableCapabilities sauceOptions = new MutableCapabilities(); -sauceOptions.setCapability("appiumVersion", "1.21.0"); -caps.setCapability("sauce:options", sauceOptions); -``` - -**LambdaTest** - -```js -//demo.java DesiredCapabilities capabilities = new DesiredCapabilities(); -capabilities.setCapability("build", "your build name"); -capabilities.setCapability("name", "your test name"); -capabilities.setCapability("platformName", "Android"); -capabilities.setCapability("deviceName", "Google Pixel 3"); -capabilities.setCapability("isRealMobile", true); -capabilities.setCapability("platformVersion","9"); +capabilities.setCapability("platformName", "android"); +capabilities.setCapability("deviceName", "ASUS ZenFone 8"); +capabilities.setCapability("appiumVersion", "1.21.0"); +capabilities.setCapability("platformVersion", "13"); ``` -### Example: Migration To LambdaTest - ---- - -Let's look an example that shows the entire migration process. The test scenario is to open a Wikipedia app that search the term ‘lambdatest’. The following test runs on Google Pixel 3 running Android 11. - -#### **BrowserStack** - ---- - -```python - -from appium import webdriver -from appium.webdriver.common.mobileby import MobileBy -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -import time - -userName = "BrowserStack_UserName" -accessKey = "BrowserStack_AccessKey" - -desired_caps = { - "build": "Python Android", - "device": "Google Pixel 3", - "app": "" -} - -driver = webdriver.Remote("https://" + userName + ":" + accessKey + "@hub-cloud.browserstack.com/wd/hub", desired_caps) - -search_element = WebDriverWait(driver, 30).until( - EC.element_to_be_clickable((MobileBy.ACCESSIBILITY_ID, "Search Wikipedia")) -) -search_element.click() + -search_input = WebDriverWait(driver, 30).until( - EC.element_to_be_clickable((MobileBy.ID, "org.wikipedia.alpha:id/search_src_text")) -) -search_input.send_keys("BrowserStack") -time.sleep(5) + -search_results = driver.find_elements_by_class_name("android.widget.TextView") -assert(len(search_results) > 0) - -driver.quit() +```java +DesiredCapabilities capabilities = new DesiredCapabilities(); +capabilities.setCapability("platformName", "android"); +capabilities.setCapability("deviceName", "ASUS ZenFone 8"); +capabilities.setCapability("appiumVersion", "2.16.2"); +capabilities.setCapability("platformVersion", "13"); ``` -#### **SauceLabs** + ---- - -```python -#samplewikipedia.py -import ssl - -try: - _create_unverified_https_context = ssl._create_unverified_context -except AttributeError: - # Legacy Python that doesn't verify HTTPS certificates by default - pass -else: - # Handle target environment that doesn't support HTTPS verification - ssl._create_default_https_context = _create_unverified_https_context - -from threading import Thread -import time -from selenium import webdriver -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -from selenium.common.exceptions import TimeoutException -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from appium.webdriver.common.mobileby import MobileBy -from appium import webdriver - -# This array 'caps' defines the capabilities browser, device and OS combinations where the test will run - -caps = { - caps['platformName'] = 'Android' - caps['browserName'] = 'Chrome' - caps['appium:deviceName'] = 'Google Pixel 3a GoogleAPI Emulator' - caps['appium:platformVersion'] = '11.0' - caps['sauce:options'] = {} - caps['sauce:options']['appiumVersion'] = '1.20.2' -} + -# run_session function searches for 'saucelabs' on google.com - -def run_session(desired_cap): - driver = webdriver.Remote( - - command_executor="https://SAUCE_USERNAME:SAUCE_ACCESS_KEY@ondemand.us-west-1.saucelabs.com/wd/hub", - desired_capabilities=desired_cap) - - # driver.get("https://www.ifconfig.me") - # time.sleep(10) - # Test case for the saucelabs sample Android app. -# If you have uploaded your app, update the test case here. - search_element = WebDriverWait(driver, 30).until( - EC.element_to_be_clickable( - (MobileBy.ACCESSIBILITY_ID, "Search Wikipedia")) - ) - search_element.click() - search_input = WebDriverWait(driver, 30).until( - EC.element_to_be_clickable( - (MobileBy.ID, "org.wikipedia.alpha:id/search_src_text")) - ) - search_input.send_keys("saucelabs") - time.sleep(5) - search_results = driver.find_elements_by_class_name( - "android.widget.TextView") - assert(len(search_results) > 0) - -# Invoke driver.quit() after the test is done to indicate that the test is completed. - driver.quit() - -# The Thread function takes run_session function and each set of capability from the caps array as an argument to run each session in parallel -for cap in caps: - Thread(target=run_session, args=(cap,)).start() +```java +DesiredCapabilities capabilities = new DesiredCapabilities(); +capabilities.setCapability("platformName", "android"); +capabilities.setCapability("deviceName", "ASUS ZenFone 8"); +capabilities.setCapability("appiumVersion", "3.0.2"); +capabilities.setCapability("platformVersion", "13"); ``` -#### **LambdaTest** - ---- - -```python -#samplewikipedia.py - -import ssl - -try: - _create_unverified_https_context = ssl._create_unverified_context -except AttributeError: - # Legacy Python that doesn't verify HTTPS certificates by default - pass -else: - # Handle target environment that doesn't support HTTPS verification - ssl._create_default_https_context = _create_unverified_https_context - -from threading import Thread -import time -from selenium import webdriver -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -from selenium.common.exceptions import TimeoutException -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from appium.webdriver.common.mobileby import MobileBy -from appium import webdriver - - -# This array 'caps' defines the capabilities browser, device and OS combinations where the test will run -caps = [ - - { - "deviceName": "Google Pixel 3", - "platformName": "Android", - "platformVersion": "11", - "app": "", - "isRealMobile": True, - "deviceOrientation": "PORTRAIT", - "build": "Demo", - }, -] -# run_session function searches for 'lambtest' on google.com - - -def run_session(desired_cap): - driver = webdriver.Remote( - # hub.mobile-dev-1.dev.lambdatest.io/wd/hub", - command_executor="https://LT_USERNAME:LT_ACCESS_KEY@mobile-hub.lambdatest.com/wd/hub", - desired_capabilities=desired_cap) - - # driver.get("https://www.ifconfig.me") - # time.sleep(10) - # Test case for the lambdatest sample Android app. -# If you have uploaded your app, update the test case here. - search_element = WebDriverWait(driver, 30).until( - EC.element_to_be_clickable( - (MobileBy.ACCESSIBILITY_ID, "Search Wikipedia")) - ) - search_element.click() - search_input = WebDriverWait(driver, 30).until( - EC.element_to_be_clickable( - (MobileBy.ID, "org.wikipedia.alpha:id/search_src_text")) - ) - search_input.send_keys("lambdatest") - time.sleep(5) - search_results = driver.find_elements_by_class_name( - "android.widget.TextView") - assert(len(search_results) > 0) - -# Invoke driver.quit() after the test is done to indicate that the test is completed. - driver.quit() - - -# The Thread function takes run_session function and each set of capability from the caps array as an argument to run each session in parallel -for cap in caps: - Thread(target=run_session, args=(cap,)).start() -``` + -The majority of the implementation, as shown above, remains unchanged. Only changes to the infrastructure are made (i.e. instead of BrowserStack, the app automation tests would be run on LambdaTest). + -Let's analyze what has changed from the implementation point of view. +>**Note**: Currently, Appium v3 on LambdaTest is supported on virtual devices for Android 15+ and iOS 16+. -**BrowserStack** +### Step 3: Migrating Tests --- -```python +Let's look an example that shows the entire migration process. -from appium import webdriver -from appium.webdriver.common.mobileby import MobileBy -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -import time +The test script below launches the Android app on a real device via LambdaTest using Appium and sets the required capabilities. -userName = "BrowserStack_UserName" -accessKey = "BrowserStack_AccessKey" +It then clicks through color change, text update, toast, and notification. After that it opens geo location, runs the speed test, launches the browser, visits a website, and ends the session. -desired_caps = { - "build": "Python Android", - "device": "Google Pixel 3", - "app": "" -} - -driver = webdriver.Remote("https://" + userName + ":" + accessKey + "@hub-cloud.browserstack.com/wd/hub", desired_caps) -``` -**SauceLabs** ---- - -```python - -from threading import Thread -import time -from selenium import webdriver -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -from selenium.common.exceptions import TimeoutException -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from appium.webdriver.common.mobileby import MobileBy -from appium import webdriver - - -# This array 'caps' defines the capabilities browser, device and OS combinations where the test will run - -caps = { - caps['platformName'] = 'Android' - caps['browserName'] = 'Chrome' - caps['appium:deviceName'] = 'Google Pixel 3a GoogleAPI Emulator' - caps['appium:platformVersion'] = '11.0' - caps['sauce:options'] = {} - caps['sauce:options']['appiumVersion'] = '1.20.2' +```java +public class AndroidApp { + + String userName = System.getenv("LT_USERNAME") == null ? + "username" : System.getenv("LT_USERNAME"); //Add username here + String accessKey = System.getenv("LT_ACCESS_KEY") == null ? + "accessKey" : System.getenv("LT_ACCESS_KEY"); //Add accessKey here + + public String gridURL = "@mobile-hub.lambdatest.com/wd/hub"; + + AppiumDriver driver; + + @Test + @org.testng.annotations.Parameters(value = {"device", "version", "platform"}) + public void AndroidApp1(String device, String version, String platform) { + try { + DesiredCapabilities capabilities = new DesiredCapabilities(); + capabilities.setCapability("build","Java TestNG Android"); + capabilities.setCapability("name",platform+" "+device+" "+version); + capabilities.setCapability("deviceName", device); + capabilities.setCapability("platformVersion",version); + capabilities.setCapability("platformName", platform); + capabilities.setCapability("isRealMobile", true); + capabilities.setCapability("app", "APP_URL"); //Enter your app (.apk) url + capabilities.setCapability("deviceOrientation", "PORTRAIT"); + capabilities.setCapability("console", true); + capabilities.setCapability("network", false); + capabilities.setCapability("visual", true); + capabilities.setCapability("devicelog", true); + + String hub = "https://" + userName + ":" + accessKey + gridURL; + driver = new AppiumDriver(new URL(hub), capabilities); + + MobileElement color = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/color"); + //Changes color to pink + color.click(); + Thread.sleep(1000); + //Back to original color + color.click(); + + MobileElement text = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/Text"); + //Changes the text to "Proverbial" + text.click(); + + //toast will be visible + MobileElement toast = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/toast"); + toast.click(); + + //notification will be visible + MobileElement notification = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/notification"); + notification.click(); + Thread.sleep(2000); + + //Opens the geolocation page + MobileElement geo = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/geoLocation"); + geo.click(); + Thread.sleep(5000); + + //takes back to home page + MobileElement home = (MobileElement) driver.findElementByAccessibilityId("Home"); + home.click(); + + //Takes to speed test page + MobileElement speedtest = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/speedTest"); + speedtest.click(); + Thread.sleep(5000); + + MobileElement Home = (MobileElement) driver.findElementByAccessibilityId("Home"); + Home.click(); + + //Opens the browser + MobileElement browser = (MobileElement) driver.findElementByAccessibilityId("Browser"); + browser.click(); + + MobileElement url = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/url"); + url.sendKeys("https://www.lambdatest.com"); + + MobileElement find = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/find"); + find.click(); + + driver.quit(); + + } catch (Exception e) { + e.printStackTrace(); + try{ + driver.quit(); + }catch(Exception e1){ + e.printStackTrace(); + } + } + } } - - -# run_session function searches for 'saucelabs' on google.com - - -def run_session(desired_cap): - driver = webdriver.Remote( - - command_executor="https://SAUCE_USERNAME:SAUCE_ACCESS_KEY@ondemand.us-west-1.saucelabs.com/wd/hub", - desired_capabilities=desired_cap) - ``` -**LambdaTest** +The majority of the implementation, as shown above, remains unchanged. Only changes to the infrastructure are made (i.e. instead of BrowserStack or Sauce Labs, the app automation tests would be run on LambdaTest). ---- - -```python -from threading import Thread -import time -from selenium import webdriver -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -from selenium.common.exceptions import TimeoutException -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from appium.webdriver.common.mobileby import MobileBy -from appium import webdriver - -caps = [ - - { - "deviceName": "Google Pixel 3", - "platformName": "Android", - "platformVersion": "11", - "app": "", - "build": "Demo", - }, -] - -def run_session(desired_cap): - driver = webdriver.Remote(command_executor="https://LT_USERNAME:LT_ACCESS_KEY@mobile-hub.lambdatest.com/wd/hub", desired_capabilities=desired_cap) - -``` - -We have discussed how to migrate from Sauce Labs or BrowserStack to LambdaTest. Let’s explore how to migrate from the local grid to the cloud-based Appium grid. - -## Migration From Local Grid +## Migrating From Local Grid --- -### Desired Capabilities In Appium +### Step 1: Define Desired Capabilities Appium's Desired Capabilities are a collection of key-value pairs wrapped inside a JSON object. These key-value pairs request the Appium server for the required test automation session. -Let’s say you want to run an app test in Python on SAMSUNG GALAXY TAB S4 running ANDROID 10. You can define the same in the form of capability as given below. +Let’s say you want to run an Appium 3 tests in Java on ASUS ZenFone 8 running Android 13. You can define the same in the form of capability as given below. -```python -caps = [ - - { - "deviceName": "Galaxy Tab S4", - "platformName": "Android", - "platformVersion": "10", - "build": "Demo", - }, -] +```java +DesiredCapabilities capabilities = new DesiredCapabilities(); +capabilities.setCapability("platformName", "android"); +capabilities.setCapability("deviceName", "ASUS ZenFone 8"); +capabilities.setCapability("appiumVersion", "3.0.2"); +capabilities.setCapability("platformVersion", "13"); ``` -### Running Tests On LambdaTest Appium Grid +### Step 2: Authentication and Running Tests --- To begin, change the authentication in your test suite's configuration settings. To run the tests on LambdaTest Appium Grid, you need a valid user name and access key. If you were already performing tests on your local grid, you will need to modify your test script to initialize an Appium driver along with your desired capabilities. -Pass the capabilities to `@hub.lambdatest.com/wd/hub` with your LambdaTest authentication details, and you are done. Here is the sample Python test script. - -```python -#samplewikipedia.py - -import ssl - -try: - _create_unverified_https_context = ssl._create_unverified_context -except AttributeError: - # Legacy Python that doesn't verify HTTPS certificates by default - pass -else: - # Handle target environment that doesn't support HTTPS verification - ssl._create_default_https_context = _create_unverified_https_context - -from threading import Thread -import time -from selenium import webdriver -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -from selenium.common.exceptions import TimeoutException -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from appium.webdriver.common.mobileby import MobileBy -from appium import webdriver - - -# This array 'caps' defines the capabilities of the browser, device, and OS combinations where the test will run -caps = [ - - { - "deviceName": "Galaxy Tab S4", - "platformName": "Android", - "platformVersion": "10", - "app": "lt://APP10051525539885437397", - "isRealMobile": True, - "deviceOrientation": "PORTRAIT", - "visual": True, - "console": True, - "build": "Demo", - }, -] -# run_session function searches for 'lambdatest' on google.com - - -def run_session(desired_cap): - driver = webdriver.Remote( - # hub.mobile-dev-1.dev.lambdatest.io/wd/hub", - command_executor="https://LT_USERNAME:LT_ACCESS_KEY@mobile-hub.lambdatest.com/wd/hub", - desired_capabilities=desired_cap) - - # driver.get("https://www.ifconfig.me") - # time.sleep(10) - # Test case for the lambdatest sample Android app. -# If you have uploaded your app, update the test case here. - search_element = WebDriverWait(driver, 30).until( - EC.element_to_be_clickable( - (MobileBy.ACCESSIBILITY_ID, "Search Wikipedia")) - ) - search_element.click() - search_input = WebDriverWait(driver, 30).until( - EC.element_to_be_clickable( - (MobileBy.ID, "org.wikipedia.alpha:id/search_src_text")) - ) - search_input.send_keys("lambdatest") - time.sleep(5) - search_results = driver.find_elements_by_class_name( - "android.widget.TextView") - assert(len(search_results) > 0) - -# Invoke driver.quit() after the test is done to indicate that the test is completed. - driver.quit() - - -# The Thread function takes run_session function and each set of capability from the caps array as an argument to run each session in parallel -for cap in caps: - Thread(target=run_session, args=(cap,)).start() +Pass the capabilities to `@hub.lambdatest.com/wd/hub` with your LambdaTest authentication details, and you are done. -``` > That’s all! In case you have any questions or need any additional information, you could reach out at our  window.openLTChatWidget()}>**24X7 Chat Support** or mail us directly at support@lambdatest.com. +---- +