在Selendroid中如何执行滑动操作?

11
  1. 我已尝试以下代码进行滑动。
  2. 运行测试用例时,滑动操作不会发生,也没有任何错误消息。
  3. 如何从左到右和从右到左两侧滑动。

有两种方法如下:

方法1(使用TouchActions):

    1. //Swipe Right to Left side of the Media Viewer First Page
                    WebElement firstPages = driver.findElement(By.id("media-list"));
                    TouchActions flick = new TouchActions(driver).flick(firstPages,-100,0,0);
                    flick.perform();

    2. //perform swipe gesture
                   TouchActions swipe = new TouchActions(driver).flick(0, -20);
                   swipe.perform();

方法2(使用JavaScript):-

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);
        }
3个回答

2
尝试以下实现,其中包括标准的 FlickAction.SPEED_NORMAL 参数以及用于 flick 的操作构建器:
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();

通过改变X轴坐标可以实现从左到右和从右到左的滑动:

  • 向左滑动:

Action flick = getBuilder(driver()).flick(toFlick, -500, 0, FlickAction.SPEED_NORMAL).build();

  • 向右滑动:

Action flick = getBuilder(driver()).flick(toFlick, 500, 0, FlickAction.SPEED_NORMAL).build();

  • 向上滑动:

Action flick = getBuilder(driver()).flick(toFlick, 0, 500, FlickAction.SPEED_NORMAL).build();

  • 向下滑动:

Action flick = getBuilder(driver()).flick(toFlick, 0, -500, FlickAction.SPEED_NORMAL).build();


这里的 getBuilder 方法是什么? - Galet
抱歉,我忘记添加 getBuilder 的代码了,请检查答案的最新版本。 - Viktor Malyi
我已经尝试了你的答案。但是它在那段代码上没有执行滑动或任何操作。 - Galet
在 flick.perform() 之前尝试添加显式等待(1 秒)。这将让您了解是否需要等待元素的出现。 - Viktor Malyi
查看了文档,公共类org.openqa.selenium.interactions.touch.FlickAction扩展自org.openqa.selenium.interactions.internal.TouchAction,并实现了org.openqa.selenium.interactions.Action接口。由于“Action”是一个接口而不是具体的类,我们该如何实例化一个“Action”实例(如上面的代码所示)?我是否漏掉了什么? - Sdr

0

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

正如其他人指出的那样,这通常是一个时间问题。因此,我发现如果我等待元素出现(即驱动程序已经返回控制并且页面已经呈现),然后在 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);
}

0

在对 JavaScript 重度网站进行功能测试时,操作完全无法正常工作的一个常见原因是在网站初始化完成之前就采取了行动。测试这种情况最简单的方法是在执行操作之前添加短暂的睡眠时间。比如说2秒钟。

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

此时,您可以重写代码以等待操作变为可能


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接