• appium点击屏幕(手势)


    在android测试过程中,会遇到要点击一下屏幕的需求。

    在appium旧版本使用下面代码点击android屏幕,没有报错。
    Map tap = new HashMap(); 
    tap.put("tapCount", new Double(2));
    tap.put("touchCount", new Double(1)); 
    tap.put("duration", new Double(0.5)); 
    tap.put("x", new Double(300)); 
    tap.put("y", new Double(300)); 
    driver.executeScript("mobile: tap", tap); 
    driver.executeAsyncScript(script, args);

    但是在升级appium 新版本后,使用这段代码,会报错误:
    org.openqa.selenium.WebDriverException: Method has not yet been implemented (WARNING: The server did not provide any stacktrace information)

    所以这个方法不能再使用了,如果用driver.tap点击屏幕,
    driver.tap(1, 100, 100, 200); 
    会有比较高几率的报错,报错误内容:An unknown server-side error occurred
    这样报错不利于自动化长期运行

    查找资料,appium使用如下这个方法点击屏幕,没有报错而且来自appium官方资料:
    TouchAction action = new TouchAction(driver);
    action.tap(100, 100).perform();

    解决了点击屏幕报错的问题

     https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/touch-actions.md

    Automating mobile gestures

    While the Selenium WebDriver spec has support for certain kinds of mobile interaction, its parameters are not always easily mappable to the functionality that the underlying device automation (like UIAutomation in the case of iOS) provides. To that end, Appium implements the new TouchAction / MultiAction API defined in the newest version of the spec (https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#multiactions-1). Note that this is different from the earlier version of the TouchAction API in the original JSON Wire Protocol.

    These APIs allow you to build up arbitrary gestures with multiple actuators. Please see the Appium client docs for your language in order to find examples of using this API.

    An Overview of the TouchAction / MultiAction API

    TouchAction

    TouchAction objects contain a chain of events.

    In all the appium client libraries, touch objects are created and are given a chain of events.

    The available events from the spec are:

    • press
    • release
    • moveTo
    • tap
    • wait
    • longPress
    • cancel
    • perform

    Here's an example of creating an action in pseudocode:

    TouchAction().press(el0).moveTo(el1).release()
    

    The above simulates a user pressing down on an element, sliding their finger to another position, and removing their finger from the screen.

    Appium performs the events in sequence. You can add a wait event to control the timing of the gesture.

    moveTo coordinates are relative to the current position. For example, dragging from 100,100 to 200,200 can be achieved by:

    .press(100,100) // Start at 100,100
    .moveTo(100,100) // Increase X & Y by 100 each, ending up at 200,200
    
    

    The appium client libraries have different ways of implementing this, for example: you can pass in coordinates or an element to a moveTo event. Passing both coordinates and an element will treat the coordinates as relative to the element's position, rather than relative to the current position.

    Calling the perform event sends the entire sequence of events to appium, and the touch gesture is run on your device.

    Appium clients also allow one to directly execute a TouchAction through the driver object, rather than calling the performevent on the TouchAction object.

    In pseudocode, both of the following are equivalent:

    TouchAction().tap(el).perform()
    
    driver.perform(TouchAction().tap(el))
    

    MultiTouch

    MultiTouch objects are collections of TouchActions.

    MultiTouch gestures only have two methods, add, and perform.

    add is used to add another TouchAction to this MultiTouch.

    When perform is called, all the TouchActions which were added to the MultiTouch are sent to appium and performed as if they happened at the same time. Appium first performs the first event of all TouchActions together, then the second, etc.

    Pseudocode example of tapping with two fingers:

    action0 = TouchAction().tap(el)
    action1 = TouchAction().tap(el)
    MultiAction().add(action0).add(action1).perform()
    

    Bugs and Workarounds

    An unfortunate bug exists in the iOS 7.0 - 8.x Simulators where ScrollViews, CollectionViews, and TableViews don't recognize gestures initiated by UIAutomation (which Appium uses under the hood for iOS). To work around this, we have provided access to a different function, scroll, which in many cases allows you to do what you wanted to do with one of these views, namely, scroll it!

    Scrolling

    To allow access to this special feature, we override the execute or executeScript methods in the driver, and prefix the command with mobile:. See examples below:

    To scroll, pass direction in which you intend to scroll as parameter.

    // javascript
    driver.execute('mobile: scroll', {direction: 'down'})
    // java
    JavascriptExecutor js = (JavascriptExecutor) driver;
    HashMap<String, String> scrollObject = new HashMap<String, String>();
    scrollObject.put("direction", "down");
    js.executeScript("mobile: scroll", scrollObject);
    # ruby
    execute_script 'mobile: scroll', direction: 'down'
    # python
    driver.execute_script("mobile: scroll", {"direction": "down"})
    // c#
    Dictionary<string, string> scrollObject = new Dictionary<string, string>();
    scrollObject.Add("direction", "down");
    ((IJavaScriptExecutor)driver).ExecuteScript("mobile: scroll", scrollObject));
    $params = array(array('direction' => 'down'));
    $driver->executeScript("mobile: scroll", $params);

    Sample to scroll using direction and element.

    // javascript
    driver.execute('mobile: scroll', {direction: 'down', element: element.value.ELEMENT});
    // 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);
    # ruby
    execute_script 'mobile: scroll', direction: 'down', element: element.ref
    # python
    driver.execute_script("mobile: scroll", {"direction": "down", element: element.getAttribute("id")})
    // c#
    Dictionary<string, string> scrollObject = new Dictionary<string, string>();
    scrollObject.Add("direction", "down");
    scrollObject.Add("element", <element_id>);
    ((IJavaScriptExecutor)driver).ExecuteScript("mobile: scroll", scrollObject));
    $params = array(array('direction' => 'down', 'element' => element.GetAttribute("id")));
    $driver->executeScript("mobile: scroll", $params);

    Automating Sliders

    iOS

    • Java
    // java
    // slider values can be string representations of numbers between 0 and 1
    // e.g., "0.1" is 10%, "1.0" is 100%
    WebElement slider =  driver.findElement(By.xpath("//window[1]/slider[1]"));
    slider.sendKeys("0.1");

    Android

    The best way to interact with the slider on Android is with TouchActions.

  • 相关阅读:
    千年不曾看懂《道德经》,直至有了《道德图》!--作者:南山空同
    初探工作流的库表设计
    教你如何快速上手markdown语法,编写技术博客(史上最全最简,用MarkDown写博客)
    面试官:你连RESTful都不知道我怎么敢要你? 文章解析
    Dapper系列 作者:懒懒的程序员一枚
    为何要编写《元灵心经》养、和、消三篇 作者 南山空同
    南山空同《学经》前24章
    ASP.NET Core 2.2 WebApi 系列【九】使用SignalR (作者:tenghao510 ) 学习及内容补充
    Net Core 中WebAPI有关 Session的设置,及获取
    asp.net core系列 WebAPI 作者:懒懒的程序员一枚
  • 原文地址:https://www.cnblogs.com/testway/p/6266432.html
Copyright © 2020-2023  润新知