我无法使用 Java 在 Appium 中为我制作滑动手势

Posted

技术标签:

【中文标题】我无法使用 Java 在 Appium 中为我制作滑动手势【英文标题】:I can't make swipe gesture work for me in Appium using Java 【发布时间】: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);

【问题讨论】:

【参考方案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毫秒。

【讨论】:

以上是关于我无法使用 Java 在 Appium 中为我制作滑动手势的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 javascript 中为我的游戏制作图像跟随另一个图像

我们如何让 NSTimer 在 iOS 中为我​​的音频播放器在后台运行

我小时候在我的玩家类中为我的玩家制作了一个碰撞箱精灵。如何在游戏场景的 didBegin 方法中访问该碰撞箱精灵?

我无法在 Unity 中为我的预制件分配脚本

appium中webelement上长按()的问题

无法在Android Retrofit中为我的班级创建转换器