appium的几点总结

原文链接:http://blog.csdn.net/bear_w/article/details/50345283

  • 1. 建立session时常用命令:
DesiredCapabilities cap = new DesiredCapabilities();
cap.SetCapability("browserName", ""); // web 浏览器名称(‘Safari‘ ,‘Chrome‘等)。如果对应用进行自动化测试,这个关键字的值应为空。
cap.SetCapability("platformName", "Android");//你要测试的手机操作系统
cap.SetCapability("platformVersion", "4.4");//手机操作系统版本
cap.SetCapability("automationName", "selendroid");  //你想使用的自动化测试引擎:Appium (默认) 或 Selendroid
cap.SetCapability("deviceName", " Android Emulator"); //使用的手机类型或模拟器类型,真机时输入Android Emulator或者手机型号
cap.SetCapability("udid", udid); //连接的物理设备的唯一设备标识,Android可以不设置

cap.SetCapability("newCommandTimeout", "300");  //设置收到下一条命令的超时时间,超时appium会自动关闭session ,默认60秒
cap.SetCapability("unicodeKeyboard", "True");//支持中文输入,会自动安装Unicode 输入法。默认值为 false
cap.SetCapability("resetKeyboard", "True"); //在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态

cap.SetCapability("‘app‘", "D:\\AndroidAutomation\\AndroidAutoTest\\app\\zhongchou.apk");  //未安装应用时,设置app的路径

//手机已安装app,直接从手机启动app,上面路径不设置
cap.SetCapability("appPackage", "com.nbbank");  //你要启动的Android 应用对应的Activity名称|比如`MainActivity`, `.Settings`|
cap.SetCapability("appActivity", "com.nbbank.ui.ActivityShow");  //你想运行的Android应用的包名
cap.SetCapability("appWaitActivity", "com.nbbank.ui.ActivityLogo");  //你想要等待启动的Android Activity名称|比如`SplashActivity`|

Uri serverUri = new Uri("http://127.0.0.1:4723/wd/hub");
driver = new AndroidDriver<IWebElement>(serverUri, cap, TimeSpan.FromSeconds(180));

更多详细查看官网:https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/caps.cn.md

  • 2. driver常用方法及注意事项

1) 常用方法:

driver.HideKeyboard();//隐藏键盘
driver.BackgroundApp(60);//60秒后把当前应用放到后台去
driver.LockDevice(3); //锁定屏幕

//在当前应用中打开一个 activity 或者启动一个新应用并打开一个 activity
driver.StartActivity("com.iwobanas.screenrecorder.pro", "com.iwobanas.screenrecorder.RecorderActivity");
driver.OpenNotifications();//打开下拉通知栏 只能在 Android 上使用
driver.IsAppInstalled("com.example.android.apis-");//检查应用是否已经安装
driver.InstallApp("path/to/my.apk");//安装应用到设备中去
driver.RemoveApp("com.example.android.apis");//从设备中删除一个应用
driver.ShakeDevice();//模拟设备摇晃
driver.CloseApp();//关闭应用
driver.LaunchApp();//根据服务关键字 (desired capabilities) 启动会话 (session) 。请注意这必须在设定 autoLaunch=false 关键字时才能生效。这不是用于启动指定的 app/activities
driver.ResetApp();//应用重置
driver.GetContexts();//列出所有的可用上下文
driver.GetContext();//列出当前上下文
driver.SetContext("name");//将上下文切换到默认上下文
driver.GetAppStrings();//获取应用的字符串
driver.KeyEvent(176);//给设备发送一个按键事件:keycode
driver.GetCurrentActivity();//获取当前 activity。只能在 Android 上使用
//driver.Pinch(25, 25);//捏屏幕 (双指往内移动来缩小屏幕)
//driver.Zoom(100, 200);//放大屏幕 (双指往外移动来放大屏幕)
driver.PullFile("Library/AddressBook/AddressBook.sqlitedb");//从设备中拉出文件
driver.PushFile("/data/local/tmp/file.txt", "some data for the file");//推送文件到设备中去

driver.FindElement(By.Name(""));
driver.FindElementById("id");
driver.FindElementByName("text");
driver.FindElementByXPath("//*[@name=‘62‘]");

2) 注意事项:
使用driver.Sendkeys(string str)向文本框输入内容前,最好先element.Click( )一下,否则某些情况下,输入的内容会请不掉,文本框提示的内容也会在 输入的文本前显示出来。sendkey方法在发送数据之前会清空一下文本框,一般不需要Clear,如前面的情况Clear后仍是存在的,click后正常

  • 3. 等待页面加载策略:

