App自动化基础

查看设备 ID

adb devices

查看设备的 Android 系统版本

adb shell getprop ro.build.version.r-elease

查看想要启动 app 的包名

adb shell pm list packages

查看想要启动 app 的启动页面

adb shell monkey -p ${package.name} -vvv 1

获取app的启动页面

adb logcat |grep -i displayed
adb logcat ActivityManager:I | grep “cmp”

adb logcat ActivityManager:I |grep -i displayed

启动页面

adb shell am start -n <包名>/<avticity名>
adb shell am start -n com.xueqiu.android/.view.WelcomeActivityAlias

andorid机投屏

scrcpy

capability 配置参数解析

DesiredCapabilities caps = new DesiredCapabilities();

  • 公共参数部分
caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
caps.setCapability(MobileCapabilityType.UDID, "adb-2edf7a82-WE6ucp._adb-tls-connect._tcp.");
caps.setCapability(MobileCapabilityType.DEVICE_NAME, "XiaoMi Civi 2");
caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");
caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, 13);
//在假设客户端退出并结束会话之前,Appium 将等待来自客户端的新命令多长时间(以秒为单位)
// 超时后会话删除
caps.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 3600);

// 添加参数 noReset 默认为false, 设置为true时 保存历史状态数据
// Android 不停止应用程序,不清楚应用程序数据,不卸载apk
// 添加参数 fullReset 默认为false, 设置为true时: 新会话之前完全卸载被测应用程序 ,特别的: Android 在会话开始之前( appium 启动app )和测试之后停止应用程序,清楚应用程序数据并卸载apk
// 添加参数 dontStopAppOnReset 默认为false 设置为true时: 不希望应用程序在运行时重新启动
caps.setCapability(MobileCapabilityType.NO_RESET, true);

// 启动允许权限,若 noReset=true时,此选项不生效
caps.setCapability(SupportsAutoGrantPermissionsOption.AUTO_GRANT_PERMISSIONS_OPTION, true);
// 参数 printPageSourceOnFindFailure 默认为false ,设置为true时: 发生任何错误,强制服务器将实际的 XML 页面源转储到日志中.
caps.setCapability(PRINT_PAGE_SOURCE_ON_FIND_FAILURE, true);


  • android部分

// 打开app的时候的页面是哪个
caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.appiumpro.the_app");
caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, ".MainActivity");
// 授予启动的应用某些权限,若NO_RESET=true 此选项不生效
caps.setCapability(AndroidMobileCapabilityType.AUTO_GRANT_PERMISSIONS, true);
// 首次启动的时候,不停止app
caps.setCapability(AndroidMobileCapabilityType.DONT_STOP_APP_ON_RESET,true);
// 跳过安装,权限设置等操作
caps.setCapability(AndroidMobileCapabilityType.SKIP_DEVICE_INITIALIZATION,true);
//输入中文,UiAutomator1 需要配置才能输入中文,UiAutomator2不再需要配置
caps.setCapability(AndroidMobileCapabilityType.UNICODE_KEYBOARD,true);

// WebView 配置ensureWebviewsHavePages
//是否跳过在 getContexts 输出中显示没有页面的 Web 视图。
// 驱动程序使用 devtools 连接来检索有关现有页面的信息。
// 自 Appium 1.19.0 起默认为 true,如果低于 1.19.0,则为 false。
caps.setCapability(AndroidMobileCapabilityType.ENSURE_WEBVIEWS_HAVE_PAGES, true);
//nativeWebScreenshot: 是否使用UiAutomator框架提供的截图端点(true)
//而不是chromedriver提供的端点(false,默认值)。当您遇到后者问题时使用它。
caps.setCapability(AndroidMobileCapabilityType.NATIVE_WEB_SCREENSHOT, true);

ios部分

// 被测应用的 bundle ID 。用于在真实设备中启动测试,也用于使用其他需要 bundle ID 的关键字启动测试。
// 在使用 bundle ID 在真实设备上执行测试时,你可以不提供 app 关键字,但你必须提供 udid 。
caps.setCapability(IOSMobileCapabilityType.BUNDLE_ID,"");
// 连接的真实设备的唯一设备编号
caps.setCapability(MobileCapabilityType.UDID,"");

启动

  • 方式一
    driver = new AndroidDriver(remoteUrl, caps);
  • 方式二(热启动)
    //打开app退出时的页面
    driver.execute(LAUNCH_APP);

退出app

driver.quit();

常见控件交互方法

    // 获取当前元素文本text
    String text = element.getText();
    System.out.println("文本内容: "+text);
    // 当前元素是否可见,返回布尔类型
    boolean displayed=element.isDisplayed();
    System.out.println("元素是否可见: "+displayed);
    // 查看当前元素是否可用,返回布尔类型
    boolean enabled = element.isEnabled();
    System.out.println("元素是否可用: "+enabled);
    // 当前元素是否被选中,返回布尔类型
    boolean selected = element.isSelected();
    System.out.println("元素是否被选中: "+selected);
    // 获取当前元素属性值
    String attribute = element.getAttribute("resource-id");
    System.out.println("元素属性 resource-id = "+attribute);
    // 获取元素坐标
    Point location=element.getLocation();
    System.out.println("元素坐标(X,Y) = "+location);
    // 获取元素尺寸(宽,高)
    Dimension size=element.getSize();
    System.out.println("元素尺寸(宽,高) = "+size);

    // 计算获取元素中心点
    /* 中心点X = startX+宽度/2
       中心点Y = startY+高度/2
     */
    int middleX = location.getX()+size.getWidth()/2;
    int middleY = location.getY()+size.getHeight()/2;
    System.out.println("中心点X = "+middleX);
    System.out.println("中心点Y = "+middleY);

元素定位工具

  • appium inspector
  • Weditor
    • 要求:python 3.6+ 以上
    • 安装:weditor 是 python 的第三方库
      • pip install weditor 进行安装
    • 运行:安装完成之后,在命令行运行 python -m weditor 即可