Appium+python 自動化 (14) - Capability と Capability の解釈 (超詳細解説)

序章

  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证书。

例如 
-----BEGIN CERTIFICATE-----MIIFWjCCBEKg...
-----END CERTIFICATE-----

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. まとめ(最後にちょっとしたサプライズ)

寿命が長いのでオイルを追加してください。すべての努力は決し​​て裏切られることはなく、粘り強く続ける限り、最後には必ずご褒美が得られます。自分の時間を大切にして夢を追いかけてください。初心を忘れず、前に進んでください。あなたの未来はあなたの手の中にあります!

人生は短く、時間は貴重です。将来何が起こるかを予測することはできませんが、現在の瞬間を把握することはできます。一日一日を大切にし、自分自身をより強く、より良くするために努力してください。確固たる信念、粘り強い追求、成功はやがてあなたのものになります。

常に自分自身に挑戦することによってのみ、常に自分を超えることができます。夢を追い続け、勇敢に前進すれば、その葛藤の過程がとても美しく、やりがいのあるものであることに気づくでしょう。自分を信じてください、あなたならできるよ!

おすすめ

転載: blog.csdn.net/NHB456789/article/details/131808377