Java 如何在Selendroid中执行刷卡操作? 我试过使用以下代码进行刷卡 在运行测试用例时,滑动操作不会发生,我也不会收到任何错误消息 如何从左向右两侧滑动,反之亦然

Java 如何在Selendroid中执行刷卡操作? 我试过使用以下代码进行刷卡 在运行测试用例时,滑动操作不会发生,我也不会收到任何错误消息 如何从左向右两侧滑动,反之亦然,java,touch,swipe,selendroid,Java,Touch,Swipe,Selendroid,有以下两种方法:- 方法1(使用触摸动作):- 方法2(使用javascript):- 公共静态无效滑动(WebDriver){ JavascriptExecutor js=(JavascriptExecutor)驱动程序; HashMap swipeObject=new java.util.HashMap(); swipeObject.put(“startX”,0.95); swipeObject.put(“startY”,0.5); swipeObject.put(“endX”,0.05);

有以下两种方法:-

方法1(使用触摸动作):-

方法2(使用javascript):-

公共静态无效滑动(WebDriver){
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
HashMap swipeObject=new java.util.HashMap();
swipeObject.put(“startX”,0.95);
swipeObject.put(“startY”,0.5);
swipeObject.put(“endX”,0.05);
swipeObject.put(“endY”,0.5);
swipeObject.put(“持续时间”,1.8);
js.executeScript(“移动:滑动”,swipeObject);
}

在功能测试大量使用JavaScript的网站时,操作完全失败的一个常见原因是,这些操作是在网站完成初始化之前执行的。测试这种情况的最简单方法是在执行操作之前添加一个短暂的睡眠。说2秒钟

如果这解决了问题,那么您就知道页面初始化和测试代码运行之间存在竞争条件


在那一点上你可以

尝试以下包含标准FlickAction.SPEED\u普通参数和flick的动作生成器的实现:

可通过改变X坐标从左向右滑动,反之亦然:

  • 向左滑动:
动作flick=getBuilder(driver()).flick(toFlick,-500,,0, FlickAction.SPEED_NORMAL).build()

  • 向右滑动:
Action flick=getBuilder(driver()).flick(toFlick,500,0,FlickAction.SPEED\u NORMAL).build()

  • 滑动到顶部:
Action flick=getBuilder(driver()).flick(toFlick,0,500,FlickAction.SPEED\u NORMAL).build()

  • 滑到底部:

动作flick=getBuilder(driver()).flick(toFlick,0,-500,,FlickAction.SPEED\u NORMAL).build()

我知道这是一个老问题,但我遇到了许多类似的问题

正如其他人所指出的,这通常是一个时机问题。因此我发现,如果我等待一个元素出现(即驱动程序返回控件,页面呈现),然后在flick操作前后都进行短暂睡眠,那么它肯定会工作,在我测试过的每个页面/应用程序上都会工作。所以我们的代码看起来有点像这样:

WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("some-element-id)));
flickIt(driver, element -100, 0);

private void flickIt(WebDriver driver, WebElement el, int x, int y) {
    SyntheticsUtility.sleep(500); // put 0.5s sleeps around it to make sure, need to be stable
    TouchActions touch = new TouchActions(driver);
    touch.flick(el, x, y, FlickAction.SPEED_NORMAL);
    touch.perform();
    SyntheticsUtility.sleep(500);
}

这里的getBuilder方法是什么?对不起,我忘记为getBuilder添加代码了。检查最新版本的答案我已经试过你的答案了。但它没有对特定代码执行滑动或任何操作。请尝试在flick.perform()之前添加显式等待(1秒)。它将告诉您是否必须等待元素的出现。查看文档,公共类org.openqa.selenium.interactions.touch.FlickAction扩展了org.openqa.selenium.interactions.internal.TouchAction实现了org.openqa.selenium.interactions.Action。我们如何将“Action”实例(如上面代码中所描述的)实例化为接口,而不是具体的类。我是不是遗漏了什么。
public static void swipe(WebDriver driver) {

            JavascriptExecutor js = (JavascriptExecutor) driver;
            HashMap<String, Double> swipeObject = new java.util.HashMap<String, Double>();
            swipeObject.put("startX", 0.95);
            swipeObject.put("startY", 0.5);
            swipeObject.put("endX", 0.05);
            swipeObject.put("endY", 0.5);
            swipeObject.put("duration", 1.8);
            js.executeScript("mobile: swipe", swipeObject);
        }
import org.openqa.selenium.interactions.touch.FlickAction;

private Action getBuilder(WebDriver driver) {
    return new Action(driver);
}

WebElement toFlick = driver().findElement(By.id("media-list"));
    Action flick = getBuilder(driver()).flick(toFlick, -500, 0, FlickAction.SPEED_NORMAL).build();
    flick.perform();
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("some-element-id)));
flickIt(driver, element -100, 0);

private void flickIt(WebDriver driver, WebElement el, int x, int y) {
    SyntheticsUtility.sleep(500); // put 0.5s sleeps around it to make sure, need to be stable
    TouchActions touch = new TouchActions(driver);
    touch.flick(el, x, y, FlickAction.SPEED_NORMAL);
    touch.perform();
    SyntheticsUtility.sleep(500);
}