Loading... # 一、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](https://github.com/appium/appium-desktop/releases/latest) 下载地址2:[https://bitbucket.org/appium/appium.app/downloads/](https://bitbucket.org/appium/appium.app/downloads/) ### 3、安装并配置JDK: 下载 jdk 地址:[https://www.oracle.com/technetwork/java/javase/downloads/index.html](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](http://developer.android.com/studio/installing/index.html)(划到下面“Command line Tools only”下载即可) 下载sdk地址2: [https://developer.android.google.cn/studio/](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/](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 启动配置: ```python 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、打开电脑上的浏览器以手机模式执行 ### 前提:电脑浏览器能访问手机版的该网页! ```python 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 的调用! ```python 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 里面去; 最后修改:2022 年 09 月 29 日 © 允许规范转载 打赏 赞赏作者 微信 赞 0 如果觉得我的文章对你有用,请随意赞赏