一、Appium 环境搭建:

    1、安装Appium Python Client包:

            pip install Appium-Python-Client -i https://pypi.douban.com/simple

            pip install selenium -U # 确保selenium和appium版本匹配

    2、安装Appium服务端:

            下载地址1:https://github.com/appium/appium-desktop/releases/latest

            下载地址2:https://bitbucket.org/appium/appium.app/downloads/

    3、安装并配置JDK:

            下载 jdk 地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html

            检查电脑是否有安装过jdk或是否安装成功:cmd窗口—-输入 java -version

            检查是否已配置环境变量:cmd窗口—-输入 javac

            配置环境变量:

            1、变量名:JAVA_HOME 变量值:C:/Program Files/Java/jdk1.8.0_151(注意这里是安装jdk的路径,最好是英文路径)

            2、变量名:PATH 变量值:C:/Program Files/Java/jdk1.8.0_151/bin;C:/Program Files/Java/jdk1.8.0_151/bin;(注意这里是两个路径,用分号隔开)

            3、变量名:CLASSPATH 变量值:C:/Program Files/Java/jdk1.8.0_151/lib/dt.jar;C:/Program Files/Java/jdk1.8.0_151/lib/Tools.jar;(可不配置)
    配置完后重启cmd窗口,输入javac验证是否配置成功

    4、下载安装并配置SDK:

            下载sdk地址1: http://developer.android.com/studio/installing/index.html(划到下面“Command line Tools only”下载即可)

            下载sdk地址2: https://developer.android.google.cn/studio/(官网)

    配置环境变量:
            1、变量名:ANDROID_HOME
                 变量值:D:/Android-SDK-Windows(注意这里是安装sdk的路径,最好是英文路径)
            2、变量名:PATH
                 变量值:D:/Android-SDK-Windows/Tools;D:/Android-SDK-Windows/platform-Tools(注意这里是安装sdk的路径,最好是英文路径)

            配置完后启动cmd窗口,输入adb --version,验证是否配置成功(出现版本号则为成功)

    5、安装并配置nodejs(此步可以不做 ):

            下载nodejs地址:http://nodejs.cn/download/

            验证是否安装成功,打开cmd窗口,输入node -v (如果出现了版本号则为成功)

    6、连接真机:

            1、用数据线连接,注意有的数据线只能用来充电

            2、手机必须开启开发者模式

            3、有的手机必须安装驱动才能连接

            4、以上步骤确认无误后,在电脑cmd窗口输入:adb devices 连接手机
 

——————————————————————————————

二、ADB 相关命令:

    1、 adb基础命令:

            1 adb devices 查看已连接的设备与模拟器 devices/offline/no devices/unauthorized

            2. adb connect ip port—连接设备

            3. adb disconnect ip port—-取消连接

            4. adb version—-查看adb的版本

            5. adb start-server—-启动adb服务

            6. adb kill-server—-杀掉adb服务

            7. adb install 绝对路径 (必须是英文)—-安装程序

            8. adb uninstall 包名—–卸载程序

            9. adb shell pm list packages -3 —–输出系统用户安装的第三方app包名

            10. adb shell pm list packages -s ——输出系统自带的包名

            11. adb pull /data/anr/traces.txt D:/log —–把手机端的文件拷贝到电脑端

            12. adb push D:/log/traces.txt /data/anr ——把电脑端的文件拷贝到手机端

    2、获取app包名和启动名命令:

            1、windows命令:adb shell dumpsys window windows | findstr mFocusedApp #获取当前打开应用的包名和当前页面启动名
            windows命令:adb shell dumpsys activity recents | findstr "intent={" #该命令获取最近的活动程序,通常是第一行的;

            windows命令:aapt.exe dump badging 存放apk的目录(针对没有安装app的情况)

            2、Linux命令:adb shell dumpsys window windows | grep mFocusApp

    3、过滤指定app的日志:adb logcat -v time | findstr 包名

            获取系统版本号:adb shell getprop ro.build.version.release

            获取手机webview版本:adb shell am start -a android.intent.action.VIEW -d https://liulanmi.com/labs/core.html

            获取App的启动时间:adb shell am start -W 包名/启动名

            1、TotalTime:app自身启动时间

            2、WaitTime:系统启动app时间
 

——————————————————————————————

三、Appium 启动配置:

from appium import webdriver  # 后续操作依赖于这个库

