標籤:
## 移動手勢的自動化
雖然Selenium WebDriver的規範支援數種手機互動的方式,但它的參數並不能簡單地映射到底層裝置使用的自動化函數 (像在iOS上的UIAutomation) 。為此,Appium在規範的最新版本中定義了新的觸摸操作/多點觸控 API
([https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#multiactions-1](https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#multiactions-1))。
注意,這跟在早期版本中使用原始JSON Wire Protocol 的觸摸操作 API不同。
這些API可以讓你使用多個驅動來建立任意手勢。請參閱對應語言的Appium用戶端文檔,就可以找到使用這些API的例子。
### 觸摸操作/多點觸控 API的概述
### 觸摸操作 (TouchAction)
*TouchAction* 對象包含一連串的事件。
在所有的appium用戶端庫中,觸摸對象建立並給出一連串的事件。
規範中的可用事件有:
* 短按 (press)
* 釋放 (release)
* 移動到 (moveTo)
* 點擊 (tap)
* 等待 (wait)
* 長按 (longPress)
* 取消 (cancel)
* 執行 (perform)
這裡有一個通過虛擬碼建立動作的例子:
```center
TouchAction().press(el0).moveTo(el1).release()
```
上述類比使用者按下一個元素,滑動他的手指到另一個位置,然後從螢幕上釋放其手指。
Appium按順序執行這些事件。你可以添加一個 `wait` 事件來控制相應手勢的時間。
appium用戶端庫有不同的方式來實現上述例子,比如:你可以傳遞一個座標值或一個元素給 `moveTo` 事件。同時傳遞座標和元素,會將座標和元素對應起來,但這不是絕對的。
調用 `perform` 事件發送整個事件序列給appium,從而使觸摸手勢在裝置上運行。
Appium用戶端還允許人們直接通過驅動程式對象執行觸摸操作, 而不是調用觸摸操作對象的`perform`事件。
在虛擬碼中,以下兩個是等價的:
```center
TouchAction().tap(el).perform()
driver.perform(TouchAction().tap(el))
```
### 多點觸控 (MultiTouch)
*MultiTouch* 對象是觸摸操作的集合。
多點觸控手勢只有兩個方法,添加 (`add`) 和執行 (`perform`) 。
`add` 用於將不同的觸摸操作添加到一個多點觸控中。
當 `perform` 被調用的時候,所有被添加到多點觸摸中的觸摸事件會被發送到appium並且被執行,就像它們同時發生一樣。Appium會執行“觸摸事件”中的第一個事件,然後第二個,以此類推。
用兩隻手指點擊的程式碼範例:
```center
action0 = TouchAction().tap(el)
action1 = TouchAction().tap(el)
MultiAction().add(action0).add(action1).perform()
```
### 缺陷和解決方案
不幸的是有一個缺陷存在於iOS的7.x的模擬器上,ScrollViews無法識別由UIAutomation建立的手勢 (在iOS上Appium使用的是UIAutomation) 。 為了實現此功能,我們已經提供了新的函數, `scroll`, 在大部分情況下可以讓你實現跟ScrollView一樣的功能!
**滾動**
要使用這特殊的功能,我們重寫了driver中的 `execute` 和
`executeScript` 方法。 可以通過在命令前加 `mobile: ` 的首碼來使用滾動。
請參見下面的例子:
* **WD.js:**
```javascript
// javascript
// 把視圖往下滑動
driver.execute("mobile: scroll", [{direction: ‘down‘}])
// 繼續測試
```
* **Java:**
```java
// java
JavascriptExecutor js = (JavascriptExecutor) driver;
HashMap<String, String> scrollObject = new HashMap<String, String>();
scrollObject.put("direction", "down");
scrollObject.put("element", ((RemoteWebElement) element).getId());
js.executeScript("mobile: scroll", scrollObject);
```
**滑塊的自動化**
**iOS**
* **Java**
```java
// java
// 滑動值使用0到1之間的數字以字串的形式表示
// 例如,“0.1”代表10%,“1.0”代表100%
WebElement slider = driver.findElement(By.xpath("//window[1]/slider[1]"));
slider.sendKeys("0.1");
```
**Android**
與Android上的滑塊進行互動的最佳方式是用觸摸操作 (TouchActions) 。
移動手勢的自動化