【问题标题】:How to write Automated Tests for an Activity other than First Activity in Android Studio for java using Appium如何使用 Appium 在 Android Studio for java 中为除 First Activity 之外的 Activity 编写自动化测试
【发布时间】:2023-03-03 08:59:23
【问题描述】:

我打算使用 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 来测试它是否运行测试。找不到成功。

请指导我如何实现这一目标。我哪里错了。

【问题讨论】:

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


    【解决方案1】:

    您可以将 MainActivity 用作 appActivity,而不是为每个 Activity 使用 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
    }
    

    【讨论】:

    • 感谢@Suban 抽出宝贵时间。我实际上做了你问的同样的事情。这是我一周前想到的唯一方法,我正在像这样测试我的代码。但是对于登录后的每个屏幕,我都需要进行测试。我在每个活动测试文件中进行相同的代码复制粘贴。有什么方法可以将它模块到某个地方以从模块登录。或者我们可以用其他方式处理这个问题吗?否则我们必须一遍又一遍地做同样的事情来测试登录后的任何东西。再次感谢
    • 您不需要每次都初始化驱动程序。您只能初始化一次驱动程序并为每个屏幕使用驱动程序。如果你想设计 appium 框架,请学习 Appium Design Framework 。如果你想学习数据驱动测试,学习Appium data driven testing
    猜你喜欢
    • 2016-04-23
    • 2014-03-22
    • 2016-12-27
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多