Skip to content

App自动化控制

App 自动化应用控制

简介

app 自动化控制是通过自动化测试工具来模拟用户与移动应用程序进行交互,以执行各种测试操作。

操作步骤

启动

启动应用主要有两种方式:

  1. 正常启动应用。
  2. 在脚本中启动其他应用

正常启动应用:创建一个 WebDriver 实例,用于与 Appium 服务器建立连接,并传递所需的启动配置(Desired Capabilities)。主要需要以下两个参数:

  • url:指定 Appium 服务器的 URL 地址。这通常是 Appium 服务器的主机名和端口号,例如http://localhost:4723
  • capability:一个字典对象,包含了启动应用程序时的配置信息。这些配置信息可以包括设备名称、平台版本、应用程序包名、活动名称、自动化测试引擎、设备连接信息等。

通过将 URL 和 Capabilities 传递给启动方法,Appium 客户端库将与 Appium 服务器建立连接,并使用提供的配置信息启动相应的会话。这将创建一个可以用于与应用程序进行交互的 WebDriver 实例。

在脚本中启动其他应用:可以在设备上激活给定的应用程序,传入的 app_id 为指定应用的包名。

  • Python
# 启动应用:
appium_server_url = 'http://localhost:4723'
driver = webdriver.Remote(appium_server_url,options=UiAutomator2Options().load_capabilities(caps))

# 在脚本中启动其他应用:
driver.activate_app("com.xx.xx")
  • Java
// 启动应用:
AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723"), uiAutomator2Options);
// 启动其他应用
driver.activateApp("com.xx.xx");

关闭

  • 关闭指定 app:关闭当前操作的 app,不会关闭驱动对象。
  • 关闭驱动对象:关闭当前所有的关联的 app,并关闭驱动对象。
  • Python
# 关闭指定 app
driver.terminate_app("com.xx.xx")
# 关闭当前所有的关联的 app,并关闭驱动对象
driver.quit()
  • Java
//关闭指定 app
driver.terminateApp("app名称");
//关闭驱动对象
driver.quit();

完整示例

使用 appium 官方 Demo apk 进行练习,apk 网盘地址

  • Python
class TestApiDemo:
    def setup_class(self):
        # Capability 设置定义为字典
        caps = {}
        # 设置 app 安装的平台(Android、iOS)
        caps["platformName"] = "Android"
        # 设置 app 的包名
        caps["appium:appPackage"] = "io.appium.android.apis"
        # 设置 app 启动页
        caps["appium:appActivity"] = ".ApiDemos"
        # 不清空缓存
        caps["appium:noReset"] = True
        # 指定应用程序在会话结束时终止
        caps["appium:shouldTerminateApp"] = True
        # 初始化 driver
        appium_server_url = 'http://localhost:4723'
        self.driver = webdriver.Remote(appium_server_url,
                                       options=UiAutomator2Options(). \
                                       load_capabilities(caps))
        print('初始化driver')
        # 设置隐式等待
        self.driver.implicitly_wait(10)

    def teardown_class(self):
        # 停留 3 秒
        time.sleep(3)
        self.driver.activate_app("com.android.browser")
        print('打开浏览器')
        # 停留 3 秒
        time.sleep(3)
        self.driver.terminate_app("com.android.browser")
        print('关闭浏览器')
        time.sleep(3)
        # 关闭 driver
        self.driver.quit()
        print('关闭driver')

    def test_control(self):
        print("执行成功")
  • Java
public class TestApiDemo {


    private static AndroidDriver driver;

    @BeforeAll
    public static void setUp() throws MalformedURLException {
        // 初始化capability
        DesiredCapabilities caps = new DesiredCapabilities();
        // 设置 app 安装的平台(Android、iOS)
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        // 设置 app 的包名
        caps.setCapability("appPackage", "io.appium.android.apis");
        // 设置 app 的启动页
        caps.setCapability("appActivity", ".ApiDemos");
        // 不清空缓存
        caps.setCapability("appium:noReset", true);
        // 指定应用程序在会话结束时终止
        caps.setCapability("appium:shouldTerminateApp", true);

        // 设置启动url
        URL remoteUrl = new URL("http://127.0.0.1:4723");
        // 初始化driver
        driver = new AndroidDriver(remoteUrl, caps);
        // 设置隐式等待
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    }

    @AfterAll
    public static void tearDown() throws InterruptedException {
        // 停留 3 秒
        Thread.sleep(3000);
        // 激活应用
        driver.activateApp("com.android.browser");
        System.out.println("打开浏览器");
        // 停留 3 秒
        Thread.sleep(3000);
        // 终止应用
        driver.terminateApp("com.android.browser");
        System.out.println("关闭浏览器");
        // 停留 3 秒
        Thread.sleep(3000);
        // 关闭 driver
        if (driver != null) {
            driver.quit();
            System.out.println("关闭 driver");
        }
    }

    @Test
    public void testControl() {
        System.out.println("执行成功");
    }
}

总结

在 APP 测试中,启动应用程序通常涉及两种情况:一是初始化一个全新的应用程序实例,二是打开一个已经存在的应用程序。为了实现这两种情况,可以使用不同的方法,即初始化 Appium driver 或者使用 activate_app 方法切换到某个应用程序的上下文。

在关闭应用程序时,也存在两种情况:一是完全退出应用程序,二是结束应用程序的进程,并不完全退出,使其不再运行在前台。分别使用 quit 方法和 terminate_app 实现。