# 執行Driver腳本
針對當前會話(session)運行WebdriverIO腳本,允許在一個Appium請求中執行多條命令。
## 使用樣例
```java
// Java
String script = "const el = await driver.$('~foo');\n"
+ "await el.click();"
driver.executeDriverScript(script, new ScriptOptions().withTimeout(200));
```
```python
# Python
# TODO fill out once client code is written
```
```javascript
// Javascript
// webdriver.io example
const script = `
const el = await driver.$('~foo');
await el.click();
`;
await driver.executeDriver(script);
// wd example
const script = `
const el = await driver.$('~foo');
await el.click();
`;
await driver.executeDriver(script, {timeout: 200});
```
```ruby
# Ruby
# ruby_lib example
# TODO fill out once client code is written
# ruby_lib_core example
# TODO fill out once client code is written
```
```php
# PHP
// TODO PHP sample
```
```csharp
// C#
// TODO C# sample
```
## 描述
Appium的客戶機-服務器體系(C/S)結構的一個缺點是每個命令都必須在網絡上傳輸,可能會有很高的延遲。尤其是Appium會話發生在服務提供商的主機上而不是在本地進行的情況下。
這個命令允許將多個命令組成批處理形式,以便在Appium服務器上一次性執行。實現這一點的方法是基于`executeScript`模型:客戶端將發送一個表示要執行的代碼的字符串。Appium服務器將在當前會話(session)的上下文中執行該代碼,并返回腳本指定的任何值。
這個命令接收三個參數(每個客戶端可能以其自己的方式收集):
* `script`:由腳本本身組成的字符串
* `timeout`:表示在終止運行程序腳本的進程之前要等待的毫秒數。默認值等于1小時。
* `type`:表示腳本所使用的語言或API的類型的字符串。現在只支持一種類型,`webdriveio`。
Not just any code can run in this context. The code must be written in Javascript, and it will have access to a context with three objects
并不是任意代碼都能在這個環境中運行。代碼必須用JavaScript編寫,并可以訪問有以下三個對象的環境。
* `driver`:[WebdriverIO](https://webdriver.io/) driver對象。可以假設這個driver已經與Appium server建立連接并已經可以執行命令。安裝使用的WebdriverIO版本是根據 `appium-base-driver`的 `package.json`中指定的版本。
* `console`: 一個有`log`, `warn`和 `error`方法的定制`console`對象,可以進行日志記錄。
* `Promise`: 一個Promise庫 ([Bluebird](http://bluebirdjs.com/docs/getting-started.html)), 用來簡化異步操作。
代碼會下面的例子所示,放在一個`async`函數中,所以你可以隨意使用`await`:
```js
(async function (driver, console, Promise) {
// --> your script here <--
})()
```
任何錯誤都會導致給命令的調用方一個錯誤類型的響應。任何返回值都會被按照下面的形式進行包裝并返回給客戶端:
```js
{result: <return value>, logs: {log: [], warn: [], error: []}}
```
使用響應對象,你可以同時獲得返回值以及你編寫的所有日志語句。
The advantage of this approach of using WebdriverIO code is that you have access to a full programming language and Appium API, and can use any language or API features you need, including loops, conditionals, and explicit waits. The WebdriverIO API cannot be enumerated here, so visit the [WebdriverIO documentation](https://webdriver.io/docs/api.html) for more info.
這樣使用WebdriverIO代碼的方法的優勢在于,你可以使用完整的編程語言和Appium API,并且可以使用任何你需要的語言或API特性,包括循環、條件語句和顯式等待。無法在這里列舉webdririo API,因此請訪問[WebdriverIO 文檔](https://webdriver.io/docs/api.html)以獲取更多信息。
## 支持
### Appium Server
| 平臺 | Driver | 平臺版本 | Appium版本 | Driver版本 |
|--------|----------------|------|--------------|--------------|
| iOS | [XCUITest](../../drivers/ios-xcuitest.md) | 9.3+ | 1.6.0+ | All |
| | [UIAutomation](../../drivers/ios-uiautomation.md) | 8.0 to 9.3 | All | All |
| Android | [UiAutomator2](../../drivers/android-uiautomator2.md) | ?+ | 1.6.0+ | All |
| | [Espresso](../../drivers/android-espresso.md) | ?+ | 1.9.0+ | All |
| | [UiAutomator](../../drivers/android-uiautomator.md) | 4.3+ | All | All |
| Mac | [Mac](../../drivers/mac.md) | ?+ | 1.6.4+ | All |
| Windows | [Windows](../../drivers/windows.md) | 10+ | 1.6.0+ | All |
### Appium客戶端
| 語言 | 支持版本 | 文檔 |
|--------|-------|-------------|
|[Java](https://github.com/appium/java-client/releases/latest)| All | [javadoc.io](https://javadoc.io/page/io.appium/java-client/latest/io/appium/java_client/ExecutesDriverScript.html#executeDriverScript-java.lang.String-io.appium.java_client.driverscripts.ScriptOptions-) |
|[Python](https://github.com/appium/python-client/releases/latest)| None | |
|[Javascript (WebdriverIO)](http://webdriver.io/index.html)| None | |
|[Javascript (WD)](https://github.com/admc/wd/releases/latest)| None | |
|[Ruby](https://github.com/appium/ruby_lib/releases/latest)| None | |
|[PHP](https://github.com/appium/php-client/releases/latest)| None | |
|[C#](https://github.com/appium/appium-dotnet-driver/releases/latest)| None | |
## HTTP API規范
### 終端
`POST /session/:session_id/appium/execute_driver`
### URL參數
| 名稱 | 描述 |
|----|-----------|
|session_id|將指令發往的會話(session)的ID|
### JSON參數
| 名稱 | 類型 | 描述 |
|----|----|-----------|
| script | `string` | 需要執行的webdriverio腳本 |
| type | `string` | 腳本類型名稱。現在只支持 'webdriverio' |
| timeout | `number` | Appium應該等待腳本執行完成的毫秒值。超過這個時間,Appium會由于超時而終止腳本的執行。 |
### 響應
腳本的執行結果。結果包含兩部分:`result` and `logs`。result是腳本執行后的返回值。logs包含腳本輸出在控制臺中的所有內容。 (`any`)
## 參考
無
本文由 [KangarooChen](https://github.com/KangarooChen) 翻譯,Last english version: 1be5bd8c1e22fe46188dd9c498766ae587c88887, 4 Mar 2020
- 關于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 包結構
- 鳴謝