如何将滑动更改为TouchAction()方法

时间:2019-02-07 12:59:19

标签: java appium

尝试使用滑动时出现错误,但似乎已贬值。建议使用TouchAction(),但我不确定如何将滑动转换为TouchAction()

下面是代码:

public void obj_scrollToObjectByCoOrds(int coOrds) throws IOException {
        try {

            List<WebElement> elements = driver.findElements(By.className("android.widget.FrameLayout"));
            Point point = elements.get(1).getLocation();
            Dimension size = elements.get(1).getSize();

            int elementCenterX = point.getX() + Math.round(size.getWidth() / 2);
            int elementCenterY = point.getY() + Math.round(size.getHeight() / 2);

            String originalContext = driver.getContext();
            driver.context("NATIVE_APP");

            driver.swipe(elementCenterX, elementCenterY, elementCenterX, elementCenterY + coOrds, 1500);
            driver.context(originalContext);




        } catch (Exception e) {
            e.printStackTrace();
        }

    }

下面是我很难实现的touchAction示例,因此我现在将其作为示例。我想看看转换是如何发生的,所以我将下面的代码与答案进行比较来理解:

Dimension screenSize = driver.manage().window().getSize();
new TouchAction(driver)
  .press((int) (screenSize.width * 0.6), 130)
  .waitAction(500)
  .press((int) (screenSize.width * 0.3), 130)
  .release()
  .perform();

3 个答案:

答案 0 :(得分:2)

我举了另一个例子,可以帮助您了解我正在从左向右滑动android应用,希望您能理解。.

package Android;

import io.appium.java_client.MobileDriver;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class SwipeAction {
 AndroidDriver driver;
 Dimension size;
 WebDriverWait wait;
 @BeforeTest
 public void setUp() throws Exception {
  DesiredCapabilities capabilities = new DesiredCapabilities();
  capabilities.setCapability("deviceName", "ZX1B32FFXF");
  capabilities.setCapability("browserName", "Android");
  capabilities.setCapability("platformVersion", "4.4.2");
  capabilities.setCapability("platformName", "Android");
  capabilities.setCapability("appPackage", "com.fortysevendeg.android.swipelistview");
  capabilities.setCapability("appActivity","com.fortysevendeg.android.swipelistview.sample.activities.SwipeListViewExampleActivity");
  driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),capabilities);
  driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
  wait = new WebDriverWait(driver, 300);
  wait.until(ExpectedConditions.elementToBeClickable(By.className("android.widget.RelativeLayout")));
 }


 @Test
 public void swipingHorizontal() throws InterruptedException {
  //Get the size of screen.
  size = driver.manage().window().getSize();
  System.out.println(size);

  //Find swipe x points from screen's with and height.
  //Find x1 point which is at right side of screen.
  int x1 = (int) (size.width * 0.20);
  //Find x2 point which is at left side of screen.
  int x2 = (int) (size.width * 0.80);

  //Create object of TouchAction class.
  TouchAction action = new TouchAction((MobileDriver)driver);

  //Find element to swipe from right to left.
  WebElement ele1 =  (WebElement) driver.findElementsById("com.fortysevendeg.android.swipelistview:id/front").get(3);  
  //Create swipe action chain and perform horizontal(right to left) swipe.
  //Here swipe to point x1 Is at left side of screen. So It will swipe element from right to left.
  action.longPress(ele1).moveTo(x1,580).release().perform();

  //Find element to swipe from left to right.
  WebElement ele2 =  (WebElement) driver.findElementsById("com.fortysevendeg.android.swipelistview:id/back").get(3);
  //Create swipe action chain and perform horizontal(left to right) swipe.
  //Here swipe to point x2 Is at right side of screen. So It will swipe element from left to right.
  action.longPress(ele2).moveTo(x2,580).release().perform();
 }

 @AfterTest
 public void End() {
  driver.quit();
 }
}

答案 1 :(得分:2)

您可以创建自己的自定义滑动功能,如下所示;

import io.appium.java_client.TouchAction;
import io.appium.java_client.touch.WaitOptions;
import io.appium.java_client.touch.offset.PointOption;

public static void swipe(int startX, int endX, int startY, int endY) {
        try {
            new TouchAction(driver).press(PointOption.point(startX, startY)).waitAction(WaitOptions.waitOptions(ofSeconds(1)))
                    .moveTo(PointOption.point(endX, endY)).release().perform();
        } catch (Exception e) {
            System.out.println("unable to swipe");
        }
    }
  

其中(startX,startY)代表您的起点

Dimension size = driver.manage().window().getSize();
int startX = (int) ((size.getWidth()) * 0.80);
int startY = (int) ((size.getWidth()) * 0.80);
int endX = startX; //for your case this may be same 
int endY = (int) ((size.getWidth()) * 0.20);
//now you can call swipe function
swipe(int startX, int endX, int startY, int endY);

选中此链接可了解其他appium scroll strategy

答案 2 :(得分:2)

您可以使用以下代码向左滑动:

public static void swipeLeft(AndroidDriver<?> driver)
  {
    Dimension size = driver.manage().window().getSize();
    int startx = (int)(width * 0.9D);
    int endx = (int)(width * 0.1D);
    int starty = height / 2;

    TouchAction<?> action = new TouchAction(driver);
    action.press(PointOption.point(startx, starty)).moveTo(PointOption.point(endx, starty)).release().perform();
  }

向右滑动:

 public static void swipeRight(AndroidDriver<?> driver)
  {
    Dimension size = driver.manage().window().getSize();
    int endx = (int)(width * 0.9D);
    int startx = (int)(width * 0.1D);
    int starty = height / 2;

    TouchAction<?> action = new TouchAction(driver);
    action.press(PointOption.point(startx, starty)).moveTo(PointOption.point(endx, starty)).release().perform();
  }

所用类的参考:

TouchAction

Dimensions