appium 滑动

来源:互联网 发布:单片机流水灯原理图 编辑:程序博客网 时间:2024/06/04 18:23

前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:http://www.cnblogs.com/tobecrazy/p/4562199.html

                    知乎Android客户端登陆:http://www.cnblogs.com/tobecrazy/p/4579631.html

                                                  appium实现截图和清空EditText:http://www.cnblogs.com/tobecrazy/p/4592405.html

 

       

Appium 处理滑动 

appium 处理滑动的方法是 swipe(int start-x, int start-y, int end-x, int end-y, int during) - Method in class io.appium.java_client.AppiumDriver
此方法共有5个参数,都是整形,依次是起始位置的x y坐标和终点位子的x y坐标和滑动间隔时间,单位毫秒
坐标是指:屏幕左上角为坐标系原点(0,0),屏幕分辨率为终点坐标,比如你手机分辨率1080*1920,那么该手机坐标系的终点是(1080*1920)
,每个元素都在坐标系中,可以用坐标系定位元素。
          
比如这个登陆按钮在坐标系中的位置是起始点 + 终点(32,1040) (351,1152)

向上滑动

向上滑动,就是从下到上,那么怎么进行从下到上的滑动呢?
按照之前理解的坐标系,从上到下滑动,一般是垂直滑动,也就是X轴不变,Y轴从大变小的过程
我们可以采取Y轴固定在屏幕正当中,Y轴滑动屏幕的1/2,Y轴的起始位置为屏幕的3/4,滑动终点为Y轴的1/4(尽量避免使用坐标系的起点和终点),滑动时间为1s,如果滑动时间过短,将会出现一次滑动多页。
需要提醒的是,很多app运行的时候并不是全屏,还有系统自带工具栏和边框,一定要避免!!!
  
复制代码
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);                // find keyword 首页 and verify it is display        Assert.assertTrue(driver.findElement(By.name("首页")).isDisplayed());        snapshot((TakesScreenshot) driver, "zhihu_before_swipe.png");        int width=driver.manage().window().getSize().width;        int height=driver.manage().window().getSize().height;          driver.swipe(width/2,height*3/4, width/2,height/4, 1000);        //wait for page loading                snapshot((TakesScreenshot) driver, "zhihu_after_swipe.png");
复制代码

 

 可以看出 ,为了让apppium 更好的兼容不同分辨率的设备,在执行滑动前先获取屏幕的分辨率
