我无法 运行 我在 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。
当我尝试 运行 我在 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。