appium使用参考_04


  
  
  • 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));
  • 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) {

   
   
  • 7. 常用API
1.使用AndroidDriver,其已经继承了AppiumDriverprivate AndroidDriver driver; @Before public void setUp() throws Exception {     DesiredCapabilities capabilities = new DesiredCapabilities();     capabilities.setCapability("deviceName", "Android Emulator");     capabilities.setCapability("platformVersion", "4.4");     capabilities.setCapability("platformName", "Android");     capabilities.setCapability("appPackage", "com.android.settings");     capabilities.setCapability("appActivity", ".Settings");       driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),             capabilities); } @After public void tearDown() throws Exception {     driver.quit(); } 2.截屏并保存至本地 File screen = driver.getScreenshotAs(OutputType.FILE); File screenFile = new File("d:\\screen.png"); try {     FileUtils.copyFile(screen, screenFile); //commons-io-2.0.1.jar中的api } catch (IOException e) {     e.printStackTrace(); } 3.push文件、pull文件 File file = new File("d:\\test.txt"); //test.txt内容为"test" String content = null; try {     content = FileUtils.readFileToString(file); } catch (IOException e) {     e.printStackTrace(); } byte[] data = Base64.encodeBase64(content.getBytes()); driver.pushFile("sdcard/test.txt", data); byte[] resultDate = driver.pullFile("sdcard/test.txt"); System.out.println(new String(Base64.decodeBase64(resultDate))); //打印结果为"test" 4.//获取当前界面的activity,可用于断言是否跳转到预期的activity driver.currentActivity(); 5//打开通知栏界面 driver.openNotifications(); 6//获取网络状态 int status = driver.getNetworkConnection().value; System.out.println(status); //设置网络状态 driver.setNetworkConnection(new NetworkConnectionSetting(status)); 7.//启动其他应用,跨APP driver.startActivity("com.android.camera", ".CameraLauncher"); 8.//自动滑动列表 driver.scrollTo("text"); //或者 driver.scrollToExact("text"); 9.//安装APP driver.installApp(appPath); //判断应用是否已安装 driver.isAppInstalled("package name"); 10.//拖动相机图标至日历图标位置 new TouchAction(driver).longPress(driver.findElementByName("相机")) .moveTo(driver.findElementByName("日历")).release().perform(); 11.//锁屏 driver.lockScreen(2); //判断是否锁屏 driver.isLocked(); 12.//发送按键事件 driver.sendKeyEvent(AndroidKeyCode.HOME); 13.getAppStrings() 默认系统语言对应的Strings.xml文件内的数据。 driver.getAppStrings(String language) 查找某一个语言环境对应的字符串文件Strings.xml内数据 sendKeyEvent(int key) 按下某个键,具体哪个键由key值决定,key值定义在AndroidKeyCode类中 sendKeyEvent(int key, Integer metastate) 按下某个键的同时按下附加键(Ctrl/Alt/Shift等),具体是哪些键,由key值(AndroidKeyCode类中定义)和metastate(AndroidKeyMetastate类中定义)决定。 currentActivity() 获取当前activity,比如(.ApiDemos) isAppInstalled(String bundleId) 根据bundleId来判断该应用是否已经安装  installApp(String appPath) 安装app,appPath为应用的本地路径 removeApp(String bundleId) 卸载app.bundleId在android中代表的是报名,而在iOS中有专门的bundleId号。 closeApp() 关闭应用,其实就是按home键把应用置于后台 launchApp() 启动应用 resetApp() 先closeApp然后在launchAPP pushFile(String remotePath, byte[] base64Data) 将字符数组用64位格式写到远程目录的某个文件中。也可以理解为把本地文件push到设备上。 pullFile(String remotePath) 将设备上的文件pull到本地硬盘上 pullFolder(String remotePath) 将设备上的文件夹pull到本地硬盘上,一般远程文件为/data/local/tmp下的文件。 setNetworkConnection(NetworkConnectionSetting connection) 设置手机的网络连接状态,可以开关蓝牙、wifi、数据流量。通过NetworkConnectionSetting中的属性来设置各个网络连接的状态。 getNetworkConnection() 得到当前网络的状态 openNotifications() 打开通知栏 runAppInBackground(int seconds) 与resetApp类似,区别是resetApp关闭后立即启动,而这个方法是关闭后等待seconds秒后再启动。 hideKeyboard() ios隐藏键盘 hideKeyboard(String strategy, String keyName) 隐藏键盘,只能用于ios上。 performTouchAction(TouchAction touchAction) 执行一个touch动作,该touch动作是由TouchAction封装的。 performMultiTouchAction(MultiTouchAction multiAction) 执行多步touch动作,由MultiTouchAction封装的多步操作。 tap(int fingers, WebElement element, int duration) 点击element控件中心点按下,duration*5毫秒秒后松开,如此重复fingers次。 tap(int fingers, int x, int y, int duration) 点击(x,y)点按下,duration*5毫秒后松开,如此重复fingers次。 swipe(int startx, int starty, int endx, int endy, int duration) 从(startx,starty)滑到(endx,endy),分duration步滑,每一步用时是5毫秒。 pinch(WebElement el) 2个手指操作控件,从对角线向中心点滑动。 pinch(int x, int y) 以(x,y)为基准,计算得出(x,y-100),(x,y+100)两个点,然后2个手指按住这两个点同时滑到(x,y) zoom(WebElement el) 与pinch(el)的动作刚好相反。两个手指由控件的中心点慢慢向控件的左顶点后右底点滑动。 zoom(int x, int y) 和pinch(x,y)相反。两个手指从(x,y)点开始向(x,y-100)和(x,y+100)滑动。 getNamedTextField(String name) 一般用在ios中。根据accessibility id获得控件对象。 endTestCoverage(String intent, String path) 结束测试覆盖率的检测。(没用过,不太了解)path为.ec文件的路径。 lockScreen(int seconds) 锁屏多少秒后解锁(使用的时候提示还没实现该方法) shake() 模拟摇晃手机(目前还没实现) scrollTo(String text) 滚动到某个text属性为指定的字符串的控件 scrollToExact(String text) 滚动到某个text属性包含传入的字符串的控件 context(String name) 设置上下文 getContextHandles() 可用上下文 getContext() 当前上下文 rotate(ScreenOrientation orientation) 设置屏幕横屏或者竖屏 getOrientation() 获取当前屏幕的方向 findElementByIosUIAutomation(String using) 利用ios中的uiautomation中的属性来获取控件 findElementsByIosUIAutomation(String using) 和上面一样,不过获得的是多个控件 findElementByAndroidUIAutomator(String using) 利用android的uiautoamtor中的属性来获取单个控件。 findElementsByAndroidUIAutomator(String using) 和上面一样,但是该方法获得是多个控件 findElementByAccessibilityId(String using) 利用accessibility id来获取单个控件 findElementsByAccessibilityId(String using) 利用accessibility id来获得多个控件



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值