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 

     
  • 相关阅读:
    Educational Codeforces Round 83 --- F. AND Segments
    Educational Codeforces Round 83 --- G. Autocompletion
    SEERC 2019 A.Max or Min
    2019-2020 ICPC Southwestern European Regional Programming Contest(Gym 102501)
    Educational Codeforces Round 78 --- F. Cards
    今天我学习了一门全新的语言
    codeforces 1323D 题解(数学)
    Educational Codeforces Round 80 (Div. 2) 题解 1288A 1288B 1288C 1288D 1288E
    Educational Codeforces Round 81 (Div. 2) 题解 1295A 1295B 1295C 1295D 1295E 1295F
    Codeforces Round #617 (Div. 3) 题解 1296C 1296D 1296E 1296F
  • 原文地址:https://www.cnblogs.com/tobecrazy/p/4612133.html
Copyright © 2011-2022 走看看