51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2355|回复: 5
打印 上一主题 下一主题

[Appium] 关于 Appium 的一点分享

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-9 14:19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Appium 日常干货分享


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

  15.     }
复制代码
Capabilities 配置(IOS):
  1. public void SetIosDriverSession(Capabilities cap) throws MalformedURLException, InterruptedException {
  2.     DesiredCapabilities capabilities = new DesiredCapabilities();
  3.     capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
  4.     capabilities.setCapability("platformName", "iOS");
  5.     capabilities.setCapability("newCommandTimeout", "30000");  
  6.     capabilities.setCapability("deviceName", cap.getDriverkey());   
  7.     capabilities.setCapability("platformVersion", cap.getDriverVersion());
  8.     capabilities.setCapability("app", "/Users/liyu/Documents/TTEntertainment-iOS.app");
  9.     capabilities.setCapability("autoAcceptAlerts", "True");
  10.     capabilities.setCapability("unicodeKeyboard", "True");  
  11.     capabilities.setCapability("resetKeyboard", "True");
  12.     try {

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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 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+"[contains(@content-desc,'"+name+"')]");
}
回复 支持 反对

使用道具 举报

  • TA的每日心情

    2024-7-8 09:00
  • 签到天数: 943 天

    连续签到: 1 天

    [LV.10]测试总司令

    3#
    发表于 2017-6-9 14:45:10 | 只看该作者
    欢迎多多分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
    发表于 2017-6-9 15:07:44 | 只看该作者
    请问Appium,mac环境下命令行安装后,是否还需要安装桌面版?另外始终不解,命令行安装appium为什么需要java,(我的理解:单纯安装apium后,然后使用ruby、python脚本语言去编写测试用例,所以现在有些傻傻分不清,这个环境在mac端到底怎么配置了),目前已经安装好appiu,执行appiu-doctor 没有报错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

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

    使用道具 举报

    该用户从未签到

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

    谢谢,如果命令行安装好后,有没有直接的后面的操作方法,比如我需要验证一个基本用例查看效果,看了蛮多帖子,还没有发现更好的或者可以理解的,不知道你这边是否有好的推荐?
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-26 20:02 , Processed in 0.069341 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表