移動手勢的自動化

來源:互聯網
上載者:User

標籤:

## 移動手勢的自動化

雖然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) 。

移動手勢的自動化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.