java - 如何使用 Appium 在 Android Studio for java 中为除 First Activity 之外的 Activity 编写自动化测试
问题描述
我打算使用 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 来测试它是否运行测试。找不到成功。
请指导我如何实现这一目标。我错在哪里。
解决方案
您可以将 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
}
推荐阅读
- android - 对调用不同类的其他方法的方法进行单元测试
- aem - 在 aem 中隐藏非管理员用户的个性化选项卡
- angular - 什么时候应该在 Angular 中使用 styles.scss,什么时候应该使用组件的 scss
- keras - LSTM Keras 输入参数
- python - 在 VS2017 中将 python 脚本嵌入 C 时出错
- python - 我有 PyQt4 GUI,我想以复选框的形式列出文件。但复选框仅显示目录中的最后一个文件
- c++ - Docker 构建抛出错误“致命错误:json/json.h:没有来自 ubuntu:14.04 的此类文件或目录”
- api - oAuth 返回 400 错误请求
- ios - 使用 NSNetServices 类设置多个 iOS 设备之间的通信
- reactjs - catching error on successful api post - Axios