1) 显性等待:调用selenium的方法, 需要添加WebDriver.Support引用
显性等待是指在代码进行下一步操作之前等待某一个条件的发生。最不好的情况是使用Thread.sleep()去设置一段确认的时间去等待。但为什么说最不好呢?因为一个元素的加载时间有长有短,你在设置sleep的时间之前要自己把握长短,太短容易超时,太长浪费时间。selenium webdriver提供了一些方法帮助我们等待正好需要等待的时间

            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
            element = wait.Until<IWebElement>((d) =>
           {
               return driver.FindElement(By.Id("userName"));
           });

2) 隐性等待:设置时间不易过长,设置为500或1000即可
隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1));
  • 4. drive.KeyEvent(int )的使用: 可使用KeyEvent发送键盘数据,比如退格,Enter键等
driver.KeyEvent(3); //KEYCODE_HOME 按键Home 3
driver.KeyEvent(26);  //KEYCODE_POWER 电源键 26
driver.KeyEvent(67);  //KEYCODE_DEL 退格键 67
driver.KeyEvent(66);  //KEYCODE_ENTER 回车键
driver.KeyEvent(122); //KEYCODE_MOVE_HOME 光标移动到开始
driver.KeyEvent(123); //KEYCODE_MOVE_END 光标移动到末尾
  • 5. 坐标操作

    为防止不同手机分辨率不同带来的影响,要避免使用固定的坐标,可以用以下方式获取元素的坐标

double Screen_X = driver.Manage().Window.Size.Width;//获取手机屏幕宽度
double Screen_Y = driver.Manage().Window.Size.Height;//获取手机屏幕高度
double startX = element.Location.X; //获取元素的起点坐标,即元素最左上角点的横坐标
double startY = element.Location.Y; //获取元素的起点坐标,即元素最左上角点的纵坐标
double elementWidth = element.Size.Width;  //获取元素的宽度
double elementHight = element.Size.Height; //获取元素的宽度

在封装“滑动”、“ TouchAction”等操作时可以用以上方法来获取坐标进行操作。

示例:分装两个元素之间的滑动

        IWebElement elmentA = null;
        IWebElement elmentB = null;
        int startX = 0, startY = 0, endX = 0, endY = 0;
        int duration=0,time=0;
        /// <summary>
        /// 从元素A的位置滑动到元素B的位置
        /// </summary>
        /// <param name="A">元素A的名称</param>
        /// <param name="B">元素B的名称</param>
        /// <param name="sDuration">滑动持续时间</param>
        /// <param name="sTime">滑动次数</param>
        public void SwipeAToB(string A, string B,string sDuration,string sTime)
        {
            startX = elmentA.Location.X + elmentA.Size.Width / 2;  //元素A的中心横坐标
            startY = elmentA.Location.Y + elmentA.Size.Height / 2; //元素A的中心纵坐标
            endX = elmentB.Location.X + elmentB.Size.Width / 2;    //元素B的中心横坐标
            endY = elmentB.Location.Y + elmentB.Size.Height / 2;   //元素B的中心纵坐标

            duration = string.IsNullOrEmpty(sDuration) ? 1500 : int.Parse(sDuration); //持续时间为空时,默认设置为1500毫秒
            time = string.IsNullOrEmpty(sTime) ? 1500 : int.Parse(sTime); //滑动次数为空时,默认设置为滑动1次

            for (int i = 0; i < time; i++)
            {
                driver.Swipe(startX, startY, endX, endY, duration);
            }
        }

注意:element.Loaction和element.Size,每次获取时都会重新去手机里获取,为节省时间如果有获取相同值的,建议储存成变量。

  • 6. 取消重新安装unlock和setting

注销如下代码:

Appium\node_modules\appium\lib\devices\Android\android.js

