小皮球的故事 发表于 2017-6-9 14:19:15

关于 Appium 的一点分享

Appium 日常干货分享


最新的 io.appium java -client 升级到5.0 了 ,有些 方法没来得及更新。
Capabilities 配置(Android):
public void StartUp() throws InterruptedException,IOException {
      DesiredCapabilities capabilities = new DesiredCapabilities();
      capabilities.setCapability("device","Android");
      capabilities.setCapability("deviceName", "192.168.57.101:5555");
      capabilities.setCapability("udid", "192.168.57.101:5555");
      capabilities.setCapability("platformVersion", "6.0");
      capabilities.setCapability("appPackage", "com.sds.android.ttpod");
      capabilities.setCapability("appActivity", "com.ali.music.entertainment.splash.SplashActivity");
      //capabilities.setCapability(MobileCapabilityType.APP, "链接地址");//引用apk下载地址
      capabilities.setCapability("unicodeKeyboard", "True");
      capabilities.setCapability("resetKeyboard", "True");
      capabilities.setCapability("autoAcceptAlerts", true);// 自动接受提示信息
      driver = new AndroidDriver<>(new URL("http://"+ip+":"+port+"/wd/hub"), capabilities);
      driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);

    } Capabilities 配置(IOS):
public void SetIosDriverSession(Capabilities cap) throws MalformedURLException, InterruptedException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
    capabilities.setCapability("platformName", "iOS");
    capabilities.setCapability("newCommandTimeout", "30000");
    capabilities.setCapability("deviceName", cap.getDriverkey());   
    capabilities.setCapability("platformVersion", cap.getDriverVersion());
    capabilities.setCapability("app", "/Users/liyu/Documents/TTEntertainment-iOS.app");
    capabilities.setCapability("autoAcceptAlerts", "True");
    capabilities.setCapability("unicodeKeyboard", "True");
    capabilities.setCapability("resetKeyboard", "True");
    try {

            driver= new IOSDriver(new URL("http://"+cap.getIp()+":"+cap.getProt()+"/wd/hub"), capabilities);
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    } catch (MalformedURLException e) {
      e.printStackTrace();
    }
            driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    Thread.sleep(10000);
}UiSelector text
driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Custom View"\")").click();UiSelector textContains 全局文本匹配
driver.findElementByAndroidUIAutomator("new UiSelector().textContains(\"发现\")").click();UiSelector textMatches
driver.findElementByAndroidUIAutomator("new UiSelector().textMatches(\"^Custom.*\")").click();UiSelector textStartsWith
driver.findElementByAndroidUIAutomator("new UiSelector().textStartsWith(\"Custom\")").click();


小皮球的故事 发表于 2017-6-9 14:34:12