desired_caps = {
    'platformName': 'Android',  # 设备类型;
    'platformVersion': '6',  # 设备的类型的版本号,如果是安卓,填写大的版本号即可,小数不用填;
    'deviceName': 'MI9',  # 设备的名称,这个和后续的测试没有多大关系;
    'appPackage': 'io.momo.reve',  # 需要测试的app包名;
    'appActivity': 'io.momo.reve',  # 需要测试的app启动名;
    'unicodeKeyboard': True,  # 如果指定了UI2作为驱动,不需要配置;
    'resetKeyboard': True,  # 重置自动化时设置的键盘;
    'chromedriverExecutableDir': '路径',  # 启动webview的webdriver驱动
    'noReset': True,  # 防止每次启动app时候都初始化所有数据;
    'newCommandTimeout': 6000,  # 代码向appiumserver发送命令的延迟时间,单位是秒,不设置默认一分钟;
    'automationName': 'uiautomator2',  # 这个并不是所有应用都适配的,1.15.1以前默认是UI1,之后是默认UI2;
    'autoGrantPermissions': "True",  # 自动跳过授权
    'skipServerInstallation': 'True',
    'skipDeviceInitialization': 'True',  # 跳过安装AppiumSetting
}

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)  # /wd/hub 路径是固定的,desired_caps是初始化设置的字典;
driver.implicitly_wait(10)  # 隐式等待和selenium的用法是一样的;

    1、元素定位单数形式和复数形式和selenium一样,复数形式返回的也是列表;

            driver.find_elements_by_id(“username”) # 根据id定位,即 resource-id 的值;

            driver.find_element_by_accessibility_id(‘unique name’) # 根据唯一id定位,即 contend-desc 的值;

            driver.find_element_by_class_name(“android.btn”) # 根据类名定位,即 class 的值;

            driver.find_element_by_xpath(“//元素类型[@属性=‘value’]”) # 根据xpath定位,即 xpath 的值;

            driver.tap([(1, 2), (3, 4)]) # 模拟手指点击坐标,tap里面最多有5个坐标,

    2、通过元素的百分比坐标来定位:

            target_size = driver.get_window_size() # 获取手机屏幕的尺寸

            height = target_size[“height”] # 获取手机屏幕 x 坐标

            width = target_size[“width”] # 获取手机屏幕 y 坐标

            driver.tap([(height / 2, width / 8)]) # 点击指定百分比坐标的位置
 

——————————————————————————————

四、元素定位工具 – Uiautomatorviewer

    1、工具路径:

            一般在 /SDK/Tools/bin/uiautomatorviewer.bat 目录下,有的也会直接放在 /SDK/Tools/uiautomatorviewer.bat 目录下;

    2、工具缺点:

            高版本的安卓可能有兼容性问题,经常出现连接不上的问题,需要多次重启工具和adb;

    3、工具内容解释:

            index:元素的下标,在结构树上能看到;

            text:文本信息,不是每个元素都有;

            resource-id:元素的id,但这个id有可能不是唯一的(格式:“包名:id”);

            class:元素属于的类,安卓是java开发的,所以每个元素都有class,;

            package:app的包名;

            content-desc:这个可以唯一定位元素,通常开发都不会写;

            bounds:坐标值,通常有两个list,一个是左上角一个是右下角,如: [x1,y1][x2,y2]

 

——————————————————————————————

五、UI Selector API 定位方法:

   1、通过ID来选择元素:

            new UiSelector().resourceId("string id") #此方法是java用法,能在appium定位工具里验证(括号里是一个参数)

    2、通过CLASS来选择元素:

            new UiSelector().className("string classname") #此方法是java用法,能在appium定位工具里验证(括号里是一个参数)

   3、通过content-desc来选择元素:

            new UiSelector().description("string id") #此方法是java用法,能在appium定位工具里验证(括号里是一个参数)

   注意:new 后面的空格只能是一个,否则会报错;

   4、通过xpath来选择元素,用uiselector来表示:

            new UiSelector().resourceId("string id").childSelector(new UiSelector().className("string classname"))
注意这个并非固定用法,.childSelector() 前的可以是任何appium定位方法,括号里的也是可以任何的appium定位方法;

如用选择xpath定位后的第 n 个元素:
            new UiSelector().resourceId("string id").childSelector(new UiSelector().className("string classname").instance(n))
注意:这里的 n 是从 0 开始的,0 既是第一个元素;

   5、通过正则表达式匹配id:

            new UiSelector().resourceIdMatches("id/digit\d") #注意这里的 \d 是正则表达式;

   6、通过文本来选择元素:

            new UiSelector().text("text")

   7、通过正则表达式选择文本:

            new UiSelector().textMatches("text\d") #注意这里的 \d 是正则表达式;

   8、UiSelector在appium代码中的写法:

            driver.find_element_by_android_uiautomator('''new UiSelector().resourceId("string id")''') # 单数形式

            driver.find_element_by_android_uiautomator('''new UiSelesctor().resourceId("string id")''') # 复数形式
 

——————————————————————————————

六、操作页面:

   1、滑动:

            banner = driver.find_element_by_id(“”) # 先定位到需要获取尺寸的目标元素

            banSize = banner.size # 返回:{“height”: size[“height”], “width”: size[“width”]}

            eleHeight, eleWidth = banSize[“height”], banSize[“width”] # 获取元素的高度和宽度

            loc = banner.location # 获取元素的左上角坐标,返回:{“x”: round(old_loc[‘x’]), “y”: round(old_loc[‘y’])}

            startX, startY = loc + eleWidth * 0.2, loc + eleHeight * 0.5 # 获取起始坐标

            endX, endY = loc + eleWidth * 0.8, startY # 获取终点坐标

            driver.swipe(startX, startY, endX, endY, duration=None) # 滑动方法,duration是滑动消耗时间
 

——————————————————————————————

七、通知查看:

   1、打开通知栏

            driver.swipe() # 通过滑动屏幕实现—从顶端向下滑动

            driver.open_notifications() # 固定用法,通过调用api来实现

   2、关闭通知栏

            driver.swipe() # 通过滑动屏幕实现—从底部向上滑动

            driver.press_keycode() # 括号里面填写相对应的按钮编码,短按操作

            driver.keyevent() # 相当于继承了selenium的方法,短按操作

            driver.long_press_keycode() # 长按按钮操作,括号里的输入对应按钮的编码

   3、按钮对应的编码 扩展:

            driver.press_keycode(5) # 拨号键

            driver.press_keycode(220) # 调节屏幕亮度的键

            driver.press_keycode(221) # 调节屏幕亮度的键

            driver.press_keycode(3) # home 键

            driver.press_keycode(82) # 菜单键

            driver.press_keycode(4) # 返回键

            driver.press_keycode(27) # 拍照键

            driver.press_keycode(26) # 电源键,点击一下相当于锁屏,长按相当于关机操作

            driver.press_keycode(91) # 话筒静音键

            driver.press_keycode(24) # 电源键,点击一下相当于锁屏,长按相当于关机操作

            driver.press_keycode(25) # 音量增加键

            driver.press_keycode(26) # 音量减小键

 

——————————————————————————————

八、WebView

   1、打开电脑上的浏览器以手机模式执行

        前提:电脑浏览器能访问手机版的该网页!

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", {"deviceName": "iPhone X"})  # 注意模拟的手机设备类型是浏览器里有的;
bro = webdriver.Chrome(desired_capabilities=chrome_options.to_capabilities())  # 启动webdriver添加配置项;

   如果要直接对app的webview进行测试,需要修改源码:

   准备工作1: app修改编译:对 webview对象加入 setWebContentsDebuggingEnabled 的调用!

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WebView myWebView = (WebView) findViewById(R.id.jcywebview);
    myWebView.setWebContentsDebuggingEnabled(true);
}

   准备工作2: 查看webview元素

            通过chrome的远程调试功能—电脑需要翻墙

            打开chrome浏览器,地址栏输入:chrome://inspect

            Android 4.4(KitKat)或更高的版本

   准备工作3: 选择合适的webdriver

 

九、appium 实现 webview 自动化:

   如果需要操作webview的内容,必须要切入 context 里面去,否则无法定位到元素!

            driver.contexts # 查看你当前有那些context,返回的是一个列表;

            driver.current_context # 查看 driver 当前处于哪个 context;

            contextname = driver.contexts[0]

            driver.switch_to.context(contextname) # 切入 context 里面去;

来源:小浩丶

物联沃分享整理
物联沃-IOTWORD物联网 » Appium详解(超详细)

发表评论