async.series([
    this.initJavaVersion.bind(this),
    this.initAdb.bind(this),
    this.packageAndLaunchActivityFromManifest.bind(this),
    this.initUiautomator.bind(this),
    this.prepareDevice.bind(this),
    this.checkApiLevel.bind(this),
    this.pushStrings.bind(this),
    this.processFromManifest.bind(this),
    this.uninstallApp.bind(this),
    this.installAppForTest.bind(this),
    this.forwardPort.bind(this),
    this.pushAppium.bind(this),
    this.initUnicode.bind(this),

    // DO NOT push settings app and unlock app
    //this.pushSettingsApp.bind(this),
    //this.pushUnlock.bind(this),

    function (cb) {this.uiautomator.start(cb);}.bind(this),
    this.wakeUp.bind(this),
    this.unlock.bind(this),
    this.getDataDir.bind(this),
    this.setupCompressedLayoutHierarchy.bind(this),
    this.startAppUnderTest.bind(this),
    this.initAutoWebview.bind(this),
    this.setActualCapabilities.bind(this)
  ], function (err) {
时间: 2024-10-03 21:41:17

appium的几点总结的相关文章

Mac下搭建appium自动化测试环境

一起需要装的有: 1.  JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.  SDK(测试安装app需要,链接为SDK24.4.1版本) http://down.tech.sina.com.cn/download/d_load.php?d_id=45703&down_id=2&ip=183.11.129.46 3.  Appium客户端 http://pan.

Appium移动自动化测试之—基于java的iOS环境搭建

本文仅供参考,同时感谢帮助我搭建环境的同事 操作系统的名称:Mac OS X操作系统的版本:10.12.6 接下来我们开始踏上搭建Appium+java+ios之路,本文只说个大概,毕竟本机已经装过了,我就不在折腾了,耗费好几天时间才搞定. 一:安装Appium 1.作者系统安装的Appium版本为:1.6.4,安装方法:打开终端输入:npm install –g [email protected],检查是否安装成功:终端输入appium -v,如果显示版本号说明安装成功. 2.图形界面客户端安

appium+python在Mac上环境搭建

前言 mac上搭建appium+python的环境还是有点复杂的,需要准备的软件 1.nodejs 2.npm 3.cnpm 4.appium 5.pip 6.Appium-Python-Client 一.nodejs安装 1.nodejs下载地址:https://nodejs.org/ 2.下载完成后傻瓜式下一步安装 3.打开终端,查看版本号是否安装成功,输入:node -v 二.npm安装 1.打开终端,输入:sudo bash 2.继续输入:sudo curl -L https://npm

Appium运行报错

Error:Unable to find an active device or emulator with os 4.2.The following are available: 192.168.56.101:5555 原因:运行脚本设置安卓版本与appium设置版本不一致 解决:将脚本和appium改为一致便可

appium 相关内容

appium简明教程(转):http://www.yangyanxing.com/?p=1266 appium使用入门:http://wenku.baidu.com/link?url=J9fpuKe0NPfgt_aL4Pgsxog9FhunEYfbq7swk4GvS578f3Outy-19mtLVokVKQ1aKfi2ymrkAZ0aQ3-eHq5ib321VRJAY17ZhenImTDTHpG IOS.Android自动化测试框架Appium概述:http://www.2cto.com/Art

使用appium进行ios测试,启动inspector时遇到的问题(一)

最近在公司,让做ios的自动化测试,因为以前做过android的自动化测试,用的也是appium,觉得没什么,结果一开始在搭建环境就遇到了很多的问题,现在将我遇到的问题,以及解决方法,给大家分享出来.(ps:吐槽一下testhome,发了两个帖子一个提问帖一个心得分享帖,全都给拉到违规区了,问题也没有人给看) 进入正题,说一下我的环境: xcode 7.1.1 simulator 9.1 appium 1.4.13 iphone 5s  ios9.1 首先说一下,appium 在ios版本选择这

Appium+Python app自动化测试之脚本启动和停止Appium服务

研究了一段时间的Appium android app的自动化测试,工作中需要连接多台手机终端同时执行测试用例,我实现的方式是获取用例中需要执行用例的设备id个数以及实际连接到的设备数(通过adb devices获取),然后启动相应数量的Appium 服务,以便每个设备执行时并发进行并且互不影响.当然也可以通过selenium grid来实现,只是目前还在学习研究中,还是先把目前启动多个appium服务实现的方式记录下来. 一.Windows下启动单个appium服务 需要启动多个appium服务

appium 测试微信公众号 切换webview

appium测试微信公众号的时候 切换webview报找不到contextdriver.context("WEBVIEW_com.tencent.mm:tools");io.appium.java_client.NoSuchContextException: No such context found. (WARNING: The server did not provide any stacktrace information)Command duration or timeout:

Appium基础环境搭建(windows)---基于python

1  JDK安装 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装注意:安装路径不要有空格,建议:安装在根目录下 环境变量配置(路径:我的电脑---属性----高级设置---环境变量配置) 新建 新建classpath   变量值为:  .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar 注:根据自己的安装路径填写,classpath 注

Appium运行时没有启动activity的权限:A new session could not be created.(Original error: Permission to start activity denied)

小白搞appium,遇到启动不了activity的问题: 查找解决方案说是跟AndroidManifest.xml有关系,参考:https://github.com/appium/appium/issues/4313 之后打开AndroidManifest.xml,在主activity和intent入口处添加:android:exported="true" 问题马上解决,终于可以启动app了! 希望可以帮到新的同学们.