appium-录制用例
获取包名和activity
windows系统
adb shell dumpsys activity |find “mFocusedActivity” 获取当前activity
C:\Users\Administrator>adb shell dumpsys activity |find "mFocusedActivity"
mFocusedActivity: ActivityRecord{
10828b7 u0 com.xueqiu.android/.common.MainActivity t11}
adb shell dumpsys window | findstr mCurrentFocus 获取当前activity
C:\Users\Administrator>adb shell dumpsys window | findstr mCurrentFocus
mCurrentFocus=Window{
26c290 u0 com.xueqiu.android/com.xueqiu.android.common.MainActivity}
录制步骤
(1)启动appium客户端,默认启动地址 http://127.0.0.1:4723/wd/hub
(2)file>New Session Window
(3)配置设备信息、包名等,点【Start Session】
{
“platformName”: “android”,
“deviceName”: “Huawei Mate30”,
“appPackage”: “com.xueqiu.android”,
“appActivity”: “.view.WelcomeActivityAlias”,
“noReset”: “True”
}
(4)录制脚本
- 点【录制】
- 点【选择元素】
- 选择元素:点左边的输入框
- 点右边的【Tap】即点击输入框操作
- 选择元素:点坐标的输入框
- 点右边的【Send Keys】,输入文本,即向左边的输入框输入搜索关键词
- Recoder选择【Python】语言
- 结束【录制】
- 复制录制脚本
动图
代码
# pip install appium-python-client
from appium import webdriver
import time
descrip_cap = {
"platformName": "android",
"deviceName": "Huawei Mate30",
"appPackage": "com.xueqiu.android",
"appActivity": ".view.WelcomeActivityAlias",
"noReset": "True"
}
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",descrip_cap)
driver.implicitly_wait(10)
#####################复制录制的脚本#############################
el1 = driver.find_element_by_id("com.xueqiu.android:id/tv_search")
el1.click()
el2 = driver.find_element_by_id("com.xueqiu.android:id/search_input_text")
el2.send_keys("alibaba")
el3 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.LinearLayout/androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout[1]/android.widget.LinearLayout/android.widget.TextView[1]")
el3.click()
el4 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout/androidx.viewpager.widget.ViewPager/android.widget.RelativeLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.FrameLayout[1]/android.widget.RelativeLayout/android.widget.LinearLayout[1]/android.widget.TextView")
el4.click()
#####################复制录制的脚本#############################
time.sleep(5)
driver.quit()
运行效果:
报错
An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'D\:\\adt-bundle-windows-x86_64-20140702\\sdk\\platform-tools\\adb.exe -P 5037 -s d270ac3a shell pm clear com.xueqiu.android' exited with code 255'; Stderr: 'Security exception: PID 26038 does not have permission android.permission.CLEAR_APP_USER_DATA to clear data of package com.xueqiu.android java.lang.SecurityException: PID 26038 does not have permission android.permission.CLEAR_APP_USER_DATA to clear data of package com.xueqiu.android at com.android.server.am.ActivityManagerService.clearApplicationUserData(ActivityManagerService.java:7695) at com.android.server.pm.PackageManagerShellCommand.runClear(PackageManagerShellCommand.java:1632) at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:204) at android.os.ShellCommand.exec(ShellCommand.java:103) at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:24667) at android.os.Binder.shellCommand(Binder.java:634) at android.os.Binder.onTransact(Binder.java:532) at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:3152) at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:4970) at android.os.Binder.execTransact(Binder.java:731)'; Code: '255'
Security exception: PID 26038 does not have permission android.permission.CLEAR_APP_USER_DATA to clear data of package com.xueqiu.android
原因:
安卓手机未开启OEM解锁
解决:
设置>开发者选项>OEM解锁,改为开启
Capability设置
https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
Capability | Description | Values |
---|---|---|
automationName | automation引擎 | Appium (default), or UiAutomator2, Espresso, or UiAutomator1 for Android, or XCUITest or Instruments for iOS, or YouiEngine for application built with You.i Engine |
app | app地址 | /abs/path/to/my.apk or http://myapp.com/app.ipa |
platformName | 手机使用的操作系统 | iOS, Android, or FirefoxOS |
platformVersion | 操作系统版本 | e.g., 7.1, 4.4 |
deviceName | 设备名称 | iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4 |
udid | 设备唯一标识符 | e.g. 1ae203187fc012g |
noReset | 不重置app状态 | true, false |
fullReset | 重置app | true, false |
dontStopAppOnReset | 在使用adb启动应用程序之前,不会停止测试应用程序的进程。如果被测试的应用程序是由另一个锚应用程序创建的,设置为false,则允许锚应用程序的进程在使用adb启动测试应用程序期间仍然是活动的。换句话说,当dontStopAppOnReset设置为true时,我们将不会在adb shell am start调用中包含-S标志。省略此功能或将其设置为false后,我们将包含-S标志。默认false | true, false |
newCommandTimeout | 在假定客户机退出并结束会话之前,Appium等待来客户机新命令的时间(以秒为单位) | e.g 60单位秒 |
appActivity【安卓】 | 启动的Android活动(页面)的活动(页面)名 | MainActivity, .Settings |
appPackage【安卓】 | apk包名 | com.example.android.myApp, com.android.settings |
dontStopAppOnReset【安卓】 | 在adb启动应用程序之前,不会停止测试应用程序的进程 | true or false |
skipDeviceInitialization【安卓】 | 跳过设备初始化,包括.安装和运行设置应用程序或设置权限。可用于提高启动性能 | true or false |
unicodeKeyboard【安卓】 | 支持Unicode 输入, 默认为false;切换非英文输入 | true or false |
resetKeyboard【安卓】 | 将键盘重置为其原始状态为false | true or false |
autoGrantPermissions【安卓】 | 在安装时自动授权app所需要的权限,默认为fasle。如果noReset为 true,此配置不生效。 | true or false |
skipDeviceInitialization【安卓】 | 跳过设备初始化,包括安装和运行设置应用程序或设置权限。可用于提高启动性能,设备已用于自动化,并为下一次自动化做好准备。默认为false | true or false |
skipUnlock【安卓】 | 在会话创建期间跳过解锁。默认值为false | true or false |
skipLogcatCapture【安卓】 | 跳过捕捉logcat日志。它可能会提高性能,比如网络。日志相关的命令将无法工作。默认值为false。 | true or false |