如何使用Appium在Android Studio for Java中为除第一个活动以外的活动编写自动测试

时间:2018-07-19 12:11:54

标签: java android automated-tests appium appium-android

我打算使用Android Studio IDE在Ubuntu linux中使用Appium为我的android应用编写自动化测试。

Appium已通过Android Studio安装和配置。 我有一个MainActivity,它可以决定用户是否登录。将用户带到主屏幕,否则将用户带到WelcomeActivity,其中具有登录选项。

我只按一下按钮就为WelcomeActivity编写了测试,一切正常,并且在Appium和Sellinium在模拟器上运行应用程序后通过了测试。 这是WelcomeActivity的ui测试的代码

public class WelcomeActivityUITests {
WebDriver driver;

@Before
public void setUp() throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("deviceName", "Emulator Nexus_4_API_22 Android 5.1.1, API 22");
    capabilities.setCapability(CapabilityType.PLATFORM, "Android");
    capabilities.setCapability(CapabilityType.VERSION, "5.1.1");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("appPackage", "com.my.app");
    capabilities.setCapability("appActivity", ".activities.WelcomeActivity");

    driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

@Test
public void testEmailLoginButton() {
    By loginButtonId = By.id(Constant.APP_PACKAGE + "email_signin_button");
    RemoteWebElement loginButton = (RemoteWebElement) driver.findElement(loginButtonId);
    loginButton.click();
    driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
}

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

当我从android studio运行并通过测试时,此测试类工作正常。


现在我想为另一个活动编写测试。它的名字是AnotherActivity,它是在登录后出现的。

此类测试的代码为:

public class AnotherActivityUITests {
WebDriver driver;

@Before
public void setUp() throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("deviceName", "Emulator Nexus_4_API_22 Android 5.1.1, API 22");
    capabilities.setCapability(CapabilityType.PLATFORM, "Android");
    capabilities.setCapability(CapabilityType.VERSION, "5.1.1");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("appPackage", "com.my.app");
    capabilities.setCapability("appActivity", ".activities.AnotherActivity");

    driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

@Test
public void test() {
    System.out.println("driver.getPageSource(): " + driver.getPageSource());

    driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
}

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

现在,当我运行此测试类时。它给出了错误:

  

org.openqa.selenium.WebDriverException:处理命令时发生未知服务器端错误。原始错误:无法启动“ com.my.app”应用程序。原始错误:用于启动应用程序的活动名称'.activities.AnotherActivity:'不存在或无法启动!确保它存在并且是可启动的活动(警告:服务器未提供任何堆栈跟踪信息)

我不明白这一点。第一次活动测试运行良好。 第二活动给问题。 我还尝试提供其他活动名称,例如LoginActivity,以测试它是否运行测试。没有成功。

请指导我如何实现此目标。我错了。

1 个答案:

答案 0 :(得分:1)

您可以将MainActivity用作appActivity,而不是对每个活动使用appActivity。 然后,您需要检查应用程序进行了哪些活动,即welcomeActivity或AnotherActivity。

@Before
public void setUp() throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("deviceName", "Emulator Nexus_4_API_22 Android 5.1.1, API 22");
    capabilities.setCapability(CapabilityType.PLATFORM, "Android");
    capabilities.setCapability(CapabilityType.VERSION, "5.1.1");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("appPackage", "com.my.app");

    //put your main activity below-----------------------------------//
    capabilities.setCapability("appActivity", "Your main activity here");
    //---------------------------------------------------------------//

    driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

然后,您可以通过检查显示的welcomeActivity或AnotherActivity的元素来检查将进行的活动。

By loginButtonId = By.id(Constant.APP_PACKAGE + "email_signin_button");
RemoteWebElement loginButton = (RemoteWebElement) driver.findElement(loginButtonId);
try{
    if(loginButton.isDisplayed()){
      //your test for welcomePage
    }
}catch(Exception e){
    //your test for Another Activity
}