接下来就可以封装四个滑动的方法:
复制代码
/**     * This Method for swipe up     *      * @author Young     * @param driver     * @param during     */    public void swipeToUp(AndroidDriver driver, int during) {        int width = driver.manage().window().getSize().width;        int height = driver.manage().window().getSize().height;        driver.swipe(width / 2, height * 3 / 4, width / 2, height / 4, during);        // wait for page loading    }    /**     * This Method for swipe down     *      * @author Young     * @param driver     * @param during     */    public void swipeToDown(AndroidDriver driver, int during) {        int width = driver.manage().window().getSize().width;        int height = driver.manage().window().getSize().height;        driver.swipe(width / 2, height / 4, width / 2, height * 3 / 4, during);        // wait for page loading    }    /**     * This Method for swipe Left     *      * @author Young     * @param driver     * @param during     */    public void swipeToLeft(AndroidDriver driver, int during) {        int width = driver.manage().window().getSize().width;        int height = driver.manage().window().getSize().height;        driver.swipe(width * 3 / 4, height / 2, width / 4, height / 2, during);        // wait for page loading    }    /**     * This Method for swipe Right     *      * @author Young     * @param driver     * @param during     */    public void swipeToRight(AndroidDriver driver, int during) {        int width = driver.manage().window().getSize().width;        int height = driver.manage().window().getSize().height;        driver.swipe(width / 4, height / 2, width * 3 / 4, height / 2, during);        // wait for page loading    }
复制代码

 


 

最后来测试一下这几个滑动方法:
复制代码
package com.dbyl.core;import org.apache.commons.io.FileUtils;import org.openqa.selenium.By;import org.openqa.selenium.NoSuchElementException;import org.openqa.selenium.OutputType;import org.openqa.selenium.TakesScreenshot;import org.openqa.selenium.WebElement;import org.openqa.selenium.remote.CapabilityType;import org.openqa.selenium.remote.DesiredCapabilities;import org.testng.Assert;import org.testng.annotations.AfterClass;import org.testng.annotations.BeforeClass;import org.testng.annotations.Test;import io.appium.java_client.android.AndroidDriver;import java.io.File;import java.io.IOException;import java.net.URL;import java.util.List;import java.util.concurrent.TimeUnit;public class zhiHu {    private AndroidDriver driver;    private boolean isInstall = false;    /**     * @author Young     * @throws IOException     */    public void startRecord() throws IOException {        Runtime rt = Runtime.getRuntime();        // this code for record the screen of your device        rt.exec("cmd.exe /C adb shell screenrecord /sdcard/runCase.mp4");    }    @BeforeClass(alwaysRun = true)    public void setUp() throws Exception {        // set up appium        DesiredCapabilities capabilities = new DesiredCapabilities();        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");        capabilities.setCapability("platformName", "Android");        capabilities.setCapability("deviceName", "Android Emulator");        capabilities.setCapability("platformVersion", "4.4");        // if no need install don't add this        if (isInstall) {            File classpathRoot = new File(System.getProperty("user.dir"));            File appDir = new File(classpathRoot, "apps");            File app = new File(appDir, "zhihu.apk");            capabilities.setCapability("app", app.getAbsolutePath());        }        capabilities.setCapability("appPackage", "com.zhihu.android");        // support Chinese        capabilities.setCapability("unicodeKeyboard", "True");        capabilities.setCapability("resetKeyboard", "True");        // no need sign        capabilities.setCapability("noSign", "True");        capabilities.setCapability("appActivity", ".ui.activity.GuideActivity");        driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),                capabilities);        startRecord();    }    public void login() {        WebElement loginButton;        if (isLoginPresent(driver, 60)) {            loginButton = driver.findElement(By                    .id("com.zhihu.android:id/login"));            loginButton.click();        }        else {            Assert.assertTrue(false);        }        // wait for 20s        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);        // find login userName and password editText        List<WebElement> textFieldsList = driver                .findElementsByClassName("android.widget.EditText");        textFieldsList.get(0).sendKeys("seleniumcookies@126.com");        textFieldsList.get(1).sendKeys("cookies123");        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);        // find ok button byName        driver.findElementById("android:id/button1").click();        driver.manage().timeouts().implicitlyWait(90, TimeUnit.SECONDS);        // find keyword 首页 and verify it is display        Assert.assertTrue(driver.findElement(By.name("首页")).isDisplayed());    }    public boolean isLoginPresent(AndroidDriver driver, int timeout) {        boolean isPresent = new AndroidDriverWait(driver, timeout).until(                new ExpectedCondition<WebElement>() {                    public WebElement apply(AndroidDriver d) {                        return d.findElement(By                                .id("com.zhihu.android:id/login"));                    }                }).isDisplayed();        return isPresent;    }    @Test(groups = "swipeTest", priority = 1)    public void swipe() {        // find login button        if (isInstall) {            login();        }        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        // find keyword 首页 and verify it is display        Assert.assertTrue(driver.findElement(By.name("首页")).isDisplayed());        snapshot((TakesScreenshot) driver, "zhihu_before_swipe.png");        swipeToUp(driver, 500);        snapshot((TakesScreenshot) driver, "zhihu_after_swipe.png");        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        swipeToDown(driver, 1000);        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        List<WebElement> titles = driver                .findElementsById("com.zhihu.android:id/title");        titles.get(0).click();        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);                //swipe to right        swipeToRight(driver, 100);        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        // find keyword 首页 and verify it is display        Assert.assertTrue(driver.findElement(By.name("首页")).isDisplayed());    }    /**     * This Method for swipe up     *      * @author Young     * @param driver     * @param during     */    public void swipeToUp(AndroidDriver driver, int during) {        int width = driver.manage().window().getSize().width;        int height = driver.manage().window().getSize().height;        driver.swipe(width / 2, height * 3 / 4, width / 2, height / 4, during);        // wait for page loading    }    /**     * This Method for swipe down     *      * @author Young     * @param driver     * @param during     */    public void swipeToDown(AndroidDriver driver, int during) {        int width = driver.manage().window().getSize().width;        int height = driver.manage().window().getSize().height;        driver.swipe(width / 2, height / 4, width / 2, height * 3 / 4, during);        // wait for page loading    }    /**     * This Method for swipe Left     *      * @author Young     * @param driver     * @param during     */    public void swipeToLeft(AndroidDriver driver, int during) {        int width = driver.manage().window().getSize().width;        int height = driver.manage().window().getSize().height;        driver.swipe(width * 3 / 4, height / 2, width / 4, height / 2, during);        // wait for page loading    }    /**     * This Method for swipe Right     *      * @author Young     * @param driver     * @param during     */    public void swipeToRight(AndroidDriver driver, int during) {        int width = driver.manage().window().getSize().width;        int height = driver.manage().window().getSize().height;        driver.swipe(width / 4, height / 2, width * 3 / 4, height / 2, during);        // wait for page loading    }    @Test(groups = { "profileSetting" }, priority = 2)    public void profileSetting() {        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        // find keyword 首页 and verify it is display        Assert.assertTrue(driver.findElement(By.name("首页")).isDisplayed());        driver.swipe(100, 400, 100, 200, 500);        WebElement myButton = driver.findElement(By                .className("android.widget.ImageButton"));        myButton.click();        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        driver.swipe(700, 500, 100, 500, 10);        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        List<WebElement> textViews = driver                .findElementsByClassName("android.widget.TextView");        textViews.get(0).click();        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        driver.findElementById("com.zhihu.android:id/name").click();        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        // wait for 60s if WebElemnt show up less than 60s , then return , until        // 60s        By by = new By.ById("com.zhihu.android:id/showcase_close");        snapshot((TakesScreenshot) driver, "zhihu_showClose.png");        if (isElementPresent(by, 30)) {            driver.findElement(by).click();        }        Assert.assertTrue(driver                .findElementsByClassName("android.widget.TextView").get(0)                .getText().contains("selenium"));        driver.findElementById("com.zhihu.android:id/menu_people_edit").click();        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        WebElement intro = driver                .findElementById("com.zhihu.android:id/introduction");        intro.click();        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        WebElement content = driver                .findElementById("com.zhihu.android:id/content");        String text = content.getAttribute("text");        content.click();        clearText(text);        content.sendKeys("Appium Test. Create By Young");        driver.findElementById("com.zhihu.android:id/menu_question_done")                .click();        WebElement explanation = driver                .findElementById("com.zhihu.android:id/explanation");        explanation.click();        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);        content = driver.findElementById("com.zhihu.android:id/content");        text = content.getAttribute("text");        content.click();        clearText(text);        content.sendKeys("Appium Test. Create By Young. This is an appium type hahahahah");        driver.findElementById("com.zhihu.android:id/menu_question_done")                .click();        snapshot((TakesScreenshot) driver, "zhihu.png");    }    /**     * This method for delete text in textView     *      * @author Young     * @param text     */    public void clearText(String text) {        driver.sendKeyEvent(123);        for (int i = 0; i < text.length(); i++) {            driver.sendKeyEvent(67);        }    }    @AfterClass(alwaysRun = true)    public void tearDown() throws Exception {        driver.quit();    }    /**     * This Method create for take screenshot     *      * @author Young     * @param drivername     * @param filename     */    public static void snapshot(TakesScreenshot drivername, String filename) {        // this method will take screen shot ,require two parameters ,one is        // driver name, another is file name        String currentPath = System.getProperty("user.dir"); // get current work                                                                // folder        File scrFile = drivername.getScreenshotAs(OutputType.FILE);        // Now you can do whatever you need to do with it, for example copy        // somewhere        try {            System.out.println("save snapshot path is:" + currentPath + "/"                    + filename);            FileUtils                    .copyFile(scrFile, new File(currentPath + "\\" + filename));        } catch (IOException e) {            System.out.println("Can't save screenshot");            e.printStackTrace();        } finally {            System.out.println("screen shot finished, it's in " + currentPath                    + " folder");        }    }    /**     *      * @param by     * @param timeOut     * @return     */    public boolean isElementPresent(final By by, int timeOut) {        try {            new AndroidDriverWait(driver, timeOut)                    .until(new ExpectedCondition<WebElement>() {                        public WebElement apply(AndroidDriver d) {                            return d.findElement(by);                        }                    });            return true;        } catch (Exception e) {            return false;        }    }}
复制代码

整个过程会按照先向下,向上,向右滑动。

有了这个滑动方法,能不能做一些更高级的事?


0 0
原创粉丝点击