zoukankan      html  css  js  c++  java
  • appium 滑动

    前些日子,配置好了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;
            }
    
        }
    }

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

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

    答案将在明天揭晓,swipe 

     
  • 相关阅读:
    移动web图片高度自适应的解决方案
    高性能滚动 scroll 及页面渲染优化
    Web学习之跨域问题及解决方案
    apply和call用法
    ES6学习之箭头函数
    JS 对象封装的常用方式
    为Array对象添加一个去除重复项的方法
    最全的常用正则表达式大全
    前端如何实现图片懒加载(lazyload) 提高用户体验
    菜鸟教程 Missing parentheses in call to 'print'
  • 原文地址:https://www.cnblogs.com/tobecrazy/p/4612133.html
Copyright © 2011-2022 走看看