【转】appium常用方法整理

1、相对坐标解锁九宫格

应用场景

QQ解锁屏幕如上,可见九个按键在同一个View下面,要实现解锁,用press   moveTo  release  perform方法

实现代码如下:

     WebElement jiugongge = pi.findByXpath("jiugongge");//获取九宫格所在的位置元素
        final TouchAction touchAction = new TouchAction(driver);
        // 元素的起始x和y坐标
        Point start = jiugongge.getLocation();
        int startX = start.x;
        int startY = start.y;
        System.out.println("startX : "+startX);
        System.out.println("startY : "+startY);
        // 元素的宽和高
        Dimension q = jiugongge.getSize();
        int width = q.getWidth();
        int hight = q.getHeight();
        System.out.println("width : "+width);
        System.out.println("hight : "+hight);
        //计算每个数字间隔的距离
        int jianjuX = width/3;
        int jianjuY = hight/3;
        System.out.println("jianjuX : "+jianjuX);
        System.out.println("jianjuY : "+jianjuY);
        // 计算出控件结束坐标
        int endX = width + startX;
        int endY = hight + startY;
        System.out.println("endX :"+endX);
        System.out.println("endY :"+endY);
        //1 的坐标
        int oneX = startX + jianjuX/2;
        int oneY = startY + jianjuY/2;
        System.out.println("oneX : "+oneX);
        System.out.println("oneY : "+oneY);

      int twoX = oneX + jianjuX;
      int twoY = oneY;
      int threeX = twoX + jianjuX;
      int threeY = oneY;

    //Z型  上下滑动时,x相对坐标为0,y的相对坐标为高度的jianju,相对坐标值为正数时向下you滑动,为负数时向上zuo滑动
        touchAction.press(oneX, oneY).waitAction(500).moveTo(jianjuX, 0).moveTo(jianjuX, 0).moveTo(-jianjuX, jianjuY).moveTo(-jianjuX, jianjuY).moveTo(jianjuX, 0).moveTo(jianjuX, 0).waitAction(500).release();
        touchAction.perform(); //运行会抛异常    

      //3-2-1-4-7-8-9   运行可以通过
      touchAction.press(threeX, threeY).waitAction(500).moveTo(-jianjuX, 0).moveTo(-jianjuX, 0)
      .moveTo(0, jianjuY).moveTo(0, jianjuY).moveTo(jianjuX, 0).moveTo(jianjuX, 0).waitAction(500).release();
      touchAction.perform();


基本思路:

1、找到元素所在位置;

2、求出第一个点的坐标;

3、找出平均移动的间距;

4、利用TouchAction 的press()  moveTo()等方法实现相对移动

解释:press(oneX, oneY)是按下时的坐标,moveTo()的坐标就是相对于按下的那个坐标而言

上下滑动时,x相对坐标为0,y的相对坐标为高度的jianju,相对坐标值为正数时向下右滑动,为负数时向上左滑动

moveTo方法的官方解释,移动是相对上一个点的坐标进行相对移动

/**
     * Move current touch to a new position relative to the current position on
     * the screen. If the current position of this TouchAction is (xOld, yOld),
     * then this method will move the TouchAction to (xOld + x, yOld + y).
     *
     * @param x change in x coordinate to move through.
     * @param y change in y coordinate to move through.
     * @return this TouchAction, for chaining.
     */
    public TouchAction moveTo(int x, int y) {
        ActionParameter action = new ActionParameter("moveTo");
        action.addParameter("x", x);
        action.addParameter("y", y);
        parameterBuilder.add(action);
        return this;
    }

备注:

这块解锁Z型的会有一个异常抛出,当然我还不知道怎么解决,但是大概知道了为什么会有这个异常,

我试了其他形状,只要不包括斜着移动就可以成功运行,有斜着移就会抛出异常

 2、在控件上进行上下左右滑动

应用场景:

在第一个聊天的控件上进行左滑删除操作

