启动app需四个参数

deviceName:使用adb devices即可查看device名称
platformName:android或者ios
appPackage:使用adb logcat | grep ActivityManager命令,启动app后找到日志中Displayed或者cmp后面的参数即可
appActivity:同上
使用命令启动app
adb shell am start -W -n com.tencent.wework/.launch.LaunchSplashActivity -S

相关命令

wget:下载文件
adb install .apk:安装apk,-r参数可覆盖已安装的apk
adb shell:进入安卓系统的命令行
aapt dump badging
.apk:可以查看apk包的一些信息
appium -g appium.log抓取日志
流程:获取系统信息–安装appium settings–再安装一个unlock解锁的工具–接着ps命令看下当前有多少个进程–kill掉以前的一些系统信息–再清理掉一些老的进程–再run一个uiautomator–最后用am start启动app

允许app申请权限

autoGrantPermissions=true pm grant com.xueqiu.android android.permission.WRITE_EXTERNAL_STORAGE

元素定位

定位技巧,推荐使用xpath
byid
byaccessibilityId
大招 xpath定位 //android.widget.ListView/[2] //[@text=’行情’] //*[@content-desc=’xxxx’]
findElements + id + accessibilityId
寻找父类的标识符 findElement.findElement
driver.getPageSource()

toast识别

@Test
public void testToast() throws InterruptedException {
    driver.findElementByXPath("//*[@text='Views']").click();
    driver.findElementByAndroidUIAutomator(
            "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(" +
                    "new UiSelector().text(\"Popup Menu\").instance(0));").click();
    driver.findElementByXPath("//*[contains(@text, 'Make')]").click();
    driver.findElementByXPath("//*[@text='Search']").click();
    //System.out.println(driver.findElementByClassName("android.widget.Toast").getText());
    System.out.println(driver.findElementByXPath("//*[@class='android.widget.Toast']").getText());
}

修改adb脚本获取adb命令

思路:将原来的脚本重命名,建一个新的adb脚本链接原来的脚本并在调用前输出命令

#!/bin/bash
PLATFORM_TOOL="/usr/local/Cellar/android-sdk/24.4.1_1/platform-tools/adb.ori"
#打印时间
echo "#`date +%Y%m%d_%H%M` $0" >> /tmp/adb.log
#打印所有的参数
echo "adb $@">> /tmp/adb.log抓取日志
test -x "$PLATFORM_TOOL" && exec "$PLATFORM_TOOL" "$@"
echo "It appears you do not have 'Android SDK Platform-tools' installed."
echo "Use the 'android' tool to install them: "
echo "    android update sdk --no-ui --filter 'platform-tools'"

使用代理抓取appium中间交互

代理拦截

gem install em-proxy -i /usr/local/bin/

em-proxy -l 5723 -r 127.0.0.1:4723 -v

嗅探抓包

sudo tcpdump -i any port 4723 or port 8203 -w /tmp/tcpdump.log
二进制文件使用wireshark分析

webview测试

webview测试:模拟器默认支持,真机需要打开app内开关
检测是否打开:反编译检查对应的api调用
必须从您的应用中启用webview调试,要启用webview调试,请在webview类上调用静态方法setWebContentsDebuggingEnabled

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true);
}

此设置适用于应用的所有webview

AndroidWebView进程信息
adb shell cat /proc/net/unix | grep webview

第一种办法

@Test
public void webview(){
    driver.findElementByXPath("//android.widget.TextView[@text='沪深' and @resource-id='com.xueqiu.android:id/button_text']").click();
    driver.findElementByAccessibilityId("立即开户").click();
    driver.findElementByAccessibilityId("开始").click();
}

第二种办法

https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md
把所有版本的chromedriver都放到一个目录下,然后设置

desiredCapabilities.setCapability("chromedriverExecutableDir", "/Users/seveniruby/projects/chromedriver/chromedrivers/");
借助于chrome://inspect/#devices 查看所有的手机webview

使用webview context切换到web测试状态再进行传统的web定位

@Test
public void context() throws InterruptedException {
    for(Object c : driver.getContextHandles()){
        System.out.println(c.toString());
    }
    System.out.println(driver.getPageSource());
    driver.findElementByXPath("//android.widget.TextView[@text='沪深' and @resource-id='com.xueqiu.android:id/button_text']").click();
    for(Object c : driver.getContextHandles()){
        System.out.println(c.toString());
    }
    Thread.sleep(3000);
    for(Object c : driver.getContextHandles()){
        System.out.println(c.toString());
    }

    driver.context("WEBVIEW_com.xueqiu.android");
    System.out.println(driver.getPageSource());
    driver.findElementByCssSelector(".inner").click();
}

Android知识点梳理

adb shell uiautomator dump
adb shell cat /sdcard/window_dump.xml
adb shell "uiautomator dump && cat /sdcard/window_dump.xml"
adb shell dumpsys activity top

adb shell input text 123
adb shell input tap x y
adb shell input swipe 200 200 500 500 1000

获取界面结构xml -> node -> 坐标 -> input
adb shell "uiautomator dump && cat /sdcard/window_dump.xml" |grep -oE "<node[^>]>" | grep -v ‘resource-id=""’ | grep -oE ‘bounds=".?]"’ | sed ‘s#[^0-9]{1,}# #g’

adb shell pm clear xxx(appPackage)
adb shell dumpsys package xxx(appPackage)

adb架构

adb client: adb shell echo xxxx
adb server: adb -L tcp:5037 fork-server server –reply-fd 4
adbd: adb shell ps | grep adbd

adb命令替换来解决命令分析


echo "# $$ "$(date "+%Y/%m/%d %H:%M:%S") >> /tmp/adb.log
echo "# ppid: $(ps -o command  $(ps -o ppid $$ | tail -1) | tail -1)" >> /tmp/adb.log
echo "adb $@" >> /tmp/adb.log
exec /Users/seveniruby/Library/Android/sdk//platform-tools/adb.bak "$@"```
分类: 测试

发表评论

电子邮件地址不会被公开。