IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Appium详解(超详细) -> 正文阅读

[开发测试]Appium详解(超详细)

一、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 里面去;

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:30:55  更:2021-08-03 11:31:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:20:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码