appium+ios 指定頁面向左向右向上向下滑動多少:mobile:dragFromToForDuration
使用 WebDriverAgent/XCTest Backend 進行iOS自動化手勢操作
很可惜,蘋果官方的 XCTest 框架本身並不支援 TouchAction 介面實現的 W3C 標準。儘管如此,XCTest 提供了非常豐富的手勢操作,這些操作都是 iOS 平臺獨有的。你可以在 1.6.4-beta 版本的 Appium 中開始使用這些手勢操作。
需要特別注意的是目前XCTest和WDA正在不斷優化改變的階段,這意味著所有 mobile: *
的命令可能會在沒任何通知的情況下就被調整更改。
mobile: swipe
這個手勢是在指定的螢幕上的控制元件或App的控制元件上執行“滑動”操作,一般是針對整個螢幕。這個方法不支援通過座標來操作,並且僅僅是簡單的模擬單個手指滑動。這個方法對於諸如相簿分頁、切換檢視等情況可能會發揮比較大的作用。更復雜的場景可能需要用到mobile:dragFromToForDuration
支援引數
- direction: 'up', 'down', 'left' or 'right'. 這4個引數是固定的。
- element: 需要滑動的控制元件ID(作為十六進位制雜湊字串)。如果沒有提供該引數的話,則會使用App的控制元件作為替代。
用法示例
// Java JavascriptExecutor js = (JavascriptExecutor) driver; Map<String, Object> params = new HashMap<>(); scrollObject.put("direction", "down"); scrollObject.put("element", ((RemoteWebElement) element).getId()); js.executeScript("mobile: swipe", params);
mobile: scroll
滾動元素或整個螢幕。支援不同的滾動策略。該方法提供了4個可選擇滑動策略:按照順序有“name”,“direction”,“predicateString”或“toVisible”。所有的滑動策略都是排他性的,一次滑動只能選擇一個策略。你可以使用mobile:scroll
來對錶格中或者集合檢視中的某個已知控制元件進行精確的滾動操作。然而目前有一個已知的侷限問題:如果需要在父容器上執行太多的滾動手勢來達到必要的子元素(其中幾十個),則方法呼叫可能會失敗。
支援引數
- element: 需要滾動的控制元件ID(作為十六進位制雜湊字串)。如果沒有提供該引數的話,則會使用App的控制元件作為替代。
- name: 需要執行滾動的子控制元件的
accessibility id
。 將predicateString
引數設定為“name == accessibilityId”
可以實現相同的結果。如果element
不是容器,則不起作用。 - direction: 'up', 'down', 'left' or 'right'. 該引數與
swipe
中的比,差別在於scroll
會嘗試將當前介面完全移動到下一頁。(page
一詞表示單個裝置螢幕中的所有內容) - predicateString: 需要被執行滾動操作的子控制元件的NSPredicate定位器。如果控制元件不是容器,則不起作用。
- toVisible: 布林型別的引數。如果設定為
true
,則表示要求滾動到父控制元件中的第一個可見到的子控制元件。如果element
未設定,則不生效。
用法示例
# Python driver.execute_script('mobile: scroll', {'direction': 'down'});
mobile: pinch
在給定的控制元件或應用程式控制元件上執行捏合手勢。
支援引數
- element: 需要捏合的控制元件ID(作為十六進位制雜湊字串)。如果沒有提供該引數的話,則會使用App的控制元件作為替代。
- scale: 浮動型夾點尺度。使用0和1之間的比例來“捏緊”或縮小,大於1的比例“撐開”或放大。強制引數
- velocity: 每秒縮放速度(浮點值)。強制引數
用法示例
# Ruby execute_script 'mobile: pinch', scale: 0.5, velocity: 1.1, element: element.ref
mobile: doubleTap
在指定控制元件上或螢幕上執行雙擊手勢。
支援引數
- element: 需要雙擊的控制元件ID(作為十六進位制雜湊字串)。如果沒有提供該引數的話,則會使用App的控制元件作為替代。
- x: 螢幕x軸座標點,浮點型. 僅當
element
未設定時才是強制引數 - y: 螢幕y軸座標點,浮點型. 僅當
element
未設定時才是強制引數
用法示例
// javascript driver.execute('mobile: doubleTap', {element: element.value.ELEMENT});
mobile: touchAndHold
在指定控制元件上或螢幕上長按的手勢操作。
支援引數
- element: 需要長按的控制元件ID(作為十六進位制雜湊字串)。如果沒有提供該引數的話,則會使用App的控制元件作為替代。
- duration: 長按的持續時間(秒),浮點型。強制性引數
- x: 螢幕x軸座標點,浮點型. 僅當
element
未設定時才是強制引數 - y: 螢幕y軸座標點,浮點型. 僅當
element
未設定時才是強制引數
用法示例
// c# Dictionary<string, object> tfLongTap = new Dictionary<string, object>(); tfLongTap.Add("element", element.Id); tfLongTap.Add("duration", 2.0); ((IJavaScriptExecutor)driver).ExecuteScript("mobile: touchAndHold", tfLongTap);
mobile: twoFingerTap
在給定元素或應用程式元素上執行兩個手指點選手勢。
支援引數
- element: 需要兩隻手指操作的控制元件ID(作為十六進位制雜湊字串)。如果沒有提供該引數的話,則會使用App的控制元件作為替代。
用法示例
// c# Dictionary<string, object> tfTap = new Dictionary<string, object>(); tfTap.Add("element", element.Id); ((IJavaScriptExecutor)driver).ExecuteScript("mobile: twoFingerTap", tfTap);
mobile: tap
在指定控制元件或螢幕上的座標執行點選手勢。
支援引數
- element: 控制元件ID(作為十六進位制雜湊字串)。 如果設定 了
element
引數,則x
、y
代表的是以當前element
為邊界的xy軸。若未設定,則x
,y
代表的是以手機螢幕為邊界。 - x: x軸座標,型別為float。強制引數
- y: y軸座標,型別為float。強制引數
案例
// PHP $params = array(array('x' => 100.0, 'y' => 50.0, 'element' => element.GetAttribute("id"))); $driver->executeScript("mobile: tap", $params);
mobile: dragFromToForDuration
通過座標點執行拖放手勢。可以在控制元件上執行,也可以在螢幕上執行。
Supported arguments
- element: 控制元件ID(作為十六進位制雜湊字串)。 如果設定 了
element
引數,則x
、y
代表的是以當前element
為邊界的xy軸。若未設定,則x
,y
代表的是以手機螢幕為邊界。 - duration: 浮點數範圍[0.5,60]。表示開始拖動點之前的點選手勢需要多長時間才能開始拖動。強制引數
- fromX: 起始拖動點的x座標(型別float)。強制引數
- fromY: 起始拖動點的y座標(型別float)。強制引數
- toX: 結束拖曳點的x座標(float型別)。強制引數
- toY: 結束拖動點的y座標(型別float)。強制引數
用法示例
// Java JavascriptExecutor js = (JavascriptExecutor) driver; Map<String, Object> params = new HashMap<>(); params.put("duration", 1.0); params.put("fromX", 100); params.put("fromY", 100); params.put("toX", 200); params.put("toY", 200); params.put("element", ((RemoteWebElement) element).getId()); js.executeScript("mobile: dragFromToForDuration", params);
mobile: selectPickerWheelValue
選擇下一個或上一個picker wheel的值。 如果這些值是動態的,那麼這個方法是能起作用的。XCTest有一個BUG就是你並不能知道要選擇哪一個或者當前的選擇區域是否生效。
支援引數
- element: PickerWheel的內部元素id(作為十六進位制雜湊字串)執行值選擇。元素必須是XCUIElementTypePickerWheel型別。強制引數
- order:
next
選擇下一個value,previous
選擇前面一個value。強制引數 - offset: 區間值: [0.01, 0.5]。它定義了picker wheel的中心距離應該有多遠。 通過將該值乘以實際的picker wheel高度來確定實際距離。太小的偏移值可能不會改變picker wheel的值,而過高的值可能會導致picker wheel同時切換兩個或多個值。通常最優值位於範圍[0.15,0.3]中。預設為0.2
用法示例
// Java JavascriptExecutor js = (JavascriptExecutor) driver; Map<String, Object> params = new HashMap<>(); params.put("order", "next"); params.put("offset", 0.15); params.put("element", ((RemoteWebElement) element).getId()); js.executeScript("mobile: selectPickerWheelValue", params);
mobile: alert
對NSAlert例項執行操作。
支援引數
- action: 支援以下操作:
accept
,dismiss
andgetButtons
。強制引數 - buttonLabel: 點選已有警報按鈕的標籤文字。這是一個可選引數,只能與
accept
和dismiss
操作相結合才有效。
用法示例
# Python driver.execute_script('mobile: alert', {'action': 'accept', 'buttonLabel': 'My Cool Alert Button'});
進階主題
檢視 WDA Element Commands API 以獲取有關在Facebook WebDriverAgent中實現的手勢的資訊。
原文地址:https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/ios-xctest-mobile-gestures.md#使用-webdriveragentxctest-backend-進行ios自動化手勢操作