问答 [已解决] Appium+Android 真机 +Java 脚本: 如何实现坐标点的点击、拖拽?以及对控件的拖拽?

JerryWang · 2017年08月24日 · 最后由 JerryWang 回复于 2017年09月01日 · 3265 次阅读

现在使用 appium 做 android 的自动化测试, 连接的是 android 真机, driver 使用的是 WebDriver. 发现 WebDriver 本身自带的方法非常有限.不像 AndroidDriver 有现成的 swipe(startx, starty, endx, endy, duration);和 tap(fingers, x, y, duration);方法.
我想请教各位以下问题:

  1. 如何实现对坐标点的单击, 双击, 长按, 拖拽操作?
  2. 当前页面没有显示的控件, 如何实现拖拽去找到指定的控件?
    我下面贴一下我的代码:

    package appium;
    import java.net.URL;
    import java.util.concurrent.TimeUnit;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.remote.DesiredCapabilities;
    import org.openqa.selenium.remote.RemoteWebDriver;
    import org.testng.Assert;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Test;
    public class sdk_COOLPAD {
    private WebDriver driver;
    SDK sdk = new SDK("COOLPAD");
    @BeforeMethod(alwaysRun = true)
    public void setUp() throws Exception {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("deviceName", "vivo x5l");
        capabilities.setCapability("udid", "BMBY8LU4YTMBS8SO");
        capabilities.setCapability("app", sdk.getApk());
        capabilities.setCapability("appPackage", sdk.getPkg());
        capabilities.setCapability("appActivity", sdk.getActivity());
        capabilities.setCapability("unicodeKeyboard", true);
        capabilities.setCapability("resetKeyboard", true);
        driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    }
    
    @AfterMethod(alwaysRun = true)
    public void tearDown() throws Exception {
        driver.quit();
    }
    
    @Test(groups = { "testCOOLPAD" })
    public void testCOOLPAD() throws InterruptedException {
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.findElement(By.xpath("//android.widget.Button[contains(@text,'初始化SDK')]")).click();
        Assert.assertTrue(((WebElement) driver.findElement(
                By.xpath("//android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.TextView[2]")))
                        .getText().contains("初始化成功"));
        driver.findElement(By.xpath("//android.widget.Button[contains(@text,'清空')]")).click();
        driver.findElement(By.xpath("//android.widget.Button[contains(@text,'获取网关')]")).click();
        Assert.assertTrue(((WebElement) driver.findElement(
                By.xpath("//android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.TextView[1]")))
                        .getText().contains("获取网关成功"));
        driver.findElement(By.xpath("//android.widget.Button[contains(@text,'清空')]")).click();
        driver.findElement(By.xpath("//android.widget.Button[contains(@text,'登录(第一步)')]")).click();
        driver.findElement(By.xpath("//android.widget.EditText[contains(@text,'请输入手机号/邮箱')]"))
                .sendKeys(sdk.getAccount());
        driver.findElement(By
                .xpath("//android.widget.ScrollView/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.RelativeLayout[2]/android.widget.EditText"))
                .sendKeys(sdk.getPwd());
       //此时, 当前页面并没有显示登录按钮, 需要对屏幕进行上拉操作才能找到并点击登录按钮
        driver.findElement(By.xpath("//android.widget.TextView[contains(@text,'登   录')]")).click();
    }
    }
    

    我使用的 library 截图:

共收到 2 条回复 时间 点赞

另外, 我想确认一件事情, 是不是使用 appium 做 android 真机测试, 只能用 webDriver 呢? 我在网上看到好多例子是 appium 做 android 虚拟机测试时才使用 appiumDriver 或者 androidDriver 的.....好困扰啊!

此问题已经得到解决. 可以看我之前遇到的另一个问题, https://testerhome.com/topics/9782

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册