实现代码如下:

/**
     * 根据控件定位
     * 在控件内上下左右滑动
     * @param element      控件定位方式
     * @param heading 滑动方向 UP  DOWN
     */
    public void swipeControl(WebElement element, Heading heading) {

        // 获取控件位置的坐标轴
        Point start = element.getLocation();
        int startX = start.x;
        int startY = start.y;
        // 获取控件坐标轴差
        Dimension q = element.getSize();
        int x = q.getWidth();
        int y = q.getHeight();
        // 计算出控件结束坐标
        int endX = x + startX;
        int endY = y + startY;
        // 计算中间点坐标
        int centreX = (endX + startX) / 2;
        int centreY = (endY + startY) / 2;
        switch (heading) {
            // 向you滑动
            case RIGHT:
                driver.swipe(endX - 10, endY, centreX, endY, 500);
                break;
            // 向zuo滑动
            case LEFT:
                driver.swipe(endX- 10,endY , centreX , endY -5, 1000);
                break;
            //向上滑动
            case UP:
                driver.swipe(endX,endY + 5,centreX,centreY,1000);
                break;
            //向下滑动
            case DOWN:
                driver.swipe(endX,endY - 5,centreX,centreY,1000);
                break;
        }

    }

/**
     * 控制滑动方向
     */
    public enum Heading {
        RIGHT, LEFT,
        UP, DOWN
    }


 基本思路:

1、找到要滑动的元素;

2、得到元素的起始位置;

3、利用swipe(startx,starty,endx,endy,time)函数进行滑动,time为滑动的时间,毫秒为单位

解释:在滑动的坐标可以根据自己需要的进行控制

3、清楚控件的值

应用场景:密码框获取不到值,直接用appium自带的clear函数不能清除干净

亲测,QQ的密码框的值用clear函数有时候不能清除干净

实现代码如下:

/**
     * 一个一个删除edittext控件里的值
     * @author lu
     * @param driver
     * @param text
     */
    public void clearText(String text ,int second) {
        driver.pressKeyCode(123);//123:光标移动到输入框最右边
        if(text.length()!=0)
            driver.pressKeyCode(67);//67删除
        CommonUtils.sleep(second);
    }

 4、截图操作

public static void snapshot(AndroidDriver driver, String filename) {
//        CommonUtils.sleep(2);
        boolean ret = ViewUtils.waitForWebViewInit(driver,"WEBVIEW_com.eshare.Purse");
        if (ret) {
            driver.context("NATIVE_APP");
        }
        String currentPath = System.getProperty("user.dir"); // get current work
            // folder
        File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        try {
            System.out.println("save snapshot path is:" + currentPath + "/screen/" + filename);
            FileUtils.copyFile(scrFile, new File(currentPath + "\\screen\\" + filename));
        } catch (IOException e) {
            System.out.println("Can‘t save screenshot");
            e.printStackTrace();
        } finally {
            ret = false;
            if (!ret) {
                driver.context("WEBVIEW");
            }
            System.out.println("screen shot finished, it‘s in " + currentPath + " folder");
            CommonUtils.sleep(2);
        }

代码如上

对于混合型APP(NATIVE_APP,WEBVIEW混合)

由代码可见,我在截图之前,先判断了当前是原生页面还是webview页面,操作之后又将其还原为WEBVIEW模式

这是因为,截图这个操作在webview模式下会提示一个异常错误

所以在截图前,先将其转换为NATIVE_APP模式。

5、判断页面是否存在某个元素

public boolean isElementExist(String xpath ){
        try{
            driver.findElement(By.xpath(xpath));
            return  true;
        }catch(org.openqa.selenium.NoSuchElementException ex){
            return false;
        }
    }

我之前有用过isDisplay()函数,但是这个函数只是判断元素是否显示,它使用的前提是元素存在

对于不存在元素,要判断其是否存在,见如上代码。

原文地址:https://www.cnblogs.com/yoyo008/p/9498110.html

时间: 2024-11-06 11:30:50

【转】appium常用方法整理的相关文章

Objective-C 几何类常用方法整理

Objective-C  几何类常用方法整理 CGGeometry参考定义几何结构和功能,操作简单.数据结构中的一个点CGPoint代表在一个二维坐标系统.数据结构的位置和尺寸CGRect代表的一个长方形.数据结构的尺寸CGSize代表宽度和高度. 1.创建一个几何原始数值    CGPoint  CGPointMake(CGPoint A,CGPoint B) 返回一个指定坐标点 CGRect   CGRectMake(CGFloat x,CGFloat y,CGFloat width,CGF

APPIUM API整理(python)---元素查找

最近在学习自动化框架appium,网上找一些API相关资料整理了一下 1.find_element_by_id find_element_by_id(self, id_): Finds element within this element's children by ID(通过元素的ID定位元素) :Args: - id_ - ID of child element to locate. 用法 driver. find_element_by_id("id") find_element

python:os模块常用方法整理

在日常python编程中,经常需要对大量文件和大量路径进行操作,这就依赖于os模块,下面是我对os模块常用方法的整理. 1. 获取当前路径及路径下的文件 (1)os.getcwd():查看当前所在路径 >>> os.getcwd() 'C:\\Users\\f1237928\\Desktop' (2)os.listdir(path):列出制定路径下的所有文件及文件夹,不传参时path为当前路径,返回值为列表类型 >>> os.listdir() ['desktop.in

js Array对象和String对象常用方法整理

我们总是频繁的对数组和字符串进行操作,今天整理一下这些常用的方法.复习的时候写一写 不然会忘掉一些小细节==. 一,String对象 1.跟位置有关的 charAt()  返回在指定位置的字符 charAtCodeAt()   方法可返回指定位置的字符的 Unicode 编码 indexOf()  从头检索字符串 lastIndexOf()  从后向前检索字符串 2.根据索引提取制定的字符串 slice()  提取字符串的片断,并在新的字符串中返回被提取的部分.  stringObjec.sli

七 Appium常用方法介绍

文本转自:http://www.cnblogs.com/sundalian/p/5629609.html 由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如在处理webview页面,完全可以使用webdriver中的方法.当然在原生应用中,也可以使用. 1.元素相关方法 1.1点击操作 WebElement button = driver.findElement(By.id("login")); 或者 WebElement button =

APPIUM API整理(python)---操作类

APPIUM 常用API介绍(1) 前言:android手机大家都很熟悉,操作有按键.触摸.点击.滑动等,各种操作方法可以通过api的方法来实现.参考博文:http://blog.csdn.net/bear_w/article/details/50330565 1.click click(self):Clicks the element(点击元素 )用法 element.click() driver.find_element_by_id('com.huawei.camera:id/shutter

APPIUM API整理(python)---其他辅助类

App运行类 1.current_activity current_activity(self): Retrieves the current activity on the device. 获取当前的activity 用法 print(driver.current_activity()) 2. start_activity start_activity(self, app_package, app_activity, **opts): Opens an arbitrary activity d

八 Appium常用方法介绍

由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如在处理webview页面,完全可以使用webdriver中的方法.当然在原生应用中,也可以使用. 1.元素相关方法 1.1点击操作 WebElement button = driver.findElement(By.id(“login”)); 或者 WebElement button = driver.findElementById(“login”) //然后执行点击操作 button.click();

Redis数据类型及常用方法整理

Redis有五种数据类型,具体如下: 通用常用方法: keys pattern #查找key,可以使用*和?进行搜索. del key #删除key. 1.string 类型 (key : value(string/int/float)) 常用方法: set key value #赋值 get key #获取 incr key [int] #自增操作 decrby key [int] #自减操作 2.list 类型 有序列表 (key:(value1,value2,value3,,,,,valu