appium
(仅作为个人笔记,如有雷同,请联系删除。。)
1、App 三种类型:
- 原生应用程序:
- 混合应用程序:
- web版APP:
2、Anrdiod SDK:软件开发工具包。
官网下载:https://android-sdk.en.softonic.com/download
网盘下载:https://tools.android-studio.org/index.php/sdk
- 安装完成,设置环境变量。
- 双击SDK Manage.exe 启动SDK管理器,下载Tools/Android SDK Tools、Android SDK Platform-tools、Android SDK Build-tools, Android 10/SDK Platform,Extras/Google USB Driver、Extras/Google Web Driver
3、安装安卓模拟器:
www.yeshen.com
4、安装 appium Server:
https://pan.baidu.com/s/1pKMwdfX
或者appium-desktop:https://github.com/appium/appium-desktop/releases ,用来运行Appium 自动化测试脚本
5、appium测试步骤:
启动Android模拟器,启动 Appium Server,点击启动 Appium Server右上角 三角 按钮,运行测试脚本。
本质上,只需要本地adb connect 连接上模拟器或者真机,亦或者云真机,appium即可访问到APP。
6、APP定位控件:
- appium 的 appium inspector:
- adb connect 连接Android机器;
- 启动 Appium Server,点击搜索按钮对机型、包名等进行配置;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cotimPcT-1648911097302)(images/Qc8lYppkDrteuH97gnO69ubuuYQG6M6VGeQMyF-GeIs.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XnR6uCWy-1648911097305)(images/BC7XznbmLP6x5Hda4QuO2Otjp7J9-dEDc276eMFRqus.png)]
3. 点击start session按钮连接到Android界面进行定位。
-
python 版 uiAutomator2 中的 weditor:【注意:实测与其他两个相互冲突】
- 安装:
pip install --pre weditor
- 使用:
python -m weditor
注意:使用运行weditor时会在连接设备中自动安装一个ATX的app,这个App与uiAutomator2冲突,在运行代码时会产生报错。解决方法时运行代码前删除ATX app。ATX只在元素定位时有用。
- 安装:
-
Chrome Inspect:Chrome提供的一个移动端Web开发调试工具。【没用过,有空研究研究】
-
uiautomatorviewer.bat,在 Android SDK 的 /tools/bin/ 目录下。 运行uiautomatorviewer.bat,安卓模拟器打开APP,点击uiautomatorviewer中左上第二个按钮,模拟器屏幕截图会出现在uiautomatorviewer左下角,单击截图上的元素,右下角会出现元素的各种属性值。缺点:每个界面都要截图才能进行元素定位。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZs4WahZ-1648911097307)(images/1zEYKOjLjWrGPh38XbwNRFFSRve37M0VaO5ZJi6nq0k.png)]
7、APP的定位方法:【参考web的selenium定位,都差不多】
- id 定位:
driver.findElement(By.id("resource-id属性值"))
eg:driver.findElement(By.id(“com.android.calculator2:id/formula”)) - name 定位:
driver.findElement(By.name("元素text属性值"))
eg:driver.findElement(By.name(“9”))
class nama 定位:driver.findElclassNment(By.className("class属性值"))
eg:driver.findElement(By.className(“android.widget.Button”))
4. XPath定位:driver.findElement(By.xpath("xxx"))
eg:driver.findElement(By.xpath(“//android.view.ViewGroup/android.widget.Button”)) //7
5. Accessibility ID定位:driver.findElementByAccessibilityId("元素的contentDescription属性值")
,即元素的元素的 content-desc值
eg:driver.findElementByAccessibilityId(“plus”)
6. android uiautomator定位:driver.findElementByAndroidUIAutomator("xxx")
,元素的任意属性都可以通过android uiautomator方法来进行定位,但要保证这种定位方式的唯一性
eg : driver.findElementByAndroidUIAutomator(“new UiSelector().text(\“clr\”)”)
driver.findElementByAndroidUIAutomator(“new UiSelector().text(8\”)")
driver.findElementByAndroidUIAutomator(“new UiSelector().description(\“plus\”)”)
注:description() 方法用的是content-desc属性
8、API 应用操作:
-
安装应用:installApp() —>需要apk包的路径
eg:driver.installApp(“path/to/my.apk”)
driver.installApp("D:\\\\android\\\\apk\\\\ContactManager.apk")
-
卸载应用:removeApp()
eg:driver.removeApp(“com.example.android.apis”)
-
关闭应用:closeApp()—>默认关闭当前打开的应用,不需要入参。并非真正的关闭应用,相当于按home键将应用置于后台,可以通过launchApp()再次启动
-
启动应用:launchApp() —>需要配合closeApp()使用
eg:driver.closeApp(); driver.launchApp()
-
检查应用是否安装:isAppInstalled()—>需要传参应用包的名字。返回结果为Ture或False
eg:driver.isAppInstalled(‘com.example.android.apis’)
-
将应用置于后台:runAppInBackground()—>需要入参,需要指定应用置于后台的时长
eg:driver.runAppInBackground(2)
-
应用重置:resetApp()—>重置当前被测程序到出始化状态。该方法不需要入参
eg:driver.resetApp()
9、API 上下文操作:
-
获取当前上下文:getContext()—>获取当前所有的可用的上下文。该方法不需要入参
eg:driver.getContext()
-
当前所有上下文句柄:getContextHandles()—>获取当前所有可用的上下文。该方法不需要入参
-
切换上下文:context()—>切换到特定的上下文中。需要指定上下文的名称
eg:driver.context(‘NATIVE_APP’)
driver.context('WEBVIEW\_1')
10、API 键盘操作:
-
sendKeys()
eg:driver.findElements(By.name(“Name”)).sendKeys(“jack”)
-
pressKeyCode()—>发送一个键码的操作。需要一个入参,参数值查看Android keycode参考表。
eg:driver.pressKeyCode(29)
driver.pressKeyCode(AndroidKeyCode.HOME)
11、API TouchAction 操作:—>辅助类,主要针对手势操作,比如滑动、长按、拖动等
-
按压控件:
press(WebElementel, int x, int y)
—>开始按压一个元素或坐标点(x,y)。通过手指按压手机屏幕的某个位置eg:TouchAction(driver).press(x=0,y=308).release().perform()
-
release() 结束的行动取消屏幕上的指针
-
Perform() 执行的操作发送到服务器的命令操作
-
长按控件:
longPress(WebElement el, int x, int y, Duration duration)
—>开始按压一个元素或坐标点(x,y),duration为时间,单位是mseg:TouchAction(driver).longPress(names.get(1),1000).perform().release()
TouchAction(driver).longPress(1 ,302,1000).perform().release()
-
点击控件:
tap(WebElement el, int x, int y)
—>对一个元素或控件执行点击操作eg:TouchAction(driver).tap(names.get(1)).perform().release()
TouchAction(driver).tap(1 ,302).perform().release()
-
移动:
movTo(WebElement el, int x, int y)
—>将指针(光标)从过去指向指定的元素或点eg:TouchAction(driver).moveTo(names.get(1)).perform().release()
TouchAction(driver).moveTo(1 ,302).perform().release()
-
暂停:
wait()
—>暂停脚本的执行,单位为毫秒eg:TouchAction(driver).wait(1000)
12、API 其他操作:—>针对移动设备上特有的一些操作
-
熄屏:
lockDevice()
—>点击电源键熄灭屏幕eg:driver.lockDriice()
-
当前Activity:currentActivity()—>得到当前应用的activity。只适用于Android
eg:driver.currentActivity()
-
收起键盘:hideKeyboard()
eg:driver.hideKeyboard()
-
滑动:
swipe(startx, starty, endx, endy, duration)
—>模拟用户滑动。将控件或元素从一个位置(x,y)拖动到另一个位置(x,y)eg:driver.swipe(75, 500, 75, 0, 800)
拉出文件:pullFile()
—>从设备中拉出文件
eg:driver.pullFile('Library/AddressBook/AddressBook.sqlitedb')
-
推送文件:
pushFile()
—>推送文件到设备中去eg:data = Base64.encodeBase64(“some data for the file”.getBytes())
driver.pushFile("sdcard/test.txt", data)
13、adb命令收集:
aapt dump badging D:\XXX.apk
: 获取安装包的所有信息
adb devices
:(查看手机是否连接到电脑)
adb shell pm list packages
:列出所有的包名,找到所查看包的包名。
adb shell dumpsys package com.android.XXX
:查看某个包的具体信息
其它:
adb devices
:查看Android设备是否连接到电脑。
adb shell dumpsys activity
:查看当前运行的是哪个activity,运行的一些进程等
adb shell dumpsys activity activities
adb shell pm list packages
:列出所有的包名。
adb shell dumpsys package
:列出所有的安装应用的信息
adb shell dumpsys package com.android.XXX
:查看某个包的具体信息
adb shell dumpsys activity | grep mFocusedActivity
:查看当前resume的是哪个activity
adb logcat | grep ActivityManager
:查看当前正在运行的Activity
adb logcat | grep Displayed
:查看当前正在运行的Activity
adb logcat | grep Displayed:查看当前正在运行的Activity