序章
Capability は Appium Desired Capabilities とも呼ばれます。これまでに作成した非常に多くのコード例から、いくつかの規則、つまり、一部のコードが常に繰り返し表示されることがわかります。この部分は Capability の構成です。そこで今日は、ケイパビリティを友達に共有し、紹介し、説明します。彼女の詳細と、コードにそのように書かれている理由を教えてください。
1. 能力とは何か
機能について話す前に、ログについて話したときに見た起動時のログをまだ覚えていますか? 一部の構成情報は、起動ログ全体に表示されます。実際、その情報は、機能によって伝達される構成情報です。コードを通じてコードを開始すると、表示できる構成情報は次のとおりです。
上記の設定情報から、Python で話している機能が実際には辞書であることがわかります (言語ごとに名前が異なるため、ここでは辞書であるとしましょう)。
2. 能力の役割
Capability が辞書であることが分かった後、その機能を知る必要があるでしょうか? appium でアプリを構成した後、ログを通じて、内部の情報が起動に必要な構成であることがわかります。また、上記の構成情報を通じて、機能構成が自動化に必要な情報であることもわかります。彼は主に、テストしているのがブラウザなのかアプリなのか、iOSなのかAndroidなのか、そしてAndroidのバージョン情報をサーバーに伝えます。機能がサーバーに通知しない場合、サーバーはユーザーを認識せず、自動テストを完了できません。
3. 共通のCapability構成の説明
3.1 公的能力
Capability について学んだ人なら誰でも問題に気づくでしょう。実際には、大きく 3 つの部分に分かれています。パブリック部分、ios 部分、android 部分です。android で ios を使用したい場合は、不可能なので、正直にそれぞれを理解してくださいプラットフォームとその機能は何ですか。以下によく使われるものを紹介します
能力 |
説明 |
価値 |
オートメーション名 |
どの自動化エンジンを使用するか |
Appium (デフォルト)、Selendroid、UiAutomator2、Android の場合は Espresso、You.i エンジンで構築されたアプリケーションの場合は XCUITestiOS、または YouiEngine |
プラットフォーム名 |
どのモバイル オペレーティング システム プラットフォームを使用するか |
iOS、Android、FirefoxOS |
プラットフォームのバージョン |
モバイルOSのバージョン |
例: 7.1、4.4 |
装置名 |
使用されるモバイルデバイスまたはエミュレータの種類 |
iPhone シミュレーター、iPad シミュレーター、iPhone Retina 4 インチ、Android エミュレーター、Galaxy S4 など。iOS では、これは、instrument -s デバイスとともに返される有効なデバイスの 1 つである必要があります。Android では、この機能は依然として必要ですが、現在無視されています。 |
アプリ |
ファイルまたはリモート http URL への絶対ローカル パス、またはそれらを含む 1 つ。Appium はまず、適切なデバイスにアプリケーション バイナリをインストールしようとします。Android では、 と function を指定する場合、この関数は不要であることに注意してください (下記を参照)。とは互換性がありません。.ipa.apk.zipappPackageappActivitybrowserName |
/abs/path/to/my.apk または http://myapp.com/app.ipa |
ブラウザ名 |
モバイル Web ブラウザーの名前の自動化。自動化アプリケーションではなく、空の文字列である必要があります。 |
iOSの場合は「Safari」、Androidの場合は「Chrome」、「Chromium」または「ブラウザ」 |
新しいコマンドタイムアウト |
Appium は、クライアントが終了したとみなしてセッションを終了する前に、クライアントからの新しいコマンドを (秒単位で) 待機します。 |
例: 60 |
言語 |
(Sim/Emu のみ) シミュレータ/エミュレータ用の言語セット |
たとえば、FR |
ロケール |
(Sim/Emu のみ) シミュレータ/エミュレータ用に設定されたロケール |
たとえば、fr_CA |
ウディド |
接続された物理デバイスの一意のデバイス識別子 |
たとえば、1ae203187fc012g |
オリエンテーション |
(Sim/Emu のみ) 特定の方向から開始します |
風景またはポートレート |
autoWebview |
Webview コンテキストに直接移動します。デフォルトは false |
真/偽 |
いいえリセット |
このセッションの前にアプリケーションの状態をリセットしないでください。詳細はこちらをご覧ください |
真/偽 |
フルリセット |
フルリセットを実行してください。詳細はこちらをご覧ください |
真/偽 |
イベントタイミング |
さまざまな Appium 内部イベント (各コマンドの開始と終了など) の時間レポートを有効または無効にします。デフォルトは false です。有効にするには、true を使用します。これらの時間は、現在のセッションのプロパティ レポートのクエリに応じてイベントとして返されます。この応答の構造については、イベント時間のドキュメントを参照してください。 |
たとえば、本当の |
パフォーマンスログを有効にする |
(Web および Webview のみ) Chromedriver (Android の場合) または Safari (iOS の場合) のパフォーマンス ログを有効にする (デフォルトは false) |
真/偽 |
最も一般的に使用される:
能力 |
説明 |
価値 |
オートメーション名 |
どの自動化エンジンを使用するか |
Appium (デフォルト)、Selendroid、UiAutomator2、Android の場合は Espresso、You.i エンジンで構築されたアプリケーションの場合は XCUITestiOS、または YouiEngine |
プラットフォーム名 |
どのモバイル オペレーティング システム プラットフォームを使用するか (テストする電話のオペレーティング システム) |
iOS、Android、FirefoxOS |
プラットフォームのバージョン |
モバイルOSバージョン(モバイルOSバージョン) |
Android または iOS のバージョン (7.1、4.4 など) |
装置名 |
使用されるモバイルデバイスまたはエミュレータの種類 |
iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4,等....在iOS上,这应该是与仪器返回的有效设备之一instruments -s devices。在Android上,这个功能目前被忽略,尽管它仍然是必需的。 |
app |
apk或者ipa文件所在的路径 |
xxx/xxx.apk |
browserName |
浏览器名称 | Chrome |
newCommandTimeout |
超时时间 | 60 |
language |
手机或者模拟器语言 | |
udid |
连接设备的uid | 1essd2fd3 |
noReset |
不要在会话前重置应用状态,默认false | true/false |
在自动化测试过程中这些公用的Capability用的时间比较多,大家需要记住,去熟悉他的用法。
3.2 Android独有Capability
在自动化测试过程中如果你只知道常用的一些参数配置,这个是远远达不到要求,因为你不知道什么时候有什么样的突发情况发生,所以你需要了解appium所有最常用的配置参数,当然你可以掌握所有,那样更好,熟能生巧。下面我们看一下android的Capability。
这些功能仅适用于基于Android的驱动程序(例如 UiAutomator2)。
能力 |
描述 |
值 |
appActivity |
要从包中启动的Android活动的活动名称。这往往需要在一个.(例如,.MainActivity而不是MainActivity) |
MainActivity, .Settings |
appPackage |
你想运行的Android应用程序的Java包 |
com.example.android.myApp, com.android.settings |
appWaitActivity |
活动名称/名称,逗号分隔,您想要等待的Android活动 |
SplashActivity,SplashActivity,OtherActivity,*,*.SplashActivity |
appWaitPackage |
您想等待的Android应用程序的Java包 |
com.example.android.myApp, com.android.settings |
appWaitDuration |
用于等待appWaitActivity启动的超时(以毫秒为单位20000)(默认) |
30000 |
deviceReadyTimeout |
在等待设备准备就绪的几秒钟内超时 |
5 |
androidCoverage |
完全合格的仪器类。通过-w在adb shell中,仪器-e覆盖率为true -w |
com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation |
androidCoverageEndIntent |
由您自己执行的广播操作,用于将覆盖转储到文件系统。传递到-a在adb外壳广播-a |
com.example.pkg.END_EMMA |
androidDeviceReadyTimeout |
用于等待设备在启动后准备就绪的秒数 |
例如, 30 |
androidInstallTimeout |
用于等待apk安装到设备的超时(以毫秒为单位)。默认为90000 |
例如, 90000 |
androidInstallPath |
安装前将在其中安装apk的设备上的目录名称。默认为/data/local/tmp |
例如 /sdcard/Downloads/ |
adbPort |
用于连接到ADB服务器的端口(默认5037) |
5037 |
remoteAdbHost |
可选的远程ADB服务器主机 |
例如:192.168.0.101 |
androidDeviceSocket |
Devtools套接字名称。只有当测试的应用程序是Chromium嵌入式浏览器时才需要。套接字由浏览器打开,并且Chromedriver作为devtools客户端连接到它。 |
例如, chrome_devtools_remote |
avd |
avd的名称发射 |
例如, api19 |
avdLaunchTimeout |
avd启动并连接到ADB需要多长时间(默认值120000) |
300000 |
avdReadyTimeout |
avd完成启动动画需要多长时间(默认120000) |
300000 |
avdArgs |
启动avd时使用的其他仿真器参数 |
例如, -netfast |
useKeystore |
使用自定义密钥库来签署apks,默认 false |
true 要么 false |
keystorePath |
自定义密钥库路径,默认〜/ .android / debug.keystore |
例如, /path/to.keystore |
keystorePassword |
自定义密钥库的密码 |
例如, foo |
keyAlias |
密钥的别名 |
例如, androiddebugkey |
keyPassword |
密钥的密钥 |
例如, foo |
chromedriverExecutable |
webdriver可执行文件的绝对本地路径(如果Chromium embedder提供了自己的webdriver,则应该使用它来代替与Appium捆绑在一起的原始chromedriver) |
/abs/path/to/webdriver |
autoWebviewTimeout |
等待Webview上下文激活的时间(以毫秒为单位)。默认为2000 |
例如 4 |
intentAction |
意图操作将用于启动活动(默认android.intent.action.MAIN) |
例如android.intent.action.MAIN,android.intent.action.VIEW |
intentCategory |
意图类别,将用于启动活动(默认android.intent.category.LAUNCHER) |
例如android.intent.category.LAUNCHER,android.intent.category.APP_CONTACTS |
intentFlags |
将用于启动活动的标志(默认0x10200000) |
例如 0x10200000 |
optionalIntentArguments |
将用于启动活动的其他意图参数。请参阅意向参数 |
例如--esn <EXTRA_KEY>,--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>等等。 |
dontStopAppOnReset |
在使用adb启动应用程序之前,不要停止被测试的应用程序的进程。如果被测试的应用程序是由另一个定位应用程序创建的,那么将其设置为false将允许在使用adb的测试应用程序启动过程中定位应用程序的过程仍然存在。换句话说,在dontStopAppOnReset设置的时候true,我们不会-S在adb shell am start通话中包含标志。有了这个能力被省略或设置为false,我们包括-S标志。默认false |
true 要么 false |
unicodeKeyboard |
启用Unicode输入,默认 false |
true 要么 false |
resetKeyboard |
使用unicodeKeyboard功能运行Unicode测试后,将键盘重置为原始状态。如果单独使用,则忽略。默认false |
true 要么 false |
<p style="white-space: nowrap;">noSign | 使用调试键跳过检查和签名应用程序,只能使用UiAutomator,而不能使用selendroid,默认false |
true 要么 false |
ignoreUnimportantViews |
调用setCompressedLayoutHierarchy()uiautomator函数。此功能可以加快测试执行速度,因为辅助功能命令将更快地忽略某些元素。被忽略的元素是不可能找到的,这就是为什么这个功能也被实现为可切换的设置以及功能。默认为false |
true 要么 false |
disableAndroidWatchers |
禁用观察应用程序没有响应和应用程序崩溃的android观察者,这将减少Android设备/模拟器上的CPU使用率。这个功能只能用于UiAutomator,而不能用于selendroid,默认false |
true 要么 false |
chromeOptions |
允许ChromeDriver传递chromeOptions功能。有关更多信息,请参阅chromeOptions |
chromeOptions: {args: ['--disable-popup-blocking']} |
recreateChromeDriverSessions |
在移至非ChromeDriver网页浏览的情况下杀死ChromeDriver会话。默认为false |
true 要么 false |
nativeWebScreenshot |
在Web上下文中,使用本地(adb)方法截取屏幕截图,而不是代理ChromeDriver。默认为false |
true 要么 false |
androidScreenshotPath |
将要放置屏幕截图的设备上的目录名称。默认为/data/local/tmp |
例如 /sdcard/screenshots/ |
autoGrantPermissions |
让Appium自动确定您的应用程序需要哪些权限,并在安装时将其授予应用程序。默认为false |
true 要么 false |
networkSpeed |
设置网络速度模拟。指定最大的网络上传和下载速度。默认为full |
['full','gsm', 'edge', 'hscsd', 'gprs', 'umts', 'hsdpa', 'lte', 'evdo']检查-netspeed选项有关avds速度仿真的更多信息 |
gpsEnabled |
在开始会话之前,切换模拟器的gps位置提供程序。默认情况下,仿真器将根据设置的方式启用或不启用此选项。 |
true 要么 false |
isHeadless |
true当不需要显示设备显示时,将此功能设置为无运行模拟器。false是默认值。isHeadless也支持iOS,请检查XCUITest的具体功能。 |
例如, true |
上面的只是一些简单的列子,主要的功能是告诉大家,这些是我们经常用的,如果遇见类似的需求那么可以直接使用,也希望大家看到这里的时候自己动手去操作一下,看他执行的结果到底是怎么样。只有这样你才能算掌握,只是看一遍还是不行的。
3.3 ios独有Capability
在我选择appium时,最主要是因为他能够同时支持ios和android,在基础参数配置中ios也有他自己的独一份,不和android一样,下面我们大概介绍一下:
BoundleId:这个是必须的,如果不配置就无法启动ios app,这个是该app的唯一标示。eg:caps.setCapability("boundleId","ios.mooc.test"),这个只是一个简单的例子。
autoAcceptAlerts: 这个在我们实际项目中非常实用,他就想web端的一个js弹窗,默认情况下是false,如果你的app中有类似情况建议打开。eg:caps.setCapability("autoAcceptAlerts","true")
这些功能仅适用于XCUITest驱动程序和过时的UIAutomation驱动程序。
能力 |
描述 |
值 |
calendarFormat |
(仅限SIM)为iOS模拟器设置的日历格式 |
例如 gregorian |
bundleId |
测试中的应用程序的捆绑ID。用于在真实设备上启动应用程序或在测试启动期间使用其他需要包ID的大写字母。要使用软件包ID在真实设备上运行测试,可以省略“应用”功能,但必须提供“udid”。 |
例如 io.appium.TestApp |
udid |
连接的物理设备的唯一设备标识符 |
例如 1ae203187fc012g |
launchTimeout |
假设它挂起和失败会话之前以毫秒为单位等待仪器的时间 |
例如 20000 |
locationServicesEnabled |
(仅限SIM)强制定位服务处于打开或关闭状态。默认是保持当前的模拟设置。 |
true 要么 false |
locationServicesAuthorized |
(仅限SIM)通过plist将位置服务设置为授权或未授权,以便位置服务警报不会弹出。默认是保持当前的模拟设置。请注意,如果您使用此设置,您还必须使用该bundleId功能发送您的应用的捆绑ID。 |
true 要么 false |
autoAcceptAlerts |
如果弹出,则自动接受所有iOS警报。这包括隐私访问权限提醒(例如,位置,联系人,照片)。默认是false。不适用于XCUITest基于测试。 |
true 要么 false |
autoDismissAlerts |
如果弹出,则自动关闭所有iOS警报。这包括隐私访问权限提醒(例如,位置,联系人,照片)。默认是false。不适用于XCUITest基于测试。 |
true 要么 false |
nativeInstrumentsLib |
使用本机intruments lib(即禁用仪器,无延迟)。 |
true 要么 false |
nativeWebTap |
(仅限SIM)在Safari中启用“真实”,非基于JavaScript的网页浏览。默认:false。警告:根据视口的大小/比例,这可能无法准确地点击一个元素 |
true 要么 false |
safariInitialUrl |
(仅限SIM)(> = 8.1)初始Safari浏览器网址,默认为本地欢迎页面 |
例如 https://www.github.com |
safariAllowPopups |
(仅限Sim)允许JavaScript在Safari中打开新窗口。默认保持当前的模拟设置 |
true 要么 false |
safariIgnoreFraudWarning |
(仅限SIM)防止Safari显示欺诈网站警告。默认保持当前的模拟设置。 |
true 要么 false |
safariOpenLinksInBackground |
(仅限SIM)Safari是否应允许在新窗口中打开链接。默认保持当前的模拟设置。 |
true 要么 false |
keepKeyChains |
(Sim-only)当appium会话开始/结束时是否保留钥匙串(Library / Keychains) |
true 要么 false |
localizableStringsDir |
在哪里寻找可本地化的字符串。默认en.lproj |
en.lproj |
processArguments |
使用工具传递给AUT的参数 |
例如, -myflag |
interKeyDelay |
输入时发送到元素的击键之间的延迟,以毫秒为单位。 |
例如, 100 |
showIOSLog |
是否显示从appium日志中的设备捕获的任何日志。默认false |
true 要么 false |
sendKeyStrategy |
用于将测试类型输入测试领域的策略。模拟器默认:oneByOne。实际设备默认值:grouped |
oneByOne,grouped或者setValue |
screenshotWaitTimeout |
以秒为单位的最大超时等待生成屏幕截图。默认:10 |
例如, 5 |
waitForAppScript |
ios自动化脚本用于确定应用程序是否已启动,默认情况下系统等待页面源不为空。结果必须是布尔值 |
例如true;,target.elements().length > 0;,$.delay(5000); true; |
webviewConnectRetries |
向远程调试器发送连接消息以获取webview的次数。默认:8 |
例如, 12 |
appName |
被测应用程序的显示名称。用于在iOS 9+中自动化后台应用程序。 |
例如, UICatalog |
customSSLCert |
(仅限Sim / Emu)向模拟器添加SSL证书。 |
例如 |
webkitResponseTimeout |
(仅限实际设备)设置时间(以毫秒为单位)以等待Safari会话中WebKit的响应。默认为5000 |
例如, 10000 |
4、Capability实战
当我们知道基础的Capability 如何使用时,大家是否觉得现在我们已经就可以原原本本的照着去执行了呢?其实没错,是可以照样去执行。但是你有思考过一个问题吗?如果你的app变化了?你的package变化了?你的手机变化了?你的版本变化了等等你怎么去实现?你是不是还需要到程序里面来更改代码?low吗?要想不low我们接着往下看。
1 # coding=utf-8
2 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
3
4 # 2.注释:包括记录创建时间,创建人,项目名称。
5 '''
6 Created on 2019-7-05
7 @author: 潇潇说测试
8 Project:学习和使用appium自动化测试-与Capability完美懈垢之解读
9 '''
10 # 3.导入模块
11 from appium import webdriver
12 import time
13 import os
14
15 def testCase(platformName,platformVersion,deviceName,app,appPackage,appActivity,port):
16 PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))
17 desired_caps = {}
18 desired_caps['platformName'] = platformName #设置平台
19 desired_caps['platformVersion'] = platformVersion #系统版本
20 desired_caps['deviceName'] = deviceName #设备id
21 desired_caps['autoLaunch'] = 'true' #是否自动启动
22 desired_caps['app'] = PATH(app)#安装包路径,放在该py文件的目录下)
23 desired_caps['appPackage'] = appPackage #包名
24 desired_caps['appActivity'] = appActivity #启动的activity
25 self.driver = webdriver.Remote('http://localhost:%s/wd/hub', desired_caps) % port
从上面的代码我们可以和之前的代码进行比较,大家是否发现了一些不同之处。在做自动化时我们一定要保持数据的灵活性,所以在这里我们做了一些小小的改变,我们将所有的数据都改变成了变量,变量从何而来这个我们后面可能会讲,这个会去读取配置文件。现在从代码层面来看是否要比之前的代码更有可读性呢?其实现实中并不是这样,有更高级的版本,这个后面有时间再讲。
在代码的第11行大家注意一个问题没有,在一个字符串中间我使用了一个%s,这个在python里面代表的意思是取一个变量,这个变量是我后面跟着的 port 这个变量的值,这里唯一的有问题就是这里。
5、小结
1、想要更详细了解的小伙们,可以看一下官方文档:
官方文档:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
好了,今天就给小伙伴们分享到这里了。
【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
4. アプリ自動化プロジェクトの実戦
5. 一流メーカーの再開
6. DevOps システムのテストと開発
7. 一般的に使用される自動テストツール
8、JMeterのパフォーマンステスト
9. まとめ(最後にちょっとしたサプライズ)
寿命が長いのでオイルを追加してください。すべての努力は決して裏切られることはなく、粘り強く続ける限り、最後には必ずご褒美が得られます。自分の時間を大切にして夢を追いかけてください。初心を忘れず、前に進んでください。あなたの未来はあなたの手の中にあります!
人生は短く、時間は貴重です。将来何が起こるかを予測することはできませんが、現在の瞬間を把握することはできます。一日一日を大切にし、自分自身をより強く、より良くするために努力してください。確固たる信念、粘り強い追求、成功はやがてあなたのものになります。
常に自分自身に挑戦することによってのみ、常に自分を超えることができます。夢を追い続け、勇敢に前進すれば、その葛藤の過程がとても美しく、やりがいのあるものであることに気づくでしょう。自分を信じてください、あなたならできるよ!