我无法 运行 我在 JUnit 中的第二次测试,它显示 "session not created"

I cannot run my second test in JUnit, it shows "session not created"

当我尝试 运行 我在 appium 中的测试时,我的第二个测试不是 运行ning。它显示 "A new session could not be created"。我的第二个测试函数名称是 BAddon,而第二个测试执行时抛出错误

这是我的代码

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class FirstAutomate {
private WebDriver driver;

@Before
public void setup() throws Exception {
    //File app = new File("C:\sdk\platform-tools\Myapp.apk");
    DesiredCapabilities capabilities = new DesiredCapabilities();
    //capabilities.setCapability("BROWSER_NAME", "Android");
    capabilities.setCapability("VERSION", "5.0.2"); 
    capabilities.setCapability("deviceName","G3 Beat");
    capabilities.setCapability("appPackage", "com.myapp.app");
     capabilities.setCapability("appActivity","com.myapp.app.screens.prehomescreens.activities.SplashScreen");
    capabilities.setCapability("platformName","Android");

     capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME,MobilePlatform.ANDROID);
    //capabilities.setCapability("app", app.getAbsolutePath());
    try{
        driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

    }catch(MalformedURLException e)
    {
        e.printStackTrace();
    }
 // TODO Auto-generated method stub
    }

   @Test
   public void AppLogin() throws InterruptedException {
  //Tapping login button
   Thread.sleep(5000);
   driver.findElement(By.id("loginButtonTextView")).click();
   //User inputs mail id
      driver.findElement(By.id("emailIdEditText")).sendKeys("rag1@mail.com");
   //User login button click
   driver.findElement(By.id("loginBtnRCB")).click();
    //User inputs OTP
   driver.findElement(By.id("pinPadContainer")).sendKeys("123456");
   WebElement loginBtn = driver.findElement(By.id("nextBtnRCB"));
   if(loginBtn.isDisplayed())
   {
       loginBtn.click();
   }else
   {
       System.out.println("Button is not present");
   }
   Thread.sleep(15000);
   }



  @Test
  public void BAddOn() throws InterruptedException{

//Thread.sleep(10000);
WebElement AddonBtn = driver.findElement(By.id("studentStatusButton"));
if(AddonBtn.isDisplayed())
{
AddonBtn.click();   
}else{
    System.out.println("AddOnBtn is not visible");
}

}
 }

我相信您在测试后缺少驱动程序关闭 - 您尝试在第一个会话已经存在时启动新会话。尝试添加以下代码:

@After
public static shutdown() {
    driver.quit()
}

我想在每个测试用例之前都会调用设置。一旦服务器 运行 您不需要再次调用设置。

您需要想出一种方法,以便在您的测试用例开始执行之前只调用一次 appium 服务器设置。我认为有 @BeforeClass 注释可以做到这一点。

正如其他人所提到的,您正在尝试创建一个新的驱动程序对象。这是由于给定注释的 JUNIT 流造成的。 Before Test After Before Test After ect 要解决此问题,您需要创建一个 @After 方法来关闭最后一个驱动程序,即:

@After
public void tearDown() {
     driver.quit();
}

或者不在 before 子句中创建驱动程序。相反,您可以在 BeforeClass 函数中创建驱动程序,即

@BeforeClass
public void beforeClass() {
     //create driver
}

如前所述,这些并不是实例化驱动程序的最佳方式。相反,最好有一个 class 来保存您的驱动程序对象。让我们调用这个 class DriverContainer,驱动程序容器然后有一个 getDriver 方法可以用来实例化或 return 一个驱动程序,这取决于驱动程序是否存在通过 if- else 语句或 switch 语句。这样,无论何时使用驱动程序,您都可以更加确定它是正确的驱动程序,不会崩溃、超时或变为 null。