## Chromedriver
Appium 支持對基于 Chrome 內核的 H5 應用(混合應用)或者網頁(Chrome 中的網頁或者內建的瀏覽器中的網頁)進行自動化。Appium 管理維護著一個 [Chromedriver](https://sites.google.com/a/chromium.org/chromedriver/) 實例,當需要的時候,會使用代理模式將命令傳遞給這個實例。這和 [最新版本的 Chromedriver](https://chromedriver.storage.googleapis.com/LATEST_RELEASE) 是綁定的。我們可以通過 npm 包來安裝 [appium-chromedriver](https://www.npmjs.com/package/appium-chromedriver)。 (Github: [appium-chromedriver](https://github.com/appium/appium-chromedriver))。
不幸的是,隨著 Chromedriver 的每次升級,能支持的 Chrome 的最低版本都會升級。這使得舊版本的設備通常無法通過捆綁安裝的版本進行自動化。于是在 Appium 的服務端就會有這樣的錯誤日志:
```
An unknown server-side error occurred while processing the command.
Original error: unknown error: Chrome version must be >= 55.0.2883.0
```
為了解決這個問題,我們很有必要去給 Appium 提供一個合適的 Chromedriver 二進制文件去匹配 (https://raw.githubusercontent.com/appium/appium-chromedriver/master/config/mapping.json) 運行在你被測試設備上的 Chrome 引擎的版本。
通過閱讀 `Chromedriver/Chrome compatibility` 這一章節下的內容,你可以了解到更多關于 Chromedriver 可執行文件的信息。
這里有幾個方法去讓你自定義 Appium 中的 Chromedriver:
#### 安裝服務時
提供包含實際版本號的 `--chromedriver_version` 命令行參數
```
npm install appium --chromedriver_version="2.16"
```
或者在環境變量 `CHROMEDRIVER_VERSION` 中去指定 Chromedriver 的版本,
例如,
```
CHROMEDRIVER_VERSION=2.20 npm install appium
```
當然你也可以通過設置 `LATEST` 去獲取最新版本。
#### 啟動服務時
通過設定`--chromedriver-executable` 這個服務器標記,你可以在運行時指定 Chromedriver 的版本。而這個服務器的標記會根據 Chromedriver 可執行文件的絕對路徑被手動下載并放入到服務器文件系統相應目錄下。
```
appium --chromedriver-executable /path/to/my/chromedriver
```
#### 開啟一個會話時(手動發現)
通過設置 `chromedriverExecutable` 來對 Chromedriver 版本進行限制。包括已被手動下載并放入到服務器文件系統的 Chromedriver 可執行文件的絕對路徑后,你可以在會話功能中指定 Chromedriver 的版本。
你可以通過點擊 http://appium.io../../writing-running-appium/caps/ 去查看更多的詳細內容。
通過設置 `chromedriverExecutable` 限制以及匹配的 Chromedriver 可執行文件的完整路徑,你可以在會話功能中指定Chromedriver版本。而這些可執行文件必須手動下載該文件并將其放入服務器文件系統。
#### 開啟一個會話時(自動發現)
Appium 可以自動檢測出目標所需要的 Chrome 引擎的版本。當本地文件系統沒有相匹配的 Chromedriver 時,Appium 會自動下載。
你可以通過閱讀 `Automatic discovery of compatible Chromedriver` 章節下的內容去獲取更多詳細信息。
### Chromedriver/Chrome 的兼容性
你可以在 https://raw.githubusercontent.com/appium/appium-chromedriver/master/config/mapping.json 中找到 Chromedriver 版本的列表以及其能支持的 Chrome 最低版本。
自版本 *2.46* 后,Google 更改了對 Chromedriver 版本控制的規則,所以現在主要的 Chromedriver 版本對應的主版本的 web 視圖/瀏覽器可以被自動化。若想根據 [版本選擇](https://chromedriver.chromium.org/downloads/version-selection) 文檔
去查找最低版本的 Chromedriver (低于73)能支持的最低版本瀏覽器,可以通過獲取 Chrome 的源碼并查看發布提交并且檢查在此文件下 `src/chrome/test/chromedriver/chrome/version.cc` 的 `kMinimumSupportedChromeVersion` 變量。(你可以使用命令 `git log --pretty=format:'%h | %s%d' | grep -i "Release Chromedriver version"` 去找到已經發布的版本 )
可用的 Chromedriver 版本和發行說明的完整列表在 [此處](https://chromedriver.storage.googleapis.com/index.html)。
### 自動發現兼容性問題的 Chromedriver
早在1.8.0版本的Appium開始,Appium 就能夠自主選擇一個正確的 Chromedriver 版本進行測試。
雖然發布的Appium版本往往附帶最新版本的 Chromedriver,但也可以下載其他的 Chromedriver 版本并將其放置在 Appium 安裝文件中(不建議這樣做,因為升級 Appium 會將其刪除)。除此之外可以使用 desired capability 中的 `chromedriverExecutableDir` 給 Appium 指定 Chromedriver 的位置。
此功能能讓你在一個絕對路徑下擁有一個或多個 Chromedriver 可執行文件。
同樣,當一個 Appium 版本發布時,可能并不支持新版本的 Chromedriver 。在此情況下,可以通過設置 desired capability 中的 chromedriverChromeMappingFile 將 Chromedriver 驅動自定義映射到它們支持的 Chrome 最低版本。而這一設置里是包含映射的文件的絕對路徑。
該文件的內容要為一個可解析的JSON對象,如:
```JSON
{
"2.42": "63.0.3239",
"2.41": "62.0.3202"
}
```
從 Appium 1.15.0開始,可以從 Google 官方存儲中自動將必要的 chromedriver 下載到 chromedriverExecutableDir 中。腳本將會自動下載支持給定的瀏覽器/網頁視圖的最新版本的 chromedriver,在下載(對于下載的文件會通過哈希和進行驗證)的同時并且添加到 `chromedriverChromeMappingFile` 映射中。你所需要做的事情就是在啟動服務時確保 `chromedriver_autodownload` 是開啟的 (如 `appium --allow-insecure chromedriver_autodownload`)。
您還可以檢查 [安全](https://github.com/appium/appium/blob/master../../writing-running-appium/security.md) 文檔以獲得關于如何控制潛在不安全的服務器特性的詳細信息。
### 安裝遇到的網絡問題
Appium 安裝的時候需要下載 Chromedriver,所以經常會遇到網絡問題,尤其在有長城防火墻的中國。
Chromedriver 默認是從 `https://chromedriver.storage.googleapis.com/` 下載。如果要使用鏡像的話,需要配置npm的參數 `chromedriver_cdnurl`。
```bash
npm install appium-chromedriver --chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
```
或者把這個參數加到你的 [`.npmrc`](https://docs.npmjs.com/files/npmrc) 文件中去.
```bash
chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
```
也可以使用環境變量 `CHROMEDRIVER_CDNURL`.
```bash
CHROMEDRIVER_CDNURL=http://npm.taobao.org/mirrors/chromedriver npm install appium-chromedriver
```
當然最好開著代理或者使用vpn進行下載。
### W3C 支持
Chromedriver直到第75版才遵循 W3C 標準。當你遇到類似 [這樣](https://github.com/appium/python-client/issues/234) 的代理命令錯誤時,請升級你的 Chromedriver 版本。
舊的 Android 設備不能使用較新的 Chrome 驅動程序。通過使用 the Mobile JSON Wire Protocol 來避免執行測試時的錯誤。
盡管主要版本的 *75* W3C 模式可以根據傳遞的會話功能切換為 JSONWP 模式,但它仍然是 Chromedriver 的默認模式,您可以從 [下載文件](https://sites.google.com/a/chromium.org/chromedriver/downloads) 中閱讀 Chromedriver 中的關于W3C支持的歷史記錄。
本文由 [CrazyForPoor](https://github.com/CrazyForPoor) 翻譯。
- 關于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 包結構
- 鳴謝