我无法使用 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 length
是positive
则向下滚动,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 中为我的音频播放器在后台运行