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; } } }