一、appium的基本使用
appium环境安装
1、安装Android SDK
(1)配置环境变量
- 用户变量的path添加以下三个路径:
%ANDROID_HOME%\build-tools\31.0.0
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
- 系统变量添加:
变量名:ANDROID_HONE
变量值:安装的具体路径
(2)cmd中输入:android和adb来查看是否安装成功
2、安装Appium
全点下一步就行
3、安装手机模拟器
个人安装的是夜神模拟器【目前换成雷电了,感觉雷电更好用】
4、Pycharm安装 appium-python-alicent
终端里输入pip install Appium-Python-Client
5、连接appium和模拟器
有的模拟器会自动连上(雷电模拟器打开后,可以自动连接appium),如果需要手动连接,可尝试以下操作:
第一步:模拟器中打开“开发者选项”,设置-关于手机-版本号,连点五次版本号就可以打开
第二步:可参考该文章的连接方式:
连接中碰见的问题:
- 问题:error: protocol fault (couldn‘t read status): Connection reset by peer,则说明端口号被占用,5037是adb的默认端口号
- 解决方法:查看哪个程序占用了adb端口,结束这个程序,然后重启adb
- 解决步骤:
1:使用命令:netstat -aon|findstr “5037” 找到占用5037端口的进程PID。
2:使用命令:tasklist|findstr “30312” 通过PID找出进程。
3:使用命令:taskkill /pid 30312 /f 通过PID关闭进程。
4:使用命令:adb start-server 启动adb就行了
最后再dbc devices 查看一下是否连上了
6、Python代码调用appium软件,appium软件在通过adb命令调用android操作系统(模拟器/真机)
appium的使用流程
1、 Appium Python API地址
Appium Python API 中文版:https://testerhome.com/topics/3711
appium官方文档地址:http://appium.io/docs/cn/about-appium/intro/#_1
2、准备工作
(1)appium启动
(2)连接手机或者启动模拟器
(3)通过adb命令查看设备是否已连接
(4)启动参数配置
- Appium 服务器初始化参数
键 | 描述 | 值 |
| 自动化测试的引擎 |
|
| 使用的手机操作系统 |
|
| 手机操作系统的版本 | 例如 |
| 使用的手机或模拟器类型 |
|
| 本地绝对路径_或_远程 http URL 所指向的一个安装包( |
|
| 做自动化时使用的浏览器名字。如果是一个应用则只需填写个空的字符串 | 'Safari' 对应 iOS,'Chrome', 'Chromium', 或 'Browser' 则对应 Android |
| 用于客户端在退出或者结束 session 之前,Appium 等待客户端发送一条新命令所花费的时间(秒为单位) | 例如 |
| (Sim/Emu-only) 为模拟器设置语言 | 例如 |
| (Sim/Emu-only) 为模拟器设置所在区域 | 例如 |
| 连接真机的唯一设备号 | 例如 |
| (Sim/Emu-only) 模拟器当前的方向 |
|
| 直接转换到 Webview 上下文(context)。默认值为 |
|
| 在当前 session 下不会重置应用的状态。默认值为 |
|
| (iOS)删除所有的模拟器文件夹。(Android) 要清除 app 里的数据,请将应用卸载才能达到重置应用的效果。在 Android, 在 session 完成之后也会将应用卸载掉。默认值为 |
|
Android 独有
键 | 描述 | 值 |
| Activity 的名字是指从你的包中所要启动的 Android acticity。他通常需要再前面添加 |
|
| 运行的 Android 应用的包名 |
|
| 用于等待启动的 Android Activity 名称 |
|
| 用于等待启动的 Android 应用的包 |
|
| 用于等待 appWaitActivity 启动的超时时间(以毫秒为单位)(默认值为 |
|
| 用于等待模拟器或真机准备就绪的超时时间 |
|
| 用于执行测试的 instrumentation 类。 传送 |
|
| (仅适用于 Chrome 与 webview)开启 Chromedriver 的性能日志。(默认值为 |
|
| 用于等待设备在启动应用后准备就绪的超时时间。以秒为单位。 | 例如 |
| 用于等待在设备中安装 apk 所花费的时间(以毫秒为单位)。默认值为 | 例如 |
| 用来连接 ADB 服务器的端口(默认值为 |
|
| 开发工具的 socket 名称。只有在被测应用是一个使用 Chromium 内核的浏览器时才需要。socket 会被浏览器打开,然后 Chromedriver 把它作为开发者工具来进行连接。 | 例如 |
| 被启动 avd 的名字 | 例如 |
| 用于等待 avd 启动并连接 ADB 的超时时间(以毫秒为单位),默认值为 |
|
| 用于等待 avd 完成启动动画的超时时间(以毫秒为单位),默认值为 |
|
| 启动 avd 时使用的额外参数 | 例如 |
| 使用自定义的 keystore 给 apk 签名,默认值为 |
|
| 自定义 keystore 的路径, 默认路径为 ~/.android/debug.keystore | 例如 |
| 自定义 keystore 的密码 | 例如 |
| key 的别名 | 例如 |
| key 的密码 | 例如 |
| webdriver 可执行文件的绝对路径(如果 Chromium 内嵌一个自己提供的 webdriver,则应使用他去替换掉 Appium 自带的 chromedriver) |
|
| 用于等待 Webview 上下文(context)激活的时间(以毫秒为单位)。默认值为 | 例如 |
| 用于启动 activity 的 intent action(默认值为 | 例如 |
| 用于启动 activity 的 intent category。(默认值为 | 例如 |
| 用于启动 activity 的标识(flags)(默认值为 | 例如 |
| 用于启动 activity 的额外 intent 参数。请查看 Intent 参数 | 例如 |
| 在使用 adb 启动应用之前,不要终止被测应用的进程。如果被测应用是被其他钩子(anchor)应用所创建的,设置该参数为 false 后,就允许钩子(anchor)应用的进程在使用 adb 启动被测应用期间仍然存在。换而言之,设置 |
|
| 使用 Unicode 输入法。 默认值为 |
|
| 在设定了 |
|
| 跳过检查和对应用进行 debug 签名的步骤。仅适用于 UiAutomator,不适用于 selendroid。 默认值为 |
|
| 调用 uiautomator 的函数 |
|
| 禁用 android 监视器(watchers)。监视器用于见识应用程序的无响应状态(anr)和崩溃(crash),禁用会降低 Android 设备或模拟器的 CPU 使用率。该 capability 仅在使用 UiAutomator 时有效,不适用于 selendroid,默认设置为 |
|
| 允许对 ChromeDriver 传 chromeOptions 的参数。了解更多信息请查阅 chromeOptions |
|
| 当移除非 ChromeDriver webview时,终止掉 ChromeDriver 的 session。默认设置为 |
|
| 在 web 的上下文(context),使用原生(native)的方法去截图,而不是用过代理的 ChromeDriver。默认值为 |
|
| 在设备中截图被保存的目录名。默认值为 | 例如 |
| 让Appium自动确定您的应用需要哪些权限,并在安装时将其授予应用。默认设置为 |
|
iOS 独有
键 | 描述 | 值 |
| (仅支持模拟器) 为iOS的模拟器设置日历格式 | 例如 |
| 被测应用的 bundle ID 。用于在真实设备中启动测试,也用于使用其他需要 bundle ID 的关键字启动测试。在使用 bundle ID 在真实设备上执行测试时,你可以不提供 | 例如 |
| 连接的真实设备的唯一设备编号 (Unique device identifier) | 例如 |
| 以毫秒为单位,在 Appium 运行失败之前设置一个等待 instruments 的时间 | 例如 |
| (仅支持模拟器)强制打开或关闭定位服务。默认值是保持当前模拟器的设定. |
|
| (仅支持模拟器)通过修改 plist 文件设定是否允许应用使用定位服务,从而避免定位服务的警告出现。默认值是保持当前模拟器的设定。请注意在使用这个关键字时,你同时需要使用 |
|
| 当警告弹出的时候,都会自动去点接受。包括隐私访问权限的警告(例如 定位,联系人,照片)。默认值为 false。不支持基于 |
|
| 当警告弹出的时候,都会自动去点取消。包括隐私访问权限的警告(例如 定位,联系人,照片)。默认值为 false。不支持基于 |
|
| 使用原生 intruments 库(即关闭 instruments-without-delay)。 |
|
| (仅支持模拟器)在Safari中允许“真实的",非基于 javascript 的 web 点击 (tap) 。 默认值: |
|
| (仅支持模拟器) (>= 8.1) 初始化 safari 的时使用的地址。默认是一个本地的欢迎页面 | 例如 |
| (仅支持模拟器)允许 javascript 在 Safari 中创建新窗口。默认保持模拟器当前设置。 |
|
| (仅支持模拟器)阻止 Safari 显示此网站可能存在风险的警告。默认保持浏览器当前设置。 |
|
| (仅支持模拟器)Safari 是否允许链接在新窗口打开。默认保持浏览器当前设置。 |
|
| (仅支持模拟器)当 Appium 会话开始/结束时是否保留存放密码存放记录 (keychains) 库(Library)/钥匙串(Keychains)) |
|
| 从哪里查找本地化字符串。默认值为 |
|
| 通过 instruments 传递到 AUT 的参数 | 例如 |
| 以毫秒为单位,按下每一个按键之间的延迟时间 | 例如 |
| 是否在 Appium 的日志中显示设备的日志。默认值为 |
|
| 输入文字到文字框的策略。模拟器默认值: |
|
| 以秒为单位,生成屏幕截图的最长等待时间。默认值为:10 | 例如 |
| 用于判断 "应用是否被启动” 的 iOS 自动化脚本代码。默认情况下系统等待直到页面内容非空。结果必须是布尔类型。 | 例如 |
| 用于获取 webview 失败时,发送连接信息到远程调试器的次数。默认次数为: | 例如 |
| 被测应用的名字。 用于支持 iOS 9 以上系统的应用的自动化。 | 例如 |
| (Sim/Emu-only) 给模拟器添加一个 SSL 证书。 | 例如
|
使用 XCUITest(iOS 独有)
键 | 描述 | 值 |
| 将会传送到 WebDriverAgent 的进程参数与环境 |
|
| 如果这个值被指定了,Mac 主机就会使用这个端口,通过 USB 发送数据到 iOS 设备中。默认的端口与 iOS 设备中 WDA 的端口号是一致的。 | 例如 |
| 是否显示运行测试时 Xcode 的输出日志,如果值设置为 | 例如 |
| 安装应用程序与启动 WebDriverAgent 之间停止的间隔时间(以毫秒为单位),特别适用于体积较大的包。默认是设置为 | 例如 |
| 一个可选的 Xcode 可配置文件的完整路径,用于指定在真机上运行 WebDriverAgent 的个人身份或者团队身份的代码签名。 | 例如 |
| 从系统的 keychain 中导出私有开发秘钥的完整路径。在真机测试时与 | 例如 |
| 在 | 例如 |
| 模拟器缩放因子。这对于默认分辨率是大于实际分辨的模拟器来说非常有用。因此,你不用上下滑动模拟器的屏幕就能看到所有模拟器显示的内容了。 | 可接受的值为: |
| 设置 WebDriverAgent 项目中的 DerivedData 文件夹的权限为 | 设置 capabilitity 为 |
| 若提供了 URL,Appium 将在这 URL 上连接现有的 WebDriverAgent 实例,而不是重新启动一个。 | 例如 |
| 若设置为 | 例如 |
| 等待 WebDriverAgent 可 ping 同的时间(以毫秒为单位)。默认设置为 60000ms。 | 例如 |
| 若设置为 | - |
3、启动参数配置及启动APP
- app启动参数及启动app的完整代码
from appium.webdriver import Remote #引入打开软件的包
#app的启动参数
desired_cap={
"platformName":"Android", #手机系统
"platformVersion": "7.1.2", #手机系统版本
"deviceName":'HUAWEI', #手机的名字,不会进行校验,但是没有会报错
"automationName":"UiAutomator2",#自动化测试框架 (1.4以上的appium不用写)
"appPackage":"com.taobao.taobao",#app包名
"appActivity":"com.taobao.tao.welcome.Welcome",#app的启动页面
}
driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_cap)
- APP包名获取
第一步:打开apk所在的文件夹,文件夹的路径上输入cmd,回车
第二步:
#aapt:安卓资源打包工具
aapt dump badging app应用.apk #apk的名字最好是英文,否则会出问题
例如:aapt dump badging taobao.apk
启动时碰到的坑!!!
- 错误提示:
D:\pycharm\Python\Scripts\python.exe C:/Users/Wheat/PycharmProjects/pythonProject/app_01day_project/demo1_appium入门.py
Traceback (most recent call last):
File "D:\pycharm\Python\lib\site-packages\urllib3\connection.py", line 175, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
File "D:\pycharm\Python\lib\site-packages\urllib3\util\connection.py", line 96, in create_connection
raise err
File "D:\pycharm\Python\lib\site-packages\urllib3\util\connection.py", line 86, in create_connection
sock.connect(sa)
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 706, in urlopen
chunked=chunked,
File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 394, in _make_request
conn.request(method, url, **httplib_request_kw)
File "D:\pycharm\Python\lib\site-packages\urllib3\connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 1262, in request
self._send_request(method, url, body, headers, encode_chunked)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 1308, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 1257, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 1028, in _send_output
self.send(msg)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 968, in send
self.connect()
File "D:\pycharm\Python\lib\site-packages\urllib3\connection.py", line 205, in connect
conn = self._new_conn()
File "D:\pycharm\Python\lib\site-packages\urllib3\connection.py", line 187, in _new_conn
self, "Failed to establish a new connection: %s" % e
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x00000168E72F4588>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/Wheat/PycharmProjects/pythonProject/app_01day_project/demo1_appium入门.py", line 13, in <module>
driver = Remote(command_executor='http://127.0.0.1:4444/wd/hub',desired_capabilities=desired_cap)
File "D:\pycharm\Python\lib\site-packages\appium\webdriver\webdriver.py", line 274, in __init__
AppiumConnection(command_executor, keep_alive=keep_alive), desired_capabilities, browser_profile, proxy
File "D:\pycharm\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 268, in __init__
self.start_session(capabilities, browser_profile)
File "D:\pycharm\Python\lib\site-packages\appium\webdriver\webdriver.py", line 364, in start_session
response = self.execute(RemoteCommand.NEW_SESSION, parameters)
File "D:\pycharm\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 422, in execute
response = self.command_executor.execute(driver_command, params)
File "D:\pycharm\Python\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 421, in execute
return self._request(command_info[0], url, body=data)
File "D:\pycharm\Python\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 443, in _request
resp = self._conn.request(method, url, body=body, headers=headers)
File "D:\pycharm\Python\lib\site-packages\urllib3\request.py", line 79, in request
method, url, fields=fields, headers=headers, **urlopen_kw
File "D:\pycharm\Python\lib\site-packages\urllib3\request.py", line 170, in request_encode_body
return self.urlopen(method, url, **extra_kw)
File "D:\pycharm\Python\lib\site-packages\urllib3\poolmanager.py", line 375, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 796, in urlopen
**response_kw
File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 796, in urlopen
**response_kw
File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 796, in urlopen
**response_kw
File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 756, in urlopen
method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
File "D:\pycharm\Python\lib\site-packages\urllib3\util\retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=4444): Max retries exceeded with url: /wd/hub/session (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000168E72F4588>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))
Process finished with exit code 1
- 解决步骤
第一步:
driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_cap)
command_executor的端口号一定要与appium上给你一致;这样就解决一部分的bug了
第二步:
Encountered internal error running command: Error: activity and pkg are required to start an application
原因:启动参数的名称写错了
正确的应该是 “appActivity”
4、appium的功能介绍
(1)三种模式
- Simple:简单模式
- Edit Configurations:可以配置android sdk和Java sdk的环境地址,如果之前已经配置好,会有默认的地址
- Advanced:高级模式
- 可以勾选一下
- Presets:预设;可以存放已配置好的配置,直接用就可
(2)
如果某处有id,元素id值是唯一的,所以可用id去进行定位发送秘钥:对文本框进行输入
清空:清空文本框里的内容