## 尋找圖像元素并與之交互
使用實驗性的 `-image` 定位器策略,可以給Appium發送一個代表你想點擊的元素的圖片文件。如果Appium能找到一個與你的模板相匹配的屏幕區域,它將把這個區域的信息包裝成一個標準的 `WebElement`,并把它發回給你的Appium客戶端。
該策略將為每個Appium客戶端提供不同的方法,例如:`driver.findElementByImage()`。
### 圖像選擇器
結合任何定位器策略,你需要使用一個"選擇器"來詳細說明你的查找請求的具體性質。在 `-image` 策略的情況下,選擇器必須是一個字符串,它是一個代表你要使用的匹配模板的base64編碼的圖像文件。
### 圖像元素
如果圖片匹配成功,Appium會緩存匹配信息,并創建一個標準響應供你的客戶端使用,從而在你的測試腳本中實例化一個標準元素對象。使用這個元素對象,你可以在"圖像元素"上調用少量的方法,就像它是一個真正的`WebElement`一樣:
* `click`
* `isDisplayed`
* `getSize`
* `getLocation`
* `getLocationInView`
* `getElementRect`
* `getAttribute`
* 如果 `getMatchedImageResult` 為 `true`,`visual` 將返回匹配的圖像作為base64數據
* 從 Appium 1.18.0 開始,`score`以浮點數形式返回相似度分數,范圍為`[0.0, 1.0]`。
這些動作在"圖像元素"上是被支持的,因為它們是只涉及使用屏幕位置的動作。其他的動作(比如`sendKeys`)是不支持的,因為Appium基于你的模板圖像所能知道的就是是否有一個屏幕區域在視覺上與之匹配--Appium沒有辦法將這些信息轉化為特定于驅動程序的UI元素對象,而這對于其他動作的使用是必要的。
重要的是要記住這一點:圖像元素并沒有什么"魔力"--它們只是參考屏幕坐標,因此 "點擊 "圖像元素在內部不過是Appium在圖像元素的屏幕邊界中心點構造一個點擊(事實上你可以告訴Appium使用哪種API來執行這個點擊--見下文)。
### 相關設置
由于通過圖像尋找元素依賴于圖像分析軟件與Appium的截圖功能和你自己提供的參考圖像相結合,我們提供了一些設置,幫助你調節這個功能,在某些情況下可能會加快匹配速度或使其更準確。
要訪問這些設置,你應該使用Appium [設置API](../../advanced-concepts/settings.md)。這些是可用的設置。
|設置名稱|說明|可能值|默認值|
|------------|-----------|---------------|-------------|
|imageMatchThreshold|OpenCV的匹配閾值,低于這個閾值就認為查找失敗。基本上,可能性的范圍是在0(意味著不使用閾值)和1(意味著參考圖像必須是完全像素對像素的匹配)之間。中間的精確值沒有絕對意義。例如,一個需要大幅調整參考圖像大小的匹配會比其他情況下的匹配強度低。建議你先嘗試默認設置,如果沒有找到匹配元素,再逐步降低閾值。如果你匹配到了錯誤的元素,可以嘗試增加閾值。| 0到1之間 |0.4|
|fixImageFindScreenshotDims|Appium知道屏幕尺寸,最終這些尺寸是決定在屏幕上點擊的位置的相關尺寸。如果檢索到的屏幕截圖(通過Appium的本地方法,或外部來源)與屏幕尺寸不匹配,這個設置決定了Appium會調整屏幕截圖的尺寸來匹配,確保在正確的坐標上找到匹配的元素。如果你知道這不是必要的,請關閉這個設置,Appium會放棄檢查,可能會加快一些速度。|`true` 或 `false`|`true`|
|fixImageTemplateSize|如果一個參考圖片/模板的尺寸大于要匹配的基礎圖片,OpenCV將不允許匹配該圖片。可能發生的情況是,你發送的參考圖片的尺寸比Appium檢索的截圖大。在這種情況下,匹配會自動失敗。如果你把這個設置為 `true`,Appium會調整模板的大小,以確保它至少比截圖的尺寸小。|`true` 或 `false`|`false`|
|fixImageTemplateScale| Appium在與OpenCV匹配之前,會調整基礎圖像的大小以適應其窗口大小。如果你把這個設置設置為 `true`,Appium就會把你發送的參考圖像按同樣的比例縮放,Appium就會把基礎圖像按比例縮放以適應窗口大小。例如iOS截圖是`750×1334`像素的基礎圖片,窗口大小為`375×667`時,Appium將基礎圖像重新縮放為窗口大小,縮放比例為`0.5`。參考圖像是基于屏幕截圖尺寸,從來沒有圖像與窗口尺寸的比例。這個設置允許Appium用`0.5`來縮放參考圖像。[appium-base-driver#306](https://github.com/appium/appium-base-driver/pull/306)| `true` 或 `false` | `false` |
|defaultImageTemplateScale| Appium默認不調整模板圖片的大小(值為1.0)。雖然,存儲縮放的模板圖像可能有助于節省存儲空間的大小。例如,一個人可以用270×32像素的模板圖像來表示1080×126像素的區域(defaultImageTemplateScale的值被期望設置為4.0)。更多細節請參考[appium-base-driver#307](https://github.com/appium/appium-base-driver/pull/307)。|例如 `0.5`, `10.0`, `100`| `1.0` |
|checkForImageElementStaleness|可能發生的情況是,在你匹配了一個圖像元素和你選擇點擊它之間,這個元素已經不存在了。Appium判斷這一點的唯一方法就是在點選之前嘗試重新匹配模板。正如你所期望的那樣,如果重新匹配失敗,你會得到一個`StaleElementException`。將這個選項轉為`false`來跳過檢查,可能會加快檢查速度,但也有可能會遇到陳舊元素的問題,而沒有一個異常讓你知道你跳過了。|`true` 或 `false`|`true`|
|autoUpdateImageElementPosition|匹配的圖像在找到它和你點擊它之間可能會發生位置變化。和之前的設置一樣,如果Appium在重新匹配中確定位置改變了,它可以自動調整位置。|`true` 或 `false`|`false`|
|imageElementTapStrategy|為了點擊找到的圖片元素,Appium必須使用其中一個觸摸動作策略。可用的策略是W3C Actions API,或舊的MJSONWP TouchActions API。除非你使用的驅動因某些原因不支持W3C Actions API,否則請堅持使用默認策略。|`"w3cActions"` 或 `"touchActions"`|`"w3cActions"`|
|getMatchedImageResult| Appium不存儲匹配的圖像結果。雖然,將結果存儲在內存中可能會有助于調試是否有哪個區域被find by image匹配。Appium會將[屬性](http://appium.io../../commands/element/attributes/attribute/)API中的圖像作為`visual`返回。 | `true` 或 `false` | `false` |
請注意,每個特定語言的Appium客戶端可能會通過特殊的常量來提供這些設置,這些常量可能會與上面提到的確切設置名稱略有不同。
### 調試
`getMatchedImageResult`可能有助于調試Appium是否能如期找到所提供的圖片。如果`getMatchedImageResult`是`true`,`visual`屬性會返回base64數據。
```ruby
# Ruby core
@driver.update_settings({ getMatchedImageResult: true })
el = @driver.find_element_by_image 'path/to/img.ong'
img_el.visual # 返回base64編碼的字符串
```
```python
# Python
self.driver.update_settings({"getMatchedImageResult": True})
el = self.driver.find_element_by_image('path/to/img.ong')
el.get_attribute('visual') # 返回base64編碼的字符串
```
參考: https://github.com/appium/appium-base-driver/pull/327
- 關于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 包結構
- 鳴謝