Appium 处理滑动
2015-07-27 14:59
260 查看
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运行的时候并不是全屏,还有系统自带工具栏和边框,一定要避免!!!
可以看出 ,为了让apppium 更好的兼容不同分辨率的设备,在执行滑动前先获取屏幕的分辨率
接下来就可以封装四个滑动的方法:
最后来测试一下这几个滑动方法:
整个过程会按照先向下,向上,向右滑动。
有了这个滑动方法,能不能做一些更高级的事?
此方法共有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;
}
}
}
整个过程会按照先向下,向上,向右滑动。
有了这个滑动方法,能不能做一些更高级的事?
相关文章推荐
- iOS开发之layoutSubviews的作用和调用机制
- iOS Sprite Kit教程之场景的设置
- android_framework_permissions
- app Framework基础知识
- IOS socket开发基础
- Cocos2d-js 3.x 动作
- Android中app卡顿原因分析(ios顺滑)
- IOS第四天(2:字典转模型plist)
- Android开发之动态创建布局文件及控件
- AndroidViewAnimations开源框架实现
- 微信红包接入1-接入前准备
- app Framework入门基础知识
- Android比较好的10个开源框架
- IOS第四天(1:图片的方法和缩小,遮罩层)
- Android百度地图的简单实现
- Objective-C中@property的所有属性详解
- 微信公众号开发之微信模板消息
- iOS自学---彩票App第一天
- SharePointAPP中不能使用JS创建txt文件?
- android 实现悬架控制