Java 两个设备问题上的Appium并行执行

Java 两个设备问题上的Appium并行执行,java,testng,appium,selenium-grid,appium-android,Java,Testng,Appium,Selenium Grid,Appium Android,您好,我对2台设备的Appium并行执行有一个非常奇怪的问题 我所拥有的: 安卓设备1 安卓设备2 具有不同Appium服务器的两个selenium网格节点 (我尝试使用一台appium服务器,但使用两个不同的系统端口,实现相同的功能) 每次我并行运行测试时,在同一个设备(而不是两个设备)上启动两个线程,我的测试就会崩溃 我的代码: testng.xml: 测试示例: package global.APP.starter; 进口全球驱动因素; 导入org.testng.annotations

您好,我对2台设备的Appium并行执行有一个非常奇怪的问题

我所拥有的:

  • 安卓设备1
  • 安卓设备2
  • 具有不同Appium服务器的两个selenium网格节点 (我尝试使用一台appium服务器,但使用两个不同的系统端口,实现相同的功能)
  • 每次我并行运行测试时,在同一个设备(而不是两个设备)上启动两个线程,我的测试就会崩溃

    我的代码:

    testng.xml:

    
    
    测试示例:

    package global.APP.starter;
    进口全球驱动因素;
    导入org.testng.annotations.*;
    公共类测试示例{
    公共驾驶员drv=新驾驶员();
    @参数({“platformName”、“deviceName”、“platformVersion”、“udid”、“port”、“systemPort”})
    @试验
    public void testLoginAndLogout(字符串platformName、字符串deviceName、字符串platformVersion、字符串udid、字符串端口、字符串systemPort)引发异常{
    drv.MultipleDriver(平台名称、设备名称、平台版本、udid、端口、系统端口);
    }
    @后置法
    公共空间践踏(){
    drv.closeDriver();
    }
    }
    
    Drivers.java

    导入com.codeborne.selenide.WebDriverRunner;
    导入io.appium.java_client.AppiumDriver;
    导入io.appium.java_client.MobileDriver;
    导入io.appium.java_client.MobileElement;
    导入io.appium.java_client.android.AndroidDriver;
    导入io.appium.java_client.ios.IOSDriver;
    导入io.appium.java_client.remote.AndroidMobileCapabilityType;
    导入io.appium.java_client.remote.MobileCapabilityType;
    导入org.openqa.selenium.WebElement;
    导入org.openqa.selenium.remote.DesiredCapabilities;
    导入org.testng.Assert;
    导入java.net.MalformedURLException;
    导入java.net.URL;
    导入java.util.concurrent.TimeUnit;
    公营司机{
    公共静态应用程序驱动程序;
    公众静态期望能力上限;
    公共应用程序驱动程序多路复用器(字符串平台名、字符串设备名、,
    字符串平台版本,字符串udid,
    字符串端口、字符串系统端口)引发错误的异常{
    cap=新的期望能力();
    if(platformName.equals(“iOS”)){
    上限设定能力(“平台版本”,平台版本);
    cap.setCapability(“bundleId”、“com.app.app”);
    cap.setCapability(“平台名称”,平台名称);
    cap.setCapability(“deviceName”,deviceName);
    上限设定能力(“udid”,udid);
    }
    if(platformName.equals(“Android”)){
    cap.setCapability(“app”,“/Users/usr/Desktop/app/app.apk”);
    cap.setCapability(“平台名称”,平台名称);
    cap.setCapability(“deviceName”,deviceName);
    上限设定能力(“udid”,udid);
    cap.setCapability(AndroidMobileCapabilityType.SYSTEM\u端口,systemPort);
    cap.setCapability(“automationName”、“UiAutomator2”);
    }
    cap.setCapability(“noReset”,正确);
    上限设置能力(“完全重置”,错误);
    if(platformName.equals(“iOS”))
    驱动程序=新的IOSDriver(新的URL(“http://0.0.0.0:“+端口+”/wd/hub“),盖);
    else if(platformName.equals(“Android”))
    驱动程序=新的AndroidDriver(新的URL(“http://0.0.0.0:“+端口+”/wd/hub“),盖);
    Assert.assertNotNull(驱动程序);
    WebDriverRunner.setWebDriver(驱动程序);
    返回驱动器;
    }
    公共静态AppiumDriver getDriver(){
    返回驱动器;
    }
    公共驱动程序(){
    driver.quit();
    }
    }
    

    请让我知道我的代码中有哪些错误。

    问题在于您的
    Drivers.java

    您当前有以下内容

    公共静态AppiumDriver驱动程序;
    公众静态期望能力上限;
    
    因此,当您在两个线程中执行两个测试时,两个测试都试图实例化
    driver
    对象,并将它们设置为相同的静态实例。这就是为什么您的两个测试最终都针对同一个设备

    要解决此问题,请将
    driver
    cap
    声明为
    Drivers.java
    中的实例变量(即从声明中删除
    static
    关键字),使它们看起来像这样

    公共应用程序驱动程序;
    公众期望能力上限;
    
    使用Appium Studio并行执行比本机Appium方法更简单。 他们也支持云设备。 查看并行执行的文档