一、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 服务器初始化参数


描述


automationName

自动化测试的引擎

Appium (默认)或者 Selendroid

platformName

使用的手机操作系统

iOS, Android, 或者 FirefoxOS

platformVersion

手机操作系统的版本

例如 7.1, 4.4

deviceName

使用的手机或模拟器类型

iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, 等等.... 在 iOS 上,使用 Instruments 的 instruments -s devices 命令可返回一个有效的设备的列表。在 Andorid 上虽然这个参数目前已被忽略,但仍然需要添加上该参数

app

本地绝对路径_或_远程 http URL 所指向的一个安装包(.ipa,.apk,或 .zip 文件)。Appium 将其安装到合适的设备上。请注意,如果您指定了 appPackageappActivity 参数(见下文),Android 则不需要此参数了。该参数也与 browserName 不兼容。

/abs/path/to/my.apkhttp://myapp.com/app.ipa

browserName

做自动化时使用的浏览器名字。如果是一个应用则只需填写个空的字符串

'Safari' 对应 iOS,'Chrome', 'Chromium', 或 'Browser' 则对应 Android

newCommandTimeout

用于客户端在退出或者结束 session 之前,Appium 等待客户端发送一条新命令所花费的时间(秒为单位)

例如 60

language

(Sim/Emu-only) 为模拟器设置语言

例如 fr

locale

(Sim/Emu-only) 为模拟器设置所在区域

例如 fr_CA

udid

连接真机的唯一设备号

例如 1ae203187fc012g

orientation

(Sim/Emu-only) 模拟器当前的方向

竖屏横屏

autoWebview

直接转换到 Webview 上下文(context)。默认值为 false

true, false

noReset

在当前 session 下不会重置应用的状态。默认值为 false

true, false

fullReset

(iOS)删除所有的模拟器文件夹。(Android) 要清除 app 里的数据,请将应用卸载才能达到重置应用的效果。在 Android, 在 session 完成之后也会将应用卸载掉。默认值为 false

true, false

Android 独有


描述


appActivity

Activity 的名字是指从你的包中所要启动的 Android acticity。他通常需要再前面添加. (例如 使用 .MainActivity 代替 MainActivity

MainActivity, .Settings

appPackage

运行的 Android 应用的包名

com.example.android.myApp, com.android.settings

appWaitActivity

用于等待启动的 Android Activity 名称

SplashActivity

appWaitPackage

用于等待启动的 Android 应用的包

com.example.android.myApp, com.android.settings

appWaitDuration

用于等待 appWaitActivity 启动的超时时间(以毫秒为单位)(默认值为 20000)

30000

deviceReadyTimeout

用于等待模拟器或真机准备就绪的超时时间

5

androidCoverage

用于执行测试的 instrumentation 类。 传送 -w 参数到如下命令 adb shell am instrument -e coverage true -w

com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation

enablePerformanceLogging

(仅适用于 Chrome 与 webview)开启 Chromedriver 的性能日志。(默认值为 false

true, false

androidDeviceReadyTimeout

用于等待设备在启动应用后准备就绪的超时时间。以秒为单位。

例如 30

androidInstallTimeout

用于等待在设备中安装 apk 所花费的时间(以毫秒为单位)。默认值为 90000

例如 90000

adbPort

用来连接 ADB 服务器的端口(默认值为 5037

5037

androidDeviceSocket

开发工具的 socket 名称。只有在被测应用是一个使用 Chromium 内核的浏览器时才需要。socket 会被浏览器打开,然后 Chromedriver 把它作为开发者工具来进行连接。

例如 chrome_devtools_remote

avd

被启动 avd 的名字

例如 api19

avdLaunchTimeout

用于等待 avd 启动并连接 ADB 的超时时间(以毫秒为单位),默认值为 120000

300000

avdReadyTimeout

用于等待 avd 完成启动动画的超时时间(以毫秒为单位),默认值为 120000

300000

avdArgs

启动 avd 时使用的额外参数

例如 -netfast

useKeystore

使用自定义的 keystore 给 apk 签名,默认值为 false

truefalse

keystorePath

自定义 keystore 的路径, 默认路径为 ~/.android/debug.keystore

例如 /path/to.keystore

keystorePassword

自定义 keystore 的密码

例如 foo

keyAlias

key 的别名

例如 androiddebugkey

keyPassword

key 的密码

例如 foo

chromedriverExecutable

webdriver 可执行文件的绝对路径(如果 Chromium 内嵌一个自己提供的 webdriver,则应使用他去替换掉 Appium 自带的 chromedriver)

/abs/path/to/webdriver

autoWebviewTimeout

用于等待 Webview 上下文(context)激活的时间(以毫秒为单位)。默认值为 2000

例如 4

intentAction

用于启动 activity 的 intent action(默认值为 android.intent.action.MAIN)

例如 android.intent.action.MAIN, android.intent.action.VIEW

intentCategory

用于启动 activity 的 intent category。(默认值为 android.intent.category.LAUNCHER)

例如 android.intent.category.LAUNCHER, android.intent.category.APP_CONTACTS

intentFlags

用于启动 activity 的标识(flags)(默认值为 0x10200000

例如 0x10200000

optionalIntentArguments

用于启动 activity 的额外 intent 参数。请查看 Intent 参数

例如 --esn <EXTRA_KEY>, --ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>, 等等。

dontStopAppOnReset

在使用 adb 启动应用之前,不要终止被测应用的进程。如果被测应用是被其他钩子(anchor)应用所创建的,设置该参数为 false 后,就允许钩子(anchor)应用的进程在使用 adb 启动被测应用期间仍然存在。换而言之,设置 dontStopAppOnResettrue 后,我们在 adb shell am start 的调用中不需要包含 -S标识(flag)。忽略该 capability 或 设置为 false 的话,就需要包含 -S 标识(flag)。默认值为 false

truefalse

unicodeKeyboard

使用 Unicode 输入法。 默认值为 false

truefalse

resetKeyboard

在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。默认值为 false

truefalse

noSign

跳过检查和对应用进行 debug 签名的步骤。仅适用于 UiAutomator,不适用于 selendroid。 默认值为 false

truefalse

ignoreUnimportantViews

调用 uiautomator 的函数 setCompressedLayoutHierarchy()。由于 Accessibility 命令在忽略部分元素的情况下执行速度会加快,这个关键字能加快测试执行的速度。被忽略的元素将不能够被找到,因此这个关键字同时也被实现成可以随时改变的 设置 ( settings )。 默认值为 false

truefalse

disableAndroidWatchers

禁用 android 监视器(watchers)。监视器用于见识应用程序的无响应状态(anr)和崩溃(crash),禁用会降低 Android 设备或模拟器的 CPU 使用率。该 capability 仅在使用 UiAutomator 时有效,不适用于 selendroid,默认设置为 false

truefalse

chromeOptions

允许对 ChromeDriver 传 chromeOptions 的参数。了解更多信息请查阅 chromeOptions

chromeOptions: {args: ['--disable-popup-blocking']}

recreateChromeDriverSessions

当移除非 ChromeDriver webview时,终止掉 ChromeDriver 的 session。默认设置为 false

truefalse

nativeWebScreenshot

在 web 的上下文(context),使用原生(native)的方法去截图,而不是用过代理的 ChromeDriver。默认值为 false

truefalse

androidScreenshotPath

在设备中截图被保存的目录名。默认值为 /data/local/tmp

例如 /sdcard/screenshots/

autoGrantPermissions

让Appium自动确定您的应用需要哪些权限,并在安装时将其授予应用。默认设置为 false

truefalse

iOS 独有


描述


calendarFormat

(仅支持模拟器) 为iOS的模拟器设置日历格式

例如 gregorian

bundleId

被测应用的 bundle ID 。用于在真实设备中启动测试,也用于使用其他需要 bundle ID 的关键字启动测试。在使用 bundle ID 在真实设备上执行测试时,你可以不提供 app 关键字,但你必须提供 udid

例如 io.appium.TestApp

udid

连接的真实设备的唯一设备编号 (Unique device identifier)

例如 1ae203187fc012g

launchTimeout

以毫秒为单位,在 Appium 运行失败之前设置一个等待 instruments 的时间

例如 20000

locationServicesEnabled

(仅支持模拟器)强制打开或关闭定位服务。默认值是保持当前模拟器的设定.

truefalse

locationServicesAuthorized

(仅支持模拟器)通过修改 plist 文件设定是否允许应用使用定位服务,从而避免定位服务的警告出现。默认值是保持当前模拟器的设定。请注意在使用这个关键字时,你同时需要使用 bundleId 关键字来发送你的应用的 bundle ID。

truefalse

autoAcceptAlerts

当警告弹出的时候,都会自动去点接受。包括隐私访问权限的警告(例如 定位,联系人,照片)。默认值为 false。不支持基于 XCUITest 的测试。

truefalse

autoDismissAlerts

当警告弹出的时候,都会自动去点取消。包括隐私访问权限的警告(例如 定位,联系人,照片)。默认值为 false。不支持基于 XCUITest 的测试。

truefalse

nativeInstrumentsLib

使用原生 intruments 库(即关闭 instruments-without-delay)。

truefalse

nativeWebTap

(仅支持模拟器)在Safari中允许“真实的",非基于 javascript 的 web 点击 (tap) 。 默认值:false。注意:取决于 viewport 大小/比例, 点击操作不一定能精确地点中对应的元素。

truefalse

safariInitialUrl

(仅支持模拟器) (>= 8.1) 初始化 safari 的时使用的地址。默认是一个本地的欢迎页面

例如 https://www.github.com

safariAllowPopups

(仅支持模拟器)允许 javascript 在 Safari 中创建新窗口。默认保持模拟器当前设置。

truefalse

safariIgnoreFraudWarning

(仅支持模拟器)阻止 Safari 显示此网站可能存在风险的警告。默认保持浏览器当前设置。

truefalse

safariOpenLinksInBackground

(仅支持模拟器)Safari 是否允许链接在新窗口打开。默认保持浏览器当前设置。

truefalse

keepKeyChains

(仅支持模拟器)当 Appium 会话开始/结束时是否保留存放密码存放记录 (keychains) 库(Library)/钥匙串(Keychains))

truefalse

localizableStringsDir

从哪里查找本地化字符串。默认值为 en.lproj

en.lproj

processArguments

通过 instruments 传递到 AUT 的参数

例如 -myflag

interKeyDelay

以毫秒为单位,按下每一个按键之间的延迟时间

例如 100

showIOSLog

是否在 Appium 的日志中显示设备的日志。默认值为 false

truefalse

sendKeyStrategy

输入文字到文字框的策略。模拟器默认值:oneByOne(一个接着一个)。真实设备默认值:grouped (分组输入)

oneByOne, groupedsetValue

screenshotWaitTimeout

以秒为单位,生成屏幕截图的最长等待时间。默认值为:10

例如 5

waitForAppScript

用于判断 "应用是否被启动” 的 iOS 自动化脚本代码。默认情况下系统等待直到页面内容非空。结果必须是布尔类型。

例如 true;, target.elements().length > 0;, $.delay(5000); true;

webviewConnectRetries

用于获取 webview 失败时,发送连接信息到远程调试器的次数。默认次数为: 8

例如 12

appName

被测应用的名字。 用于支持 iOS 9 以上系统的应用的自动化。

例如 UICatalog

customSSLCert

(Sim/Emu-only) 给模拟器添加一个 SSL 证书。

例如

-----BEGIN CERTIFICATE-----MIIFWjCCBEKg...-----END CERTIFICATE-----

使用 XCUITest(iOS 独有)


描述


processArguments

将会传送到 WebDriverAgent 的进程参数与环境

{ args: ["a", "b", "c"] , env: { "a": "b", "c": "d" } }'{"args": ["a", "b", "c"], "env": { "a": "b", "c": "d" }}'

wdaLocalPort

如果这个值被指定了,Mac 主机就会使用这个端口,通过 USB 发送数据到 iOS 设备中。默认的端口与 iOS 设备中 WDA 的端口号是一致的。

例如 8100

showXcodeLog

是否显示运行测试时 Xcode 的输出日志,如果值设置为 true ,则会在启动的时候产生大量的额外日志。默认设置为 false

例如 true

iosInstallPause

安装应用程序与启动 WebDriverAgent 之间停止的间隔时间(以毫秒为单位),特别适用于体积较大的包。默认是设置为 0

例如 8000

xcodeConfigFile

一个可选的 Xcode 可配置文件的完整路径,用于指定在真机上运行 WebDriverAgent 的个人身份或者团队身份的代码签名。

例如 /path/to/myconfig.xcconfig

keychainPath

从系统的 keychain 中导出私有开发秘钥的完整路径。在真机测试时与 keychainPassword 配合使用。

例如 /path/to/MyPrivateKey.p12

keychainPassword

keychainPath 中指定 keychain 的解锁密码。

例如 super awesome password

scaleFactor

模拟器缩放因子。这对于默认分辨率是大于实际分辨的模拟器来说非常有用。因此,你不用上下滑动模拟器的屏幕就能看到所有模拟器显示的内容了。

可接受的值为: '1.0', '0.75', '0.5', '0.33' 和 '0.25'。 这些值都应该是一个字符串

preventWDAAttachments

设置 WebDriverAgent 项目中的 DerivedData 文件夹的权限为仅可读。为了防止 XCTest 框架产生大量无用的截屏与日志,该设置是非常必要的,因为这是不可能通过 Apple 提供的接口去关闭的。

设置 capabilitity 为 true 将会设置 Posix 的文件夹的权限为 555,设置为 false 则会将权限重置回 755

webDriverAgentUrl

若提供了 URL,Appium 将在这 URL 上连接现有的 WebDriverAgent 实例,而不是重新启动一个。

例如 http://localhost:8100

useNewWDA

若设置为 true,则直接卸载设备上现存的所有 WebDriverAgent 客户端。在某些情况,该做法可以提高稳定性。默认设置为 false

例如 true

wdaLaunchTimeout

等待 WebDriverAgent 可 ping 同的时间(以毫秒为单位)。默认设置为 60000ms。

例如 30000

calendarAccessAuthorized

若设置为 true,则允许在 iOS 模拟器上访问日历。若设置为 false,则不被允许。否则,日历的 authorizationStatus 会保持不变。

-

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

appium python 原生 python appium教程_默认值

appium python 原生 python appium教程_appium_02

启动时碰到的坑!!!

  • 错误提示:
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了

appium python 原生 python appium教程_pycharm_03


第二步:

Encountered internal error running command: Error: activity and pkg are required to start an application

原因:启动参数的名称写错了
正确的应该是 “appActivity

4、appium的功能介绍

(1)三种模式

  • Simple:简单模式
  • appium python 原生 python appium教程_python_04

  • Edit Configurations:可以配置android sdk和Java sdk的环境地址,如果之前已经配置好,会有默认的地址
  • Advanced:高级模式
  • appium python 原生 python appium教程_默认值_05

  • 可以勾选一下
  • appium python 原生 python appium教程_python_06

  • Presets:预设;可以存放已配置好的配置,直接用就可

(2)

appium python 原生 python appium教程_appium python 原生_07

appium python 原生 python appium教程_appium_08

appium python 原生 python appium教程_pycharm_09

如果某处有id,元素id值是唯一的,所以可用id去进行定位发送秘钥:对文本框进行输入

清空:清空文本框里的内容

appium python 原生 python appium教程_pycharm_10

appium python 原生 python appium教程_appium python 原生_11