
Blog · Dokumente · Lernmittel Hub · Newsletter ≤ Zertifizierungen ≤ YouTube
Appium ist ein Tool zur Automatisierung natives, mobiles Web- und Hybridanwendungen auf iOS-, Android- und Windows -Plattformen. Es unterstützt iOS-native Apps in Objective-C oder Swift- und Android-nativen Apps, die in Java oder Kotlin geschrieben wurden. Es unterstützt auch mobile Web-Apps, auf die mit einem mobilen Browser zugegriffen wird (Appium unterstützt Safari auf iOS und Chrome oder die integrierte "Browser-App" -App auf Android). Führen Sie Appium -Automatisierungstests in LambDatests Online -Cloud durch.
Tipp: Wenn Sie keine .APK- oder .IPA -Datei haben, können Sie Ihre Beispieltests auf LambDatest mit unserem Beispiel ausführen? Android -App oder Beispiel? iOS App.
Hier finden Sie eine Liste von Sprachen und Frameworks, die vom LambDatest unterstützt werden, um Appium -Automatisierungstests auf der LambDatest Real Device Cloud -Plattform auszuführen.
| Java | Php | Rubin | C# | Python | JavaScript |
|---|---|---|---|---|---|
| Jung | Php | Gurke | C# | Benehmen | Webdriverio |
| Roboter |
Wir unterstützen alle Sprachen und Frameworks, die mit Appium kompatibel sind. Für den Fall, dass Ihr Favorit nicht in der Tabelle ist. Mach dir keine Sorgen, du kannst den Test trotzdem durchführen. Kontaktieren Sie uns für jede Hilfe.
Hinweis: Wir bereiten Dokumentation für weitere Frameworks vor. Wenn Sie möchten, dass wir die Dokumentation Ihres bevorzugten Frameworks priorisieren, können Sie uns gerne einen Schrei geben.
Laden Sie Ihre iOS -Anwendung (.IPA -Datei) oder Android -Anwendung (.APK -Datei) mithilfe unserer REST -API auf die lambDatest -Server hoch. Sie müssen Ihren Benutzernamen und AccessKey im Format Username:AccessKey im Befehl curl zur Authentifizierung angeben. Stellen Sie sicher, dass Sie den Pfad der App -Datei in der Curl -Anforderung hinzufügen. Hier ist eine Beispiel -Curl -Anfrage, um Ihre App mithilfe unserer REST -API hochzuladen:
Für macOS/Linux:
curl - u "{username}:{accesskey}"
-- location -- request POST 'https: //manual-api.lambdatest.com/app/upload/realDevice'
-- form 'name="Android_App"'
-- form 'appFile=@"/Users/{desktop_username}/Desktop/LT_Java_Appium/proverbial_android.apk"'Für Fenster:
curl - u "{username}:{accesskey}" - X POST "https://manual-api.lambdatest.com/app/upload/realDevice" - F "appFile=@" / Users / Desktop_username / Desktop / LT_Java_Appium / proverbial_android . apk ""Verwenden von App -URL:
Für macOS/Linux:
curl - u "${ YOUR_LAMBDATEST_USERNAME()}:${ YOUR_LAMBDATEST_ACCESS_KEY()}"
-- location -- request POST 'https: //manual-api.lambdatest.com/app/upload/realDevice'
-- form 'name="Android_App"'
-- form 'url="https://prod-mobile-artefacts.lambdatest.com/assets/docs/proverbial_android.apk"'Für Fenster:
curl - u "${ YOUR_LAMBDATEST_USERNAME()}:${ YOUR_LAMBDATEST_ACCESS_KEY()}"
- X POST "https://manual-api.lambdatest.com/app/upload/realDevice"
- d "{"url":"https://prod-mobile-artefacts.lambdatest.com/assets/docs/proverbial_android.apk",
"name":"sample.apk"'Info Hinweis:
Die Reaktion der obigen Curl ist ein JSON -Objekt, das die App URL des Formats enthält - lt: // app123456789123456789 und im nächsten Schritt verwendet.
Hier ist ein Beispielautomatisierungsskript in Java für die oben heruntergeladene Beispiel -App. Stellen Sie sicher, dass app_url , username und accesskey im folgenden Code aktualisiert werden.
import io . appium . java_client . AppiumDriver ;
import io . appium . java_client . MobileBy ;
import io . appium . java_client . MobileElement ;
import io . appium . java_client . android . AndroidElement ;
import org . openqa . selenium . remote . DesiredCapabilities ;
import org . openqa . selenium . support . ui . ExpectedConditions ;
import org . openqa . selenium . support . ui . WebDriverWait ;
import java . net . URL ;
import java . util . List ;
public class AndroidApp {
public static String userName = "username" ; //Enter your LT Username here
public static String accessKey = "accesskey" ; //Enter your LT AccessKey here
public String gridURL = "@mobile-hub.lambdatest.com/wd/hub" ;
String DeviceValue ;
String versionValue ;
String PlatformValue ;
@ org . testng . annotations . Parameters ( value = { "device" , "version" , "platform" })
public AndroidApp ( String device , String version , String platform ) {
try {
DeviceValue = device ;
versionValue = version ;
PlatformValue = platform ;
DesiredCapabilities capabilities = new DesiredCapabilities ();
capabilities . setCapability ( "build" , "ParallelSample Android" );
capabilities . setCapability ( "name" , platform + " " + device + " " + version );
capabilities . setCapability ( "deviceName" , device );
capabilities . setCapability ( "platformVersion" , version );
capabilities . setCapability ( "platformName" , platform );
capabilities . setCapability ( "isRealMobile" , true );
//AppURL (Create from Wikipedia.apk sample in project)
capabilities . setCapability ( "app" , "app url" ); //Enter your app URL from previous step here
capabilities . setCapability ( "deviceOrientation" , "PORTRAIT" );
capabilities . setCapability ( "console" , true );
capabilities . setCapability ( "network" , true );
capabilities . setCapability ( "visual" , true );
capabilities . setCapability ( "devicelog" , true );
String hub = "https://" + userName + ":" + accessKey + gridURL ;
AppiumDriver driver = new AppiumDriver ( new URL ( hub ), capabilities );
MobileElement color = ( MobileElement ) driver . findElementById ( "com.lambdatest.proverbial:id/color" );
//Changes color
color . click ();
//Back to black color
color . click ();
MobileElement text = ( MobileElement ) driver . findElementById ( "com.lambdatest.proverbial:id/Text" );
//Changes the text to proverbial
text . click ();
//toast is visible
MobileElement toast = ( MobileElement ) driver . findElementById ( "com.lambdatest.proverbial:id/toast" );
toast . click ();
//notification is visible
MobileElement notification = ( MobileElement ) driver . findElementById ( "com.lambdatest.proverbial:id/notification" );
notification . click ();
//Open 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 el10 = ( MobileElement ) driver . findElementByXPath ( "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.widget.RelativeLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.RelativeLayout/android.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View/android.view.View[1]/android.view.View[3]/android.view.View[1]/android.view.View/android.widget.Button" );
el10 . click ();
Thread . sleep ( 25000 );
MobileElement el11 = ( MobileElement ) driver . findElementByXPath ( "//android.widget.FrameLayout[@content-desc= " Home " ]/android.widget.FrameLayout/android.widget.ImageView" );
el11 . click ();
//Opens the browser
MobileElement browser = ( MobileElement ) driver . findElementByAccessibilityId ( "Browser" );
browser . click ();
MobileElement el13 = ( MobileElement ) driver . findElementById ( "com.lambdatest.proverbial:id/url" );
el13 . sendKeys ( "www.lambdatest.com" );
MobileElement el14 = ( MobileElement ) driver . findElementById ( "com.lambdatest.proverbial:id/find" );
el14 . click ();
driver . quit ();
} catch ( Exception t ) {
System . out . println ();
}
}
} import io . appium . java_client . AppiumDriver ;
import io . appium . java_client . MobileElement ;
import org . openqa . selenium . JavascriptExecutor ;
import org . openqa . selenium . remote . DesiredCapabilities ;
import java . net . URL ;
public class iOSApp {
public static String userName = "username" ; //Enter your LT Username here
public static String accessKey = "accesskey" ; //Enter your LT AccessKey here
public String gridURL = "@mobile-hub.lambdatest.com/wd/hub" ;
String DeviceValue ;
String versionValue ;
String PlatformValue ;
AppiumDriver driver ;
@ org . testng . annotations . Parameters ( value = { "device" , "version" , "platform" })
public iOSApp ( String device , String version , String platform ) {
try {
DeviceValue = device ;
versionValue = version ;
PlatformValue = platform ;
DesiredCapabilities capabilities = new DesiredCapabilities ();
capabilities . setCapability ( "build" , "ParallelSample iOS" );
capabilities . setCapability ( "name" , platform + " " + device + " " + version );
capabilities . setCapability ( "deviceName" , device );
capabilities . setCapability ( "platformVersion" , version );
capabilities . setCapability ( "platformName" , platform );
capabilities . setCapability ( "isRealMobile" , true );
//AppURL (Create from proverbial.ipa sample in project)
capabilities . setCapability ( "app" , "app url" ); //Enter your app URL from previous step here
capabilities . setCapability ( "deviceOrientation" , "PORTRAIT" );
capabilities . setCapability ( "console" , true );
capabilities . setCapability ( "network" , true );
capabilities . setCapability ( "visual" , true );
capabilities . setCapability ( "devicelog" , true );
//capabilities.setCapability("geoLocation", "HK");
String hub = "https://" + userName + ":" + accessKey + gridURL ;
driver = new AppiumDriver ( new URL ( hub ), capabilities );
MobileElement color = ( MobileElement ) driver . findElementByAccessibilityId ( "Colour" );
//Changes color
color . click ();
//Back to black color
color . click ();
MobileElement text = ( MobileElement ) driver . findElementByAccessibilityId ( "Text" );
//Changes the text to proverbial
text . click ();
//toast is visible
MobileElement toast = ( MobileElement ) driver . findElementByAccessibilityId ( "Toast" );
toast . click ();
//notification is visible
MobileElement notification = ( MobileElement ) driver . findElementByAccessibilityId ( "Notification" );
notification . click ();
//Open the geolocation page
MobileElement geo = ( MobileElement ) driver . findElementByAccessibilityId ( "GeoLocation" );
geo . click ();
Thread . sleep ( 5000 );
//Takes back
driver . navigate (). back ();
//Takes to speed test page
MobileElement speedtest = ( MobileElement ) driver . findElementByAccessibilityId ( "Speed Test" );
speedtest . click ();
Thread . sleep ( 5000 );
MobileElement el10 = ( MobileElement ) driver . findElementByAccessibilityId ( "start speed test - connection type multi" );
el10 . click ();
Thread . sleep ( 25000 );
driver . navigate (). back ();
//Opens the browser
MobileElement browser = ( MobileElement ) driver . findElementByAccessibilityId ( "Browser" );
browser . click ();
Thread . sleep ( 3000 );
MobileElement el4 = ( MobileElement ) driver . findElementByAccessibilityId ( "Search" );
el4 . click ();
el4 . sendKeys ( "Lambdatest" );
(( JavascriptExecutor ) driver ). executeScript ( "lambda-status=passed" );
driver . quit ();
} catch ( Exception t ) {
System . out . println ();
(( JavascriptExecutor ) driver ). executeScript ( "lambda-status=failed" );
driver . quit ();
}
}
}.XML -Datei, um Ihren Test auszuführen und Gerätefunktionen zu definieren. Weitere Informationen finden Sie im folgenden Beispielcode. <? xml version = " 1.0 " encoding = " UTF-8 " ?>
<! DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
< suite thread-count = " 100 " name = " Mobile " parallel = " tests " >
< test name = " AppTest 1 " >
< parameter name = " version " value = " 11 " />
< parameter name = " platform " value = " Android " />
< parameter name = " device " value = " Galaxy S21 Ultra 5G " />
< classes >
< class name = " AndroidApp " />
</ classes >
</ test >
< test name = " AppTest 2 " >
< parameter name = " version " value = " 11 " />
< parameter name = " platform " value = " Android " />
< parameter name = " device " value = " Galaxy S21 " />
< classes >
< class name = " AndroidApp " />
</ classes >
</ test >
</ suite ><? xml version = " 1.0 " encoding = " UTF-8 " ?>
<! DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
< suite thread-count = " 100 " name = " Mobile " parallel = " tests " >
< test name = " iOSApp 1 " >
< parameter name = " version " value = " 14 " />
< parameter name = " platform " value = " iOS " />
< parameter name = " device " value = " iPhone 11 " />
< classes >
< class name = " iOSApp " />
</ classes >
</ test >
< test name = " iOSApp 2 " >
< parameter name = " version " value = " 14 " />
< parameter name = " platform " value = " iOS " />
< parameter name = " device " value = " iPhone 12 Pro " />
< classes >
< class name = " iOSApp " />
</ classes >
</ test >
</ suite > Debuggen und Ihren Code ausführen. Führen Sie iOSApp.java oder AndroidApp.java in Ihrem Herausgeber aus.
Sobald Sie Ihre Tests ausgeführt haben, können Sie die Testausführung zusammen mit Protokollen anzeigen. Sie können sehen, dass die Testfälle bestehen oder fehlschlagen. Sie können dasselbe bei LambDatest Automation anzeigen.
Beispielfunktionen für Android und iOS werden unten erwähnt -
{
"deviceName" : "Galaxy Tab S4" ,
"platformName" : "android" ,
"platformVersion" : "10" ,
"app" : "App_url" ,
"visual" : True ,
"console" : True ,
"deviceOrientation" : "PORTRAIT" ,
"build" : "new-12" ,
"isRealMobile" : True ,
} {
"deviceName": "iPhone 12 Mini",
"platformName": "ios",
"platformVersion": "14",
"app": "App_url",
"isRealMobile": True,
"visual": True,
"console": True,
"build": "lt-web-4",
"network": True,
}
HINWEIS: Obligatorische Felder sind mit Sternchen * markiert *
| SCHLÜSSEL | WERTE | Fähigkeitsbeschreibung |
|---|---|---|
| *Benutzer | Typ: Zeichenfolge | Ihr LT -Benutzername. |
| *AccessKey | Typ: Zeichenfolge | Ihr LT -Zugriffstaste. |
| bauen | Typ: Zeichenfolge Standardeinstellung: Ohne Titel build=iOS Small Run | Sie können Ihre Tests wie einen Job mit mehreren Tests gruppieren. |
| Name | Typ: Zeichenfolge Standard: Testid des Tests. Ungefähr der Name wird nicht übergeben. name=iphone 6 Small Run | Name Ihres Tests. |
| Projekt | Bleibt leer, falls das Projekt nicht in der Lage ist.project=Small Run | Sie können Ihre Builds wie ein Projekt mit mehreren Jobs gruppieren. |
| *DeviceName | Typ: ZeichenfolgeiPhone 13 | Name des Geräts. |
| *Plattformname | Typ: Zeichenfolgeios | Name des Betriebssystems. |
| *Plattformversion | Typ: Zeichenfolge14 | Betriebssystemversion. |
| *App | Typ: Zeichenfolgeapp=lt://APP100201061631704657918380 | Akzeptiert die App -URL, die nach dem Hochladen einer App auf den LambDatest -Servern zurückgegeben wurde. |
| QueueTimeout | Typ: Zeichenfolge Standard: 600 queueTimeout=300 | Diese Fähigkeit kann verwendet werden, um den Zeitlimitwert des Warteschlangens innerhalb eines Bereichs zu ändern. QueueTimeout-Bereich: 300-900. |
| idletimeout | Typ: Zeichenfolge Standard: 120 idleTimeout=120 | Diese Fähigkeit kann verwendet werden, um den Zeitüberschreitungswert zu ändern. |
| visuell | Typ: boolean Standard: Falsch visual=TRUEODER visual=FALSE | Der Befehl by Command Screenshots wird in jedem Testschritt aufgezeichnet. Standardmäßig wird das Flag als ausgeschaltet eingestellt. Hinweis: Die Testausführungszeit erhöht sich, wenn sie als "wahr" festgelegt wird. |
| Video | Typ: boolean Standard: wahr video=TRUEODER video=FALSE | Videoaufzeichnung des gesamten Bildschirms. |
| Devicelog | Typ: boolean Standard: wahr devicelog=TRUEODER devicelog=FALSE | Aktivieren Sie Geräteprotokolle. |
| Netzwerk | Typ: boolean Standard: wahr network=TRUEODER network=FALSE | Aktivieren Sie Netzwerkprotokolle. |
| Geräteorientierung | Typ: ZeichenfolgedeviceOrientation=portraitODER deviceOrientation=landscape | Ändern Sie die Bildschirmausrichtung des Geräts. |
| Tunnel | Typ: booleantunnel=TRUEODER tunnel=FALSE | Um lokale Anwendungen mit LambDatest zu testen. |
| Tunnelname | Typ: booleantunnelName=RabbitHole | Name des Tunnels. |
| DedicedProxy | Typ: booleandedicatedProxy=TRUEODER dedicatedProxy=FALSE | Dedizierter Proxy. |
| Autograntperisions | Typ: booleanautoGrantPermissions=TRUEODER autoGrantPermissions=FALSE | Lassen Sie Appium automatisch bestimmen, welche Berechtigungen Ihre App benötigt, und gewähren Sie es der App bei der Installation. Standardmäßig falsch. Wenn NoresSet wahr ist, funktioniert diese Fähigkeit nicht. |
| Autodismissalerts | Typ: booleanautoDismissAlerts=TRUEODER autoDismissAlerts=FALSE | [Nur iOS] Appium -Fähigkeit, Warnmeldungen/Popups auf iOS -Geräten abzulehnen. |
| Autoakzeptallerte | Typ: booleanautoAcceptAlerts=TRUEODER autoAcceptAlerts=FALSE | [Nur iOS] Appium -Fähigkeit, Warnmeldungen/Popups auf iOS -Geräten zu akzeptieren. |
| Newcommandimeout | Typ: Zeichenfolge60 | Wie lange (in Sekunden) Appium auf einen neuen Befehl des Kunden warten, bevor der Client beendet und die Sitzung beendet. |
| Sprache | Typ: Zeichenfolgefr | Sprache, die für iOS (nur XCuitest -Treiber) und Android festgelegt werden soll. |
| Gebietsschema | Typ: Zeichenfolgefr_CA, CA | Gebietsschema für iOS (nur XCuitest -Treiber) und Android. FR_CA -Format für iOS. CA -Format (Abkürzung des Ländernamens) für Android. |
| Norset | Typ: booleantrue | Setzen Sie den App -Status vor dieser Sitzung nicht zurück. Weitere Informationen finden Sie hier. |
| AutomationName | Typ: boolean Standard: Appium automationName = Appium | Welche Automatisierungsmotor zu verwenden. HINWEIS: In dem App -Automatisierungscode der App als falsch festgelegt, kann also nicht geändert werden. Appium (Standard) oder Uiautomator2, Espresso oder Uiautomator1 für Android oder Xcuitest oder Instrumente für iOS oder YouiEngine für Anwendung, die mit YouiEngine erstellt wurden. |
| EventTimings | Typ: boolean Standard: Falsch true | Aktivieren oder deaktivieren Sie die Berichterstattung über die Zeiten für verschiedene Appium-interne Ereignisse (z. B. Start und Ende jedes Befehls usw.). Verwenden Sie true. Die Zeiten werden dann als Ereigniseigenschaften über die Reaktion auf die Abfrage der aktuellen Sitzung gemeldet. Sehen Sie sich die Event -Timing -Dokumente für die Struktur dieser Antwort an. |
| Geolokalisierung | Typ: Zeichenfolgefr | Ermöglicht das mobile Verhalten von verschiedenen Standorten, indem Sie IP -Adressen auswählen, die in mehreren Ländern auf der ganzen Welt gehostet werden. |
| Andere Anaps | Typ: Array von Saiten Standardeinstellung: [] oder leeres Array "otherApps":["lt://APP1002211081648217405891389","lt://APP1002211081648217429465823"] | "Akzeptiert die Liste der App -URL, die nach dem Hochladen einer App auf den LambDatest -Servern zurückgegeben wurde. Bedingungen zu erfüllen: 1. Die App sollte auch übergeben werden, wenn „andere Anends“ bestanden werden. 2. Länge der App -URL Array <= 3. 3. Bei max. 3 können weitere Apps installiert werden. V. 5. Kein dupliziert in 'OtherApp' Array. " |
Hast du irgendwelche Fragen? Bitte wenden Sie sich an unseren 24x7 -Chat -Support , oder Sie können uns auch an [email protected] senden.
Mit dem LambDatest -Tunnel können Sie auf der LambDatest Appium Test Automation -Plattform lokale und privat gehostete Apps auf verschiedenen echten Android- und iOS -Geräten testen. LambDatest Tunnel verwendet Protokolle wie Web Socket, HTTPS, SSH (Secure Shell) und mehr, um eine sichere und eindeutige Tunnelverbindung zwischen Ihrem lokalen System und LambDatest -Cloud -Servern aufzubauen.
Erfahren Sie in dieser Dokumentation, wie Sie den LambDatest -Tunnel konfigurieren, um lokale oder privat gehostete Apps zu testen, während Sie mobile App -Automatisierung durchführen.
Um Apps lokal zu testen, müssen Sie konfigurieren:
Verbindung mit LambDatest Tunnel.
Testen Sie Skripte, die über den LambDatest -Tunnel ausgeführt werden können.
Nachfolgend sind die Schritte zum Konfigurieren der Verbindung mit dem LambDatest -Tunnel aufgeführt.
Extrahieren Sie die heruntergeladene Binärdatei.
Navigieren Sie zur Eingabeaufforderung und verweisen Sie auf das Verzeichnis/den Ordner, in dem Sie die Binärdatei extrahiert haben.
Führen Sie den folgenden Befehl im Terminal aus.
. / LT -- user { user 's login email} --key {user' s access key } -- tunnelName { user 's tunnel name} Nach Konfiguration der Verbindung mit LambDatest -Tunnel müssen Sie den Capability tunnel auf True einstellen.
| Schlüssel | Werte | Beschreibung | Gewünschte Fähigkeit |
|---|---|---|---|
| Tunnel | wahr/falsch | Konfigurieren Sie den Tunnel | "tunnel" : True, |
Sie können auch die tunnel mit LambDatest -Funktionsgenerator hinzufügen.
Falls Sie Fragen haben oder zusätzliche Informationen benötigen, geben Sie sie bei unserem 24x7 -Chat -Support ab oder senden Sie uns direkt an [email protected].
Ein GUI -Inspektor für mobile Apps und mehr, der von einem (separat installierten) Appium -Server betrieben wird. Appium Inspector ist ein Appium -Client (wie WebDriverio, den Java -Client von Appium, den Python -Client von Appium usw.) mit einer Benutzeroberfläche. Wir können die Schnittstelle zum Angeben von Appium -Serverversion und Einstellungsfunktionen verwenden. Sobald der Appium -Server mit der App gestiegen ist, können wir mit Elementen interagieren und andere Appium -Befehle ausführen.
Am Ende dieses Themas können Sie in der Lage sein:
Laden Sie Ihre iOS -Anwendung (.IPA -Datei) oder Android -Anwendung (.APK -Datei) mithilfe unserer REST -API auf die lambDatest -Server hoch. Sie müssen Ihren Benutzernamen und AccessKey im Format Username:AccessKey im Befehl curl zur Authentifizierung angeben. Stellen Sie sicher, dass Sie den Pfad der App -Datei in der Curl -Anforderung hinzufügen. Hier ist eine Beispiel -Curl -Anfrage, um Ihre App mithilfe unserer REST -API hochzuladen:
Verwenden von App -Datei:
Für iOS:
curl - u "{usename}:{accesskey}"
-- location -- request POST 'https: //manual-api.lambdatest.com/app/upload/realDevice'
-- form 'name="Android_App"'
-- form 'url="https://prod-mobile-artefacts.lambdatest.com/assets/docs/proverbial_android.apk"'Für Fenster:
curl - u "YOUR_LAMBDATEST_USERNAME:YOUR_LAMBDATEST_ACCESS_KEY" - X POST "https://manual-api.lambdatest.com/app/upload/realDevice" - F "appFile=@" / Users / macuser / Downloads / proverbial_android . apk "'Verwenden von App -URL:
Für macOS/Linux:
curl - u "YOUR_LAMBDATEST_USERNAME:YOUR_LAMBDATEST_ACCESS_KEY"
-- location -- request POST 'https: //manual-api.lambdatest.com/app/upload/realDevice'
-- form 'name="Android_App"'
-- form 'url="https://prod-mobile-artefacts.lambdatest.com/assets/docs/proverbial_android.apk"'Für Fenster:
curl - u "YOUR_LAMBDATEST_USERNAME:YOUR_LAMBDATEST_ACCESS_KEY" - X POST "https://manual-api.lambdatest.com/app/upload/realDevice" - d "url":"https://prod-mobile-artefacts.lambdatest.com/assets/docs/proverbial_android.apk","name":"sample.apk"'Tipp:
App URL des Formats enthält - lt: // app123456789123456789 und im nächsten Schritt verwendet.Starten Sie den Appium Inspector und wählen Sie LambDatest aus der Liste der Cloud -Testanbieter.
Geben Sie Ihren Benutzernamen und Zugriffsschlüssel ein. Möglicherweise finden Sie die Anmeldeinformationen auf LambDatest Dashboard
Konfigurieren Sie LambDatest -Funktionen in der Registerkarte "gewünschte Funktionen" auf Appium Inspector. Verwenden Sie die in Schritt 1 erhaltene eindeutige App -URL, um den App -Funktionswert festzulegen. Eine Liste aller von LambDatest unterstützten Funktionen finden Sie hier
Alternativ können wir auch zu unserem Funktionsgenerator gehen und die Fähigkeitsdarstellung mit GUI generieren.

Sobald dies abgeschlossen ist, können Sie den Test jetzt ausführen, indem Sie auf Start Session klicken. Sobald Sie die Sitzung gestartet haben, ist eine Videoaufzeichnung zusammen mit detaillierten Informationen und Protokollen des Testlaufs auf dem LambDatest -Dashboard verfügbar.

Hast du irgendwelche Fragen?
Bitte wenden Sie sich an unseren 24x7 -Chat -Support , oder Sie können uns auch an [email protected] senden.
In dieser Dokumentation betrachten wir einige APIs, mit denen Sie Ihren Workflow für mobile App -Tests optimieren können. Wenn Sie live oder automatisierte App -Tests durchführen, können Sie diese APIs verwenden, um die Apps abzurufen und zu löschen.
Um die Liste Ihrer hochgeladenen Apps zusammen mit ihren App -IDs abzurufen, führen Sie den folgenden Curl -Befehl aus.
curl -- location -- request GET 'https://YOUR_LAMBDATEST_USERNAME:[email protected]/app/data?type=ios&level=user'Nachfolgend ist die Antwort auf die obige Curl -Anforderung angezeigt.
{ "metaData" : { "type" : "ios" , "total" : 1 } ,
"data" : [ {
"app_id" : "APP100245789181570497850" ,
"name" : "proverbial_ios.ipa" ,
"type" : "ios" ,
"updated_at" : "2022-05-10T11:19:30.000Z" ,
"shared" : false ,
"source" : "web-client"
} ] Führen Sie den folgenden Curl -Befehl aus, um Ihre verbesserten Apps zu löschen.
curl -- location -- request DELETE 'https: //YOUR_LAMBDATEST_USERNAME:[email protected]/app/delete'
-- header 'Content-Type: application/json'
-- data - raw ' {
"appIds" : "APPID1,APPID2"
} 'Nachfolgend ist die Antwort auf die obige Curl -Anforderung angezeigt.
{ "message" : "Deleted successfully." }Das ist alles! Für den Fall, dass Sie Fragen haben oder zusätzliche Informationen benötigen, können Sie sich bei unserem 24x7 -Chat -Support wenden oder uns direkt unter [email protected] senden.
LambDatest bietet ein Online -Appium -Automatisierungsnetz an, um die App -Automatisierung durchzuführen. Das Online -Appiumnetz ist in lokalem Netz, BrowsStack, Saucelabs und LambDatest erhältlich. Daher können Sie Ihre aktuellen Appium -Automatisierungsskripte (oder Suiten) mühelos von lokalem Netz, Sauce Labs oder BrowsStack nach LambDatest migrieren.
In dieser Dokumentation sehen wir uns an, wie Sie LambDatest Cloud für die App -Automatisierung nutzen und Ihre Testskripte (oder Testsuiten) aus Ihrem lokalen Netz, Sauce Labs oder BrowsStack migrieren. Sie können die gewünschten Funktionen von LambDatest in Ihren Tests verwenden, Ihre Testsitzung authentifizieren und Tests in der Cloud durchführen.
Die Migration Ihres aktuellen lokalen Netzes, BrowesSestack- oder Sauce Labs -Tests nach LambDatest erfordert ein paar Änderungen in Ihrem Code. In diesem Handbuch werden wir uns ansehen, wie Sie die gewünschten Funktionen von LambDatest in Ihren Tests nutzen, Ihre Testsitzung authentifizieren und Tests in unseren Cloud -Browsern durchführen.
Um vom lokalen Netz, BrowesSestack- oder Sauce Labs nach LambDatest zu wechseln, müssen Sie einige Änderungen an Ihren Testsuiten wie Authentifizierung, gewünschten Funktionen usw. vornehmen.
Zunächst müssen Sie die Authentifizierung in den Konfigurationseinstellungen Ihrer Testsuite ändern. Für das Ausführen von Tests im LambDatest Appium Grid müssen Sie über einen gültigen user_name und access_key verfügen, um Tests auf unserem Cloud -Netz durchzuführen. Falls Sie kein Konto auf Lambdatest haben, besuchen Sie die LambDatest -Anmeldeseite und erstellen Sie ein neues Konto.
Im Folgenden sind die Änderungen in den Parametern aufgeführt:
Sie finden den Username und Access Key im Abschnitt LambDatest Profile des Automatisierungs -Dashboards .

Wenn Sie von BrowsStack oder Saucelabs nach LambDatest migrieren, müssen Sie die folgenden Änderungen im vorhandenen Code vornehmen:
Hier ist ein Nebenseitigkeitsvergleich jeder der oben hervorgehobenen Felder:
| Eigentum | Typ | Sträuber | Saucelabs | Lambdatest |
|---|---|---|---|---|
| Benutzername | Saite | Benutzername, um auf Appium Grid auf BrowsSstack zuzugreifen | Benutzername, um auf Appium Grid in Sauce Labs zuzugreifen | Benutzername, um auf Appium Grid auf LambDatest zuzugreifen |
| AccessKey | Saite | AccessKey, um auf Appium Grid auf BrowsStack zuzugreifen | AccessKey, um auf Appium Grid in Sauce Labs zuzugreifen | AccessKey, um auf Appium Grid auf LambDatest zuzugreifen |
| Hub URL | Saite | @Hub-cloud.browStack.com/wd/Hub | Ondemand.us-west-1.saucelabs.com/wd/hub | @Hub.lambdatest.com/WD/HUB |
Für eine pythonbasierte Implementierung finden Sie hier die Änderungen im Skript für den Authentifizierungsprozess.
Sträuber
userName = "BrowserStack_UserName"
accessKey = "BrowserStack_AccessKey"Saucelabs
userName = "SAUCE_USERNAME"
accessKey = "SAUCE_ACCESS_KEY"Lambdatest
userName = "LambdaTest_UserName"
accessKey = "LambdaTest_AccessKey"Jetzt müssen Sie die Hub -URL in den Konfigurationseinstellungen Ihrer Testsuite ändern. Die Hub -URL ist vom String -Typ und gibt den Hub -Speicherort an, an den die Appium -Tests zur Ausführung geleitet werden.
Für eine pythonbasierte Implementierung finden Sie hier die Änderungen im Skript für Hub-URL.
Sträuber
@hub-cloud.browserstack.com/wd/hub
Saucelabs
@ondemand.us-west-1.saucelabs.com/wd/hub
Lambdatest
@mobile-hub.lambdatest.com/wd/hub
Mit Funktionen des Generators können Sie die gewünschten Funktionen (oder Funktionen) angeben, die Konfigurationsoptionen sind, mit denen Sie Folgendes angeben können:
Sie können auch andere erweiterte Optionen auswählen, die im LambDatest -Funktionsgenerator verfügbar sind.
Für die Migration haben wir Java-basierte Appium-Tests durchgeführt. Im Folgenden finden Sie die Screenshots des Capability -Generators von BrowsStack und LambDatest.



Der Vergleich der von BrowsStack und LambDatest Capabilities Generator erzeugten Funktionen:
| Fähigkeiten | Sträuber | Saucelabs | Lambdatest |
|---|---|---|---|
| Gerät | Gerät | DeviceName | DeviceName |
| Betriebssystem | OS_VERSION | Plattformversion | Plattformversion |
Das Folgende ist ein Überblick über den Vergleich der gewünschten Funktionen für die Java -Sprache:
Sträuber
//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
//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
//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" ) ;Schauen wir uns ein Beispiel an, das den gesamten Migrationsprozess zeigt. Das Testszenario besteht darin, eine Wikipedia -App zu öffnen, die den Begriff "LambDatest" durchsucht. Der folgende Test wird auf Google Pixel 3 ausgeführt, das Android 11 ausführt.
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" : "<app_url>"
}
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 () #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:[email protected]/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 () #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" : "<lt_app_url>" ,
"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:[email protected]/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 ()Der Großteil der Implementierung bleibt, wie oben gezeigt, unverändert. Es werden nur Änderungen an der Infrastruktur vorgenommen (dh anstelle von BrowsStack werden die App -Automatisierungstests auf LambDatest durchgeführt).
Lassen Sie uns analysieren, was sich aus der Implementierung geändert hat.
Sträuber
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" : "<app_url>"
}
driver = webdriver . Remote ( "https://" + userName + ":" + accessKey + "@hub-cloud.browserstack.com/wd/hub" , desired_caps )Saucelabs
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:[email protected]/wd/hub" ,
desired_capabilities = desired_cap )Lambdatest
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" : "<lt_app_url>" ,
"build" : "Demo" ,
},
]
def run_session ( desired_cap ):
driver = webdriver . Remote ( command_executor = "https://LT_USERNAME:[email protected]/wd/hub" , desired_capabilities = desired_cap )Wir haben diskutiert, wie man von Sauce Labs oder Brows verstärkt nach lambdatest migriert. Lassen Sie uns untersuchen, wie Sie vom lokalen Netz zum Cloud-basierten Appium-Netz migrieren.
Die gewünschten Funktionen von Appium sind eine Sammlung von Schlüsselwertpaaren, die in einem JSON-Objekt eingewickelt sind. Diese Schlüsselwertpaare fordern den Appium-Server für die erforderliche Testautomatisierungssitzung an.
Nehmen wir an, Sie möchten einen App -Test in Python auf dem Samsung Galaxy Tab S4 ausführen, das Android 10 ausführt. Sie können dasselbe in Form von Fähigkeiten definieren, wie unten angegeben.
caps = [
{
"deviceName" : "Galaxy Tab S4" ,
"platformName" : "Android" ,
"platformVersion" : "10" ,
"build" : "Demo" ,
},
]Ändern Sie zunächst die Authentifizierung in den Konfigurationseinstellungen Ihrer Testsuite. Um die Tests im LambDatest Appium Grid auszuführen, benötigen Sie einen gültigen Benutzernamen und Zugriffsschlüssel. Wenn Sie bereits Tests in Ihrem lokalen Netz durchgeführt haben, müssen Sie Ihr Testskript ändern, um einen Appium -Treiber zusammen mit den gewünschten Funktionen zu initialisieren.
Geben Sie die Funktionen an @hub.lambdatest.com/wd/hub mit Ihren LambDatest -Authentifizierungsdetails weiter und Sie sind fertig. Hier ist das Beispielpython -Testskript.
#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:[email protected]/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 ()Das ist alles! Für den Fall, dass Sie Fragen haben oder zusätzliche Informationen benötigen, können Sie sich bei unserem 24x7 -Chat -Support wenden oder uns direkt unter [email protected] senden.
Besuchen Sie die folgenden Links, um mehr über LambDatests Funktionen, Setup und Tutorials zu Testautomation, mobilen App -Tests, Responsive -Tests und manuellen Tests zu erfahren.
Die LambDatest -Community ermöglicht es den Menschen, mit Technologie -Enthusiasten zu interagieren. Verbinden Sie, stellen Sie Fragen und lernen Sie von technisch versierten Menschen. Best Practices in Webentwicklung, Tests und DevOps mit Fachleuten aus der ganzen Welt diskutieren?
Besuchen Sie ChangeLog, um mit den neuesten Funktionen und Produkten auf dem neuesten Stand zu bleiben
LambDatest ist eine führende Test- und Orchestrierungsplattform für Test- und Orchestrierung, die schnell, zuverlässig, skalierbar und sicher ist. Dadurch können Benutzer sowohl manuelle als auch automatisierte Tests von Web- und Mobile -Apps in mehr als 3000 verschiedenen Browsern, Betriebssystemen und realen Gerätekombinationen ausführen. Mit LambDatest können Unternehmen ein schnelleres Feedback des Entwicklers gewährleisten und somit schneller auf den Markt gehen. Über 500 Unternehmen und mehr als 1 Million Benutzer in über 130 Ländern verlassen sich auf Lambdatest für ihre Testbedürfnisse.