检查网络
/***
* 检查网络
* @return 是否正常
*/
public static boolean checkNet(){
String text=driver.getNetworkConnection().toString();
if(text.contains("Data: true"))
return true;
else
return false;
}
desc的view
/***
* 根据UIautomator底层方法得到对应desc的view
* @param desc名
* @return View
*/
public static WebElement getViewbyUidesc(String name){
return driver.findElementByAndroidUIAutomator("new UiSelector().descriptionContains(\""+name+"\")");
}
得到对应text的view
/***
* 根据UIautomator底层方法得到对应text的view
* @param text名
* @return View
*/
public static WebElement getViewbyUitext(String name){
return driver.findElementByAndroidUIAutomator("new UiSelector().textContains(\""+name+"\")");
}
超时时间:
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
打印整个页面PageSource:
System.out.print(driver.getPageSource());
获取当前时间并截图,命名:
public static String getScreen(){
String fileRoute="路径";
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmm");
String picname=fileRoute+df.format(new Date()).toString()+".png";
File screen = driver.getScreenshotAs(OutputType.FILE);
System.out.println(picname);
File screenFile = new File(picname);
try {
FileUtils.copyFile(screen, screenFile); 
String time=df.format(new Date()).toString();
System.out.println("当前时间"+time);
return time;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

APP内上滑:
driver.swipe(250, 300, 250, 1400, 0);
APP内上滑:
driver.swipe(250,1400, 250,300 , 0);
WebView navigate 操作
//driver.navigate().forward(); // 前进
//driver.navigate().back(); // 后退
driver.navigate().refresh(); // 刷新``
切换WEBVIEW
/***
* 切换WEB页面查找元素
*/
public static void switchtoWeb(){
try {
Set<String> contextNames = driver.getContextHandles();
for (String contextName : contextNames) {
// 用于返回被测app是NATIVE_APP还是WEBVIEW,如果两者都有就是混合型App
if(contextName.contains("WEBVIEW")||contextName.contains("webview")){
driver.context(contextName);
System.out.println("跳转到web页 开始操作web页面"); 
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
滑动相关
/***
* 上滑1/4屏幕
*/
public static void slideUP(){
int x=driver.manage().window().getSize().width;
int y=driver.manage().window().getSize().height;
driver.swipe(x/2, y/3*2, x/2, y/3*1, 0);
}
/***
* 下滑1/4屏幕
*/
public static void slideDown(){
int x=driver.manage().window().getSize().width;
int y=driver.manage().window().getSize().height;
driver.swipe(x/2, y/3*1, x/2, y/3*2, 0);
}
/***
* 左滑1/2屏幕
*/
public static void slideLeft(){
int x=driver.manage().window().getSize().width;
int y=driver.manage().window().getSize().height;
driver.swipe(x/4*3, y/2, x/4*1, y/2, 0);
}
/***
* 右滑1/2屏幕
*/
public static void slideRight(){
int x=driver.manage().window().getSize().width;
int y=driver.manage().window().getSize().height;
driver.swipe(x/4*1, y/2, x/4*3, y/2, 0);
}
/***
* 特殊上滑
* @param 传入从左到右宽度的百分比(1-99之间)
*/
public static void slideUP(int i){
Assert.assertFalse("上滑宽度传入错误", i<=0||i>=100);
int x=driver.manage().window().getSize().width;
int y=driver.manage().window().getSize().height;
driver.swipe(x/10*i, y/3*2, x/10*i, y/3*1, 0);
}
/***
* 特殊下滑
* @param 传入从左到右宽度的百分比(1-99之间)
*/
public static void slideDown(int i){
Assert.assertFalse("下滑宽度传入错误", i<=0||i>=100);
int x=driver.manage().window().getSize().width;
int y=driver.manage().window().getSize().height;
driver.swipe(x/10*i, y/3*1, x/10*i, y/3*2, 0);
}
/***
* 特殊左滑
* @param 传入从上到下宽度的百分比(1-99之间)
*/
public static void slideLeft(int i){
Assert.assertFalse("左滑宽度传入错误", i<=0||i>=100);
int x=driver.manage().window().getSize().width;
int y=driver.manage().window().getSize().height;
driver.swipe(x/4*3, y/10*i, x/4*2, y/10*i, 0);
}
/***
* 特殊右滑
* @param 传入从上到下宽度的百分比(1-99之间)
*/
public static void slideRight(int i){
Assert.assertFalse("左滑宽度传入错误", i<=0||i>=100);
int x=driver.manage().window().getSize().width;
int y=driver.manage().window().getSize().height;
driver.swipe(x/4*2, y/10*i, x/4*3, y/10*i, 0);
}
content-desc定位
/***
* 根据content-desc查找元素
* @param view的类型
* @param content-desc 的内容
* @return
*/
public static WebElement getViewbyXathwithcontentdesc(String view,String name){
return driver.findElementByXPath("//"+view+"");
}

梦想家 发表于 2017-6-9 14:45:10

;P欢迎多多分享

测试就是来开荒 发表于 2017-6-9 15:07:44

请问Appium,mac环境下命令行安装后,是否还需要安装桌面版?另外始终不解,命令行安装appium为什么需要java,(我的理解:单纯安装apium后,然后使用ruby、python脚本语言去编写测试用例,所以现在有些傻傻分不清,这个环境在mac端到底怎么配置了),目前已经安装好appiu,执行appiu-doctor 没有报错

小皮球的故事 发表于 2017-6-9 15:13:20

测试就是来开荒 发表于 2017-6-9 15:07
请问Appium,mac环境下命令行安装后,是否还需要安装桌面版?另外始终不解,命令行安装appium为什么需要jav ...

命令安装和 客户端是一个性质的。
用到java的主要原因是appium 内部通讯是主要底层交互是 Android 的 UiAutomator
可以先去了解一下大概的原理

测试就是来开荒 发表于 2017-6-9 15:42:40

小皮球的故事 发表于 2017-6-9 15:13
命令安装和 客户端是一个性质的。
用到java的主要原因是appium 内部通讯是主要底层交互是 Android 的 Ui ...

谢谢,如果命令行安装好后,有没有直接的后面的操作方法,比如我需要验证一个基本用例查看效果,看了蛮多帖子,还没有发现更好的或者可以理解的,不知道你这边是否有好的推荐?
页: [1]
查看完整版本: 关于 Appium 的一点分享