官网下载:https://android-sdk.en.softonic.com/download
网盘下载:https://tools.android-studio.org/index.php/sdk
www.yeshen.com
https://pan.baidu.com/s/1pKMwdfX
或者appium-desktop:https://github.com/appium/appium-desktop/releases ,用来运行Appium 自动化测试脚本
启动Android模拟器,启动 Appium Server,点击启动 Appium Server右上角 三角 按钮,运行测试脚本。
本质上,只需要本地adb connect 连接上模拟器或者真机,亦或者云真机,appium即可访问到APP。
appium 的 appium inspector:
(1). adb connect 连接Android机器;
(2). 启动 Appium Server,点击搜索按钮对机型、包名等进行配置;
(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左下角,单击截图上的元素,右下角会出现元素的各种属性值。
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”))
XPath定位:driver.findElement(By.xpath("xxx"))
eg:driver.findElement(By.xpath(“//android.view.ViewGroup/android.widget.Button”))
Accessibility ID定位:driver.findElementByAccessibilityId("元素的contentDescription属性值")
,即元素的元素的 content-desc值
eg:driver.findElementByAccessibilityId(“plus”)
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属性
安装应用: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()
获取当前上下文:getContext()
—>获取当前所有的可用的上下文。该方法不需要入参
eg:driver.getContext()
当前所有上下文句柄:getContextHandles()
—>获取当前所有可用的上下文。该方法不需要入参
切换上下文:context()
—>切换到特定的上下文中。需要指定上下文的名称
eg:driver.context('NATIVE\_APP')
driver.context('WEBVIEW\_1')
sendKeys()
eg:driver.findElements(By.name("Name")).sendKeys("jack")
pressKeyCode()
—>发送一个键码的操作。需要一个入参,参数值查看Android keycode参考表。
eg:driver.pressKeyCode(29)
driver.pressKeyCode(AndroidKeyCode.HOME)
辅助类,主要针对手势操作,比如滑动、长按、拖动等
按压控件: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为时间,单位是ms
eg: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)
熄屏: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)
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