【问题标题】:I can't make swipe gesture work for me in Appium using Java我无法使用 Java 在 Appium 中为我制作滑动手势
【发布时间】:2015-11-29 23:32:09
【问题描述】:

我无法让滑动操作起作用。我确实在网上浏览了几天,发现了许多类似的问题,但没有有效的答案。我也尝试过 TouchAction 类,效果也不太好。

我有 Appium 版本 1.4.13 (Draco) 并使用 Java、TestNG 框架。

顺便说一句,我使用(您可以使用与拉动刷新相同的逻辑)进行滚动工作,这里是代码示例。

public void scrollUp() {
    JavascriptExecutor js = (JavascriptExecutor) getDriver();
    HashMap<String, String> scrollObject = new HashMap<String,String();
    scrollObject.put("direction", "up");
    scrollObject.put("element", listElements.get(1).getText());
    js.executeScript("mobile: scroll", scrollObject);
}

【问题讨论】:

    标签: swipe appium ios-ui-automation gestures pull-to-refresh


    【解决方案1】:

    //方法名自己解释。我希望它有效。

                public static void swipeFromRightToLeftMultipleTimes(int howManySwipes) {
                        JavascriptExecutor js = (JavascriptExecutor) iosDriver;
                        for(int counter=0; counter < howManySwipes; counter++){
                            HashMap<String, Integer> swipeObject = new HashMap<String, Integer>();
                            swipeObject.put("startX", getScreenWidth());
                            swipeObject.put("startY", getScreenHeight());
                            swipeObject.put("endX", getScreenWidth()/4);
                            swipeObject.put("endY", getScreenHeight());
                            swipeObject.put("duration", 2);
                            js.executeScript("mobile: swipe", swipeObject);
                        }
                }
    
                public static void swipeFromLeftToRightMultipleTimes(int howManySwipes) {
                        JavascriptExecutor js = (JavascriptExecutor) iosDriver;
                        for(int counter=0; counter < howManySwipes; counter++){
                            HashMap<String, Integer> swipeObject = new HashMap<String, Integer>();
                            swipeObject.put("startX", getScreenWidth()/4);
                            swipeObject.put("startY", getScreenHeight());
                            swipeObject.put("endX", getScreenWidth());
                            swipeObject.put("endY", getScreenHeight());
                            swipeObject.put("duration", 2);
                            js.executeScript("mobile: swipe", swipeObject);
                        }
                }
    

    【讨论】:

    • 感谢您的回复。仍然对我不起作用“org.openqa.selenium.WebDriverException:尚未实现。请帮助我们:appium.io/get-involved.html(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:4 毫秒”
    【解决方案2】:

    这是 iOS 还是 Android 中的滑动问题?此外,它是在真实设备还是模拟器中。我找不到适用于带有 iOS 8.x / 9.0 的 Xcode 7.0.1 的 iOS 模拟器的解决方案。请让我知道它是否适合您。

    但是,以下解决方案在 Android 真实设备以及 Android 模拟器中都能完美运行。

    当调用swipeElement 方法时,提供元素为MobileElement。像这样使用.. this.swipeElement(driver, MobileElement, 200, 3000); 如果scroll lengthpositive 则向下滚动,negative 然后向上滚动。

    public void swipeElement(AndroidDriver driver, WebElement element, int scrollLength, int duration){ 
    
    driver.context("NATIVE_APP");
    int bottomY = element.getLocation().getY()+scrollLength;
    
    ((AppiumDriver)driver).swipe(element.getLocation().getX(), element.getLocation().getY(), element.getLocation().getX(), bottomY, duration); 
    
    }
    

    【讨论】:

    • 适用于 iOS 和模拟器。
    【解决方案3】:

    此解决方案适用于带有 Appium 1.4.13 的 iOS 模拟器; Java客户端3.2.0; Xcode 7.0.1; iOS 8.x / 9.0;

    在元素发生滚动的地方提供'elementName'。

    JavascriptExecutor js = (JavascriptExecutor) iosDriv;
    HashMap<String, String> scrollObject = new HashMap<String, String>();
    scrollObject.put("element", ((RemoteWebElement) iosDriv.findElement(By.name("elementName"))).getId());
    js.executeScript("mobile: scroll", scrollObject);

    【讨论】:

    • 我不需要滚动手势,我正在尝试从页面上的元素列表中滑动单元格/行(如果更具体,它是从左到右滑动),您的答案将滚动仅关闭,但无论如何感谢您的回复!
    • 即使是滚动这个实现也会失败,因为 scrollObject.put("direction", "up");不见了。
    【解决方案4】:
    driver.context("NATIVE_APP"); 
            Dimension size = driver.manage().window().getSize(); 
            int startx = (int) (size.width * 0.8); 
            int endx = (int) (size.width * 0.20); 
            int starty = size.height / 2; 
            driver.swipe(startx, starty, endx, starty, 1000);
    

    使用上面的代码。如果您想向相反方向滑动,请将 startx 更改为 starty。

    【讨论】:

      【解决方案5】:

      driver.swipe(startingXCoordinate,StartingYCoordinate,EndXCoordinate,EndYCoordinate,timeForSwipe);

      Ex: driver.swipe(100,200,450,200,2000);
      

      在这里,您从第 100 个 X 坐标滑动到第 450 个 X 坐标。这就是 Y 坐标对于起点和终点(200 和 200)相同的原因。最后一个参数 2 表示,滑动动作会执行 2 秒。 实际上我们不得不提到2秒2000毫秒。

      【讨论】:

        猜你喜欢
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 2015-06-22
        相关资源
        最近更新 更多