## Settings
Settings是appium引入的一个新概念。它们目前不是 Mobile JSON Wire 协议或 Webdriver 规范的一部分。
Settings是用来指定appium server的工作方式。
Settings有以下特点:
- 可变性,Settings在一个会话中是可以被修改的。
- 临时性,Settings只对当前会话生效,新建立的会话会被重置。
- 局限性,Settings只用来控制appium server,不能用于控制被测应用或设备。
以Android的 `ignoreUnimportantViews` 为例。Android中可以设置 `ignoreUnimportantViews` 用来忽略所有与当前视图无关的元素,这样可以让用例执行的更快。注意,当用户需要访问这些被忽略的元素时,需要禁用 `ignoreUnimportantViews` 后并重新启用。
另外一个例子是Settings让appium忽略当前不可见的元素。
Settings通过下面的API实现:
### [Update Device Settings](../commands/session/settings/update-settings.md)
**POST** /session/:sessionId/appium/settings
>Settings使用键值对(name:value)的JSON格式,name为setting的名字,value是setting的取值。
```
{
settings: {
ignoreUnimportantViews : true
}
}
```
### [Retrieve Device Settings](../commands/session/settings/get-settings.md)
**GET** /session/:sessionId/appium/settings
>返回当前指定 settings 的 JSON
```
{
ignoreUnimportantViews : true
}
```
## 支持的 Settings
|名称|描述|值|
|----|----|----|
|`shouldUseCompactResponses`|查找element/elements,返回简洁(标准兼容)、快速的响应结果。默认为`true`|`false`或`true`|
|`elementResponseAttributes`|为每个元素返回逗号分隔的字段列表,仅`shouldUseCompactResponses`为`false`时生效。iOS默认值为"type,label",Android默认值为""|例如,`"name,text,rect,attribute/name,attribute/value"`|
[图像元素](https://github.com/appium/appium/blob/master../advanced-concepts/image-elements.md)也有图像元素的特定settings。
### 仅 Android 支持
|名称|描述|值|
|----|----|----|
|`ignoreUnimportantViews`|设置为false时,Android设备不会忽略任何views;被设置为true时,会使用setCompressedLayoutHeirarchy()忽略标记了IMPORTANT_FOR_ACCESSIBILITY_NO或IMPORTANT_FOR_ACCESSIBILITY_AUTO(以及被系统认为不重要的)的views,从而尽量让脚本变得简单或执行的更快。默认值为`false`|`false`或`true`|
#### UiAutomator2
|名称|描述|值|
|----|----|----|
|`actionAcknowledgmentTimeout`|与[setActionAcknowledgmentTimeout](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html#setActionAcknowledgmentTimeout(long))相同。被设置为负数时将取默认值(3*1000 毫秒)。Android API 18及以上版本,由 [UiAutomator Configurator](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html) 处理。|例如,`5000`|
|`allowInvisibleElements`|控制安卓设备是否显示所有可见或不可见的元素。默认值为false|`false`或`true`|
|`enableMultiWindows`|值为true时,page source和xpath会查找所有可访问窗口,而不仅是当前的一个窗口。可以解决查找类似`android.widget.PopupWindow`窗口上的元素,默认值为`false`,只返回当前窗口。查阅 [appium-uiautomator2-server#301](https://github.com/appium/appium-uiautomator2-server/pull/301) 获取更多信息。|`true`或`false`|
|`enableNotificationListener`|控制安卓设备是否开启或关闭`NotificationListener`,默认值为`true`。|`false`或`true`|
|`keyInjectionDelay`|与:[setKeyInjectionDelay](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html#setKeyInjectionDelay(long))相同。被设置为负数时将取默认值(0 毫秒)。Android API 18及以上版本,由 [UiAutomator Configurator](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html) 处理。|例如,`5000`|
|`mjpegBilinearFiltering`|控制是否在源截图缩放算法里应用线性过滤。开启后会提升缩放后的位图质量,但可能产生[很小]的性能影响。默认值为`false`。|`false`或`true`|
|`mjpegScalingFactor`|控制截屏流的比例因子。100代表没有进行缩放(如原图大小的100%),图尺寸越大,编译时就需要消耗更多CPU性能。Int类型,取值范围为`1`到`100`,默认值为`50`|`1`到`100`|
|`mjpegServerFramerate`|控制截屏流的帧率。帧率越高,CPU负载越大,帧率最大值受限于待测设备的性能。Int类型,取值范围为`1`到`60`。默认值为`10`|`1`到`60`|
|`mjpegServerPort`|控制 MJPEG 服务端口号。Int类型,取值范围为`1024`and`65535`,默认值为`7810`。|`1024`到`65535`|
|`mjpegServerScreenshotQuality`|控制截屏流的质量。100代表质量最佳,1代表质量最差。bitmap转为JPEG格式时,值越大,编译时越需要消耗更多CPU时间。通常设置为25到90就可以,值太大特别影响性能,还不能带来可见的质量提升。值太小也会导致结果图出现明显的扭曲。Int类型,值范围为`1`and`100`,默认值为`50`|`1`到`100`|
|`normalizeTagNames`|将作为 XML tags 的所有 class names,转化为由 Apache Harmony库支持的ASCII字符的子集。Android默认使用,以避免由于 XPath 查找导致的XML解析异常。转化基于[junidecode](https://github.com/gcardone/junidecode),需要避免 [这个问题](https://github.com/appium/appium/issues/11854),默认值为`false`。|`false`或`true`|
|`scrollAcknowledgmentTimeout`|与:[setScrollAcknowledgmentTimeout](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html#setScrollAcknowledgmentTimeout(long))相同。被设置为负数时将取默认值(200 毫秒)。Android API 18及以上版本,由 [UiAutomator Configurator](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html) 处理。|例如`300`|
|`serverPort`|控制服务端端口号,Int类型,取值范围为`1024`and`65535`,默认值为`6790`。|`1024`到`65535`|
|`shutdownOnPowerDisconnect`|监听到电源断开[ACTION_POWER_DISCONNECTED](https://developer.android.com/reference/android/content/Intent.html#ACTION_POWER_DISCONNECTED)的系统广播后关闭服务。默认值为`true`。|`false`或`true`|
|`simpleBoundsCalculation`|值为`true`时,会计算`bounds`属性,这个方法虽然不太准确,但简单还能提升性能,Appium 1.18.0 版本开始支持,默认值为`false`|`false`或`true`|
|`trackScrollEvents`|跟踪scroll事件,值为`true`时,会把`lastScrollData`字段加到`getSession`的结果里,这样就能用于监控 scroll 进度,值为`false`时会显著提升 touch 操作的性能,默认值为`true`。|`false`或`true`|
|`waitForIdleTimeout`|与:[setWaitForIdleTimeout](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html#setWaitForIdleTimeout(long))相同。被设置为负数时将取默认值(10*1000 毫秒)。Android API 18及以上版本,由 [UiAutomator Configurator](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html) 处理。|例如`10000`|
|`waitForSelectorTimeout`|与:[setWaitForSelectorTimeout](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html#setWaitForSelectorTimeout(long))相同。被设置为负数时将取默认值(10*1000 毫秒)。Android API 18及以上版本,由 [UiAutomator Configurator](https://developer.android.com/reference/android/support/test/uiautomator/Configurator.html) 处理。|例如`10000`|
|`wakeLockTimeout`|获取唤醒锁(wake lock)超时时间。服务启动时获取并持有唤醒锁(wake lock),直到 UIAutomator2 服务被杀掉或者超时。唤醒锁(wake lock)被持有时,如果设置值为0或负数,将会立即被释放。默认值为'24*60*60*1000' 毫秒。|例如`0`,`60000`(1 min)|
### 仅 iOS 支持
#### XCUITest
|名称|描述|值|Appium支持的版本|
|----|----|----|----|
|`nativeWebTap`|启用后,可以在 Safari 里点击 non-javascript-based 页面。默认值为`false`,提醒:依赖 viewport 的大小/比例,点击元素时可能不太准确。|`true`,`false`|1.7.0+|
|`mjpegServerScreenshotQuality`|截图广播生成的截图质量,取值范围`0`to`100`。值为`0`代表压缩最多(质量最差),值为`100`代表压缩最少(质量最佳)。默认值为`25`|例如,`10`|1.10.0+|
|`mjpegServerFramerate`|值为`1..60`之间时,后台截图广播,播报截图的帧率,默认值为`10`(每秒帧数)。值设置为0时,帧率会取可达到的最大值。|例如,`60`|1.10.0+|
|`screenshotQuality`|参考[xctest/xctimagequality](https://developer.apple.com/documentation/xctest/xctimagequality?language=objc)修改手机屏幕截图的质量,默认值是`1`。参阅 [appium-xcuitest-driver](https://github.com/appium/appium-xcuitest-driver#desired-capabilities)里的`screenshotQuality`capabilities|例如`0`,`1`,`2`|1.10.0+|
|`mjpegScalingFactor`|修改截屏的比例,默认值为`100`,无缩放。Int类型,取值范围为`1`and`100`。|例如`1`,`50`,`100`|1.12.0+|
|`keyboardAutocorrection`|键盘设置里修改自动校正设置,当 WDA 基于 xctest 启动时,默认值为`false`。|`true`,`false`|1.14.0+|
|`keyboardPrediction`|键盘设置里修改预测设置,当 WDA 基于 xctest 启动时,默认值为`false`。|`true`,`false`|1.14.0+|
|`snapshotTimeout`|修改获取快照(snapshots)的过期时长。_Snapshots_主要用于生成page source,查找 XML 以及检索属性。当page source非常大,包含几百个UI元素时,需要增加 snapshotTimeout 的值。默认值为15秒。|例如`10`,`100`(秒)|1.15.0+|
|`snapshotMaxDepth`|修改遍历元素source tree的最大深度值,这个设置在获取元素source tree时有助于防止内存不足或超时,但同时也限制了source tree的深度。当在Appium log里看到这样的报错,如 _Timed out snapshotting com.apple.testmanagerd..._ message 或 _Cannot get 'xml' source of the current application_,需要考虑限制 snapshotMaxDepth 的值,因为这类问题很可能和超时有关。如果 snapshotMaxDepth 值特别小,可能会丢失元素 source tree 的部分内容。默认值为`50`|例如`100`|1.17.0+|
|`useFirstMatch`|开启这个设置后,查找单个元素速度会变快,但查找嵌套元素时会有[问题](https://github.com/appium/appium/issues/10101)。默认值是`false`|`true`,`false`|1.15.0+|
|`reduceMotion`|在辅助功能里修改减弱动态效果(motion)。|`true`,`false`|1.15.0+|
|`defaultActiveApplication`|设置当前可选程序。有助于 WebDriverAgent 从多项可选程序列表里,选择当前程序。这个设置在分屏APP自动化上很有用,默认值为`auto`,这样 WebDriverAgent 可以选择元素位于`screenPoint`的 应用,或者从当前 apps 列表里(并且列表里只有一个app)选择其中一个应用。|例如,`com.apple.Preferences`|1.15.0+|
|`activeAppDetectionPoint`|设置当前屏幕上的坐标点,如当前屏幕上有多个应用,WebDriverAgent 可以使用坐标点检测当前应用。值的格式是`x,y`,只有 x 和 y 值为float类型或者Int类型时,才是有效屏幕坐标。设置超出屏幕坐标的的值,可能会导致 WebDriverAgent 报错。默认的屏幕坐标值,分别为最小屏幕尺寸的20%,即`MIN(w,h) * 0.2,MIN(w,h) * 0.2`|例如`100,300`|1.15.0+|
|`includeNonModalElements`|iOS 13+ 设备上,是否返回所有带对话框的元素。这个设置解决了这个问题[cannot find elements on nested modal presentations](https://github.com/appium/appium/issues/13227),但也会导致可见属性不可靠。为了提升元素可见监测,还要开启`shouldUseTestManagerForVisibilityDetection`设置(默认值是`false`)或`simpleIsVisibleCheck`capability。这个问题会在 iOS 13.0到13.2(以及 Xcode 11.0到11.2)上出现。这个查询会导致以下问题,在更新的 iOS/Xcode 版本上,includeNonModalElements 返回 nil,以及 Appium/WDA 在未使用此设置时,会返回3个相同的元素。默认值为`false`|`true`,`false`|1.15.0+|
|`acceptAlertButtonSelector`|允许自定义 accept 警告按钮 selector。这样就能处理任意元素,就像在`accept alert`命令里处理 accept 按钮那样。selector 必须是个有效的[class chain](https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules) 表达式,查询路径必须是 alert 元素自身。如果给定的 selector 错误或者无法匹配任何元素,默认会使用按钮定位算法。|例如,<code>**/XCUIElementTypeButton[\`label CONTAINS[c] 'accept'\`]</code>|1.16.0+|
|`dismissAlertButtonSelector`|允许自定义 dismiss 警告按钮 selector。这样就能处理任意元素,就像在`dismiss alert`命令里处理 dismiss 按钮那样。selector 必须是个有效的[class chain](https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules) 表达式,查询路径必须是 alert 元素自身。如果给定的 selector 错误或者无法匹配任何元素,默认会使用按钮定位算法。|例如,<code>**/XCUIElementTypeButton[\`label CONTAINS[c] 'dismiss'\`]</code>|1.16.0+|
|`screenshotOrientation`|在 iOS 上调整截屏方向,Appium 尝试返回截图,同时使用内部方法调整截图方向,但有时候并不生效(尤其是横屏时)。实际截屏方向受多个因素影响,如 OS 版本,model 版本,以及当前设备是真机还是模拟器。这个设置允许强制设置图片方向,默认值是`auto`|`auto`,`portrait`,`portraitUpsideDown`,`landscapeRight`,`landscapeLeft`|1.17.0+|
本文由 [nicole1010](https://github.com/nicole1010) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
- 关于TesterHome和MTSC
- 关于Appium
- 简介
- Appium 客户端
- 入门指南
- 已支持的平台
- API 文档
- Appium驱动
- XCUITest (iOS)
- XCUITest Real Devices (iOS)
- UIAutomation (iOS)
- UIAutomation Safari Launcher (iOS)
- UIAutomator (Android)
- UIAutomator2 (Android)
- Espresso (Android)
- Windows
- Mac
- Appium命令
- Status
- Execute Mobile Command
- Session
- Create
- End
- Get Session Capabilities
- Go Back
- Screenshot
- Source
- Timeouts
- Timeouts
- Implicit Wait
- Async Script
- Orientation
- Get Orientation
- Set Orientation
- Geolocation
- Get Geolocation
- Set Geolocation
- Logs
- Get Log Types
- Get Logs
- Events
- Log event
- Get events
- Settings
- Update Settings
- Get Device Settings
- Settings
- Update Settings
- Get Device Settings
- Execute Driver Script
- Device
- Activity
- Start Activity
- Current Activity
- Current Package
- App
- Install App
- Is App Installed
- Launch App
- Background App
- Close App
- Reset App
- Remove App
- Activate App
- Terminate App
- Get App State
- Get App Strings
- End Test Coverage
- Clipboard
- Get Clipboard
- Set Clipboard
- Emulator
- Power AC
- Power Capacity
- Files
- Push File
- Pull File
- Pull Folder
- Interactions
- Shake
- Lock
- Unlock
- Is Locked
- Rotate
- Keys
- Press keycode
- Long press keycode
- Hide Keyboard
- Is Keyboard Shown
- Network
- Toggle Airplane Mode
- Toggle Data
- Toggle WiFi
- Toggle Location Services
- Send SMS
- GSM Call
- GSM Signal
- GSM Voice
- Network Speed
- Performance Data
- Get Performance Data
- Performance Data Types
- Screen Recording
- Start Screen Recording
- Stop Screen Recording
- Simulator
- Perform Touch ID
- Toggle Touch ID Enrollment
- System
- Open Notifications
- System Bars
- System Time
- Display density
- Authentication
- Finger Print
- Element
- Find Element
- Find Elements
- Actions
- Click
- Send Keys
- Clear
- Attributes
- Text
- Name
- Attribute
- Selected
- Enabled
- Displayed
- Location
- Size
- Rect
- CSS Property
- Location in View
- Other
- Submit
- Active Element
- Equals Element
- Context
- Get Context
- Get All Contexts
- Set Context
- Interactions
- Mouse
- Move To
- Click
- Double Click
- Button Down
- Button Up
- Touch
- Single Tap
- Double Tap
- Move
- Touch Down
- Touch Up
- Long Press
- Scroll
- Flick
- Multi Touch Perform
- Touch Perform
- W3C Actions
- Web
- Window
- Set Window
- Close Window
- Get Handle
- Get Handles
- Get Title
- Get Window Size
- Set Window Size
- Get Window Position
- Set Window Position
- Maximize Window
- Navigation
- Go to URL
- Get URL
- Back
- Forward
- Refresh
- Storage
- Get All Cookies
- Set Cookie
- Delete Cookie
- Delete All Cookies
- Frame
- Switch to Frame
- Switch to Parent Frame
- Execute Async
- Execute
- 编写 & 运行Appium脚本
- Running Tests
- Desired Capabilities
- The --default-capabilities flag
- Finding Elements
- Touch Actions
- CLI Arguments
- Server Security
- Web/Web Views
- Mobile Web Testing
- Automating Hybrid Apps
- Using ios-webkit-debug-proxy
- Using Chromedriver
- Image Comparison
- iOS
- Low-Level Insights on iOS Input Events
- XCUITest Mobile Gestures
- XCUITest Mobile App Management
- iOS Pasteboard Guide
- iOS Predicate Guide
- iOS Touch ID Guide
- iOS Install Certificate
- tvOS support
- Pushing/Pulling files
- Audio Capture
- Android
- Low-Level Insights on Android Input Events
- UiSelector Guide
- Espresso Datamatcher Guide
- Android Code Coverage Guide
- Activities Startup Troubleshooting Guide
- How To Execute Shell Commands On The Remote Device
- Android Device Screen Streaming
- How To Emulate IME Actions Generation
- How To Test Android App Bundle
- Other
- Reset Strategies
- Network Connection Guide
- Using Unicode with Appium
- Troubleshooting
- Tutorial
- Swipe Tutorial
- Screen
- Element
- Partial screen
- Simple
- Multiple scroll views
- Add scroll layout
- Tricks and Tips
- Screen
- Element
- Element search
- Fast
- Slow
- Guide
- 进阶概念
- 定位图像中的元素
- 使用定位元素的插件
- 迁移到 XCUITest
- 在 Appium 中使用 Selenium Grid
- Appium Logs Filtering
- 跨域 iframes
- 使用自定义 WDA 服务器
- 使用不同版本的 Xcode 运行
- The Event Timings API
- 并行测试的设置
- The Settings API
- Memory Collection
- 向Appium项目做贡献
- 从源代码运行 Appium
- 开发者概述
- 标准开发命令
- Appium 风格指南
- 如何编写文档
- Appium 包结构
- 鸣谢