appium常见问题

appium常见问题

APP每次启动都会初始化

启动APP时设置DesiredCapabilities属性:noRest

public class Driver {
    private static AndroidDriver driver;
    public static void start(){
        DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
        desiredCapabilities.setCapability("deviceName", "926QADV72277E");
        //desiredCapabilities.setCapability("deviceName", "192.168.71.101:5555");
        //desiredCapabilities.setCapability("deviceName", "192.168.242.105:5555");
        desiredCapabilities.setCapability("platformName", "Android");
        desiredCapabilities.setCapability("appPackage", "com.DaTong.InsuranceForAndroid");
        desiredCapabilities.setCapability("appActivity", ".StartActivity");
        //noRest:不重置,true、false
        desiredCapabilities.setCapability("noReset", true);

        URL remoteUrl = null;
        try {
            remoteUrl = new URL("http://localhost:4723/wd/hub");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

}

启动app自动授权

启动APP时设置DesiredCapabilities属性:autoGrantPermissions

安卓解决方法:

public class Driver {
    private static AndroidDriver driver;
    public static void start(){
        DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
        desiredCapabilities.setCapability("deviceName", "926QADV72277E");
        //desiredCapabilities.setCapability("deviceName", "192.168.71.101:5555");
        //desiredCapabilities.setCapability("deviceName", "192.168.242.105:5555");
        desiredCapabilities.setCapability("platformName", "Android");
        desiredCapabilities.setCapability("appPackage", "com.DaTong.InsuranceForAndroid");
        desiredCapabilities.setCapability("appActivity", ".StartActivity");
        //autoGrantPermissions:自动检查需要哪些权限并给予,当设置属性noRest为true时不起作用,值:true、false
        desiredCapabilities.setCapability("autoGrantPermissions", true);

        URL remoteUrl = null;
        try {
            remoteUrl = new URL("http://localhost:4723/wd/hub");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

}

无法根据id、text完成定位时的定位方法

  • 根据属性,

    • 例如查找密码输入框:根据密码属性框
    By passwordlogin=By.xpath("//*[@password='true']");
    
    • 例如输入一定字数后可点击:根据是否可点击
    By passwordlogin=By.xpath("//*[@clickable='true']");
    
    • 例如输入一定字数后可使用:根据是否可使用
    By passwordlogin=By.xpath("//*[@enable='true']");
    
  • 根据文字模糊匹配

    By search_wamgxiao = locate("//div[contains(text(),'网销')]");
    
  • 多属性定位

    By searchall = locate("//div[@class='swiper-slide swiper-slide-active']//div[@class='new-product-block border-bottom-line-gray'][not(contains(@style,'display: none;'))]/div[@class='title']");
    
    • 当使用多个属性时:
    By.xapth("/div[@class='inter'][@name='dsw']")
    

获取元素属性

使用getAttribute()获取:

Driver.getCurrentDriver().findElement(By.xpath("//*[@text='123']")).getAttribute("id");

当页面布局根据内容变更时,怎么定位元素

  • 循环打印元素位置:getlocation,直至不变更后再使用该元素

等待

  • 隐式等待:
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
  • 显示等待:
WebDriverWait wait = new WebDriverWait(Driver.getCurrentDriver(),10);
       wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@text='咨询']"))).click();

横竖屏切换、后退

//切换横屏
static void change_transverse(){Driver.getCurrentDriver().rotate(ScreenOrientation.LANDSCAPE);}
//切换竖屏
static void change_vertical(){Driver.getCurrentDriver().rotate(ScreenOrientation.PORTRAIT);}
//后退
Driver.getCurrentDriver().navigate().back();

xpath定位方法简介

//相对定位,1、全部元素
xpath='//*'
//2、指定属性内容
xpath="//*[@text='任务中心']"
//3、包含属性内容,查找class属性中包含image的APP控件
xpath="//*[contains(@class,'image')]"
//4、多条件同时满足筛选控件
xpath="//*[contains(@class,'image') and contains(@enable,'ture') ]"
//5、多条件,其中一条满足筛选控件
xpath="//*[contains(@class,'image') or contains(@enable,'ture') ]"
//6、ancestor,父类条件筛选
//查找class属性中包含image的APP控件且父辈为可见的
xpath="//*[contains(@class,'image')]/ancestor::*// [contains(@enable,'ture') ]"
//7、运算:选取价格高于 35 的所有 price 节点
xpath="/bookstore/book[price>35]/price"

截图

static void screen(String name) throws IOException {
        FileUtils.copyFile(Driver.getCurrentDriver().getScreenshotAs(OutputType.FILE).getCanonicalFile() , new File(name+".png"));
    }

定位toast

  • 需要使用UiAutomator2
  • pagesoure内是没有的
String massageFail = "//*[@class='android.widget.Toast']";
find_toast(massageFail).getText();


static WebElement find_toast(String locator){
        //获取toast提示框
        return new WebDriverWait(Driver.getCurrentDriver(), 30).until(new ExpectedCondition<WebElement>() {
            public WebElement apply(WebDriver driver) {
                return driver.findElement(locate(locator));
            }
        });
    }

appium运行原理

详细解析:

打印appium log

  • appium –g-timestamp 终端打印log时 打印时间戳
  • appium –g-timestamp appium.log 打印到本地

查看更多详细问题(嗅探、转发)

  • 嗅探:tcpdump

    • sudo tcodump -i any port 4723-4724 -w /temp/tcp.dump
  • 转发:em-proxy、nc

    • gem install em-proxy
    • em-proxy -l 5723 -r 127.0.0.1:4723 -v
  • 以上仅是mac方法,windows直接使用tcpdump.

webview测试方法

  • 混合的页面借助原生方法直接使用
Driver.getCurrentDriver().findElementsByAccessibilityId("立即开始").click();

手势操作

  • press
press按下:某一点或某一元素:坐标: (x=500,y=500) 
TouchAction(driver).press(x=500,y=500).perform();
press(x=500,y=500).release();//相当于一次tap(): 
TouchAction(driver).press(x=500,y=500).release().perform();
press(x=500,y=500).wait(5000).release();//相当于一次长按:
TouchAction(driver).press(x=500,y=500).wait(5000).release().perform();
  • moveTo
//移动
ta.press(PointOption.point(a)).moveTo(PointOption.point(b)).release().perform();
  • release
//松开press
  • perform
//每个动作需要这个函数才能执行
  • tap wait
//轻敲
ele=driver.find_element_by_id("android:id/title");
TouchAction(driver).tap(ele).perform();
  • longPress
//长按
long_press(element,x,y,duration); 
TouchAction(driver).long_press(x=500,y=500).perform();
  • cancel
//取消
TouchAction(driver).cancel();
  • 多点触控:
action0 = TouchAction().tap(el);
action1 = TouchAction().tap(el);
MultiAction().add(action0).add(action1).perform();

处理随时弹窗

  • 改造UIautomatior2.server支持事件监听
  • 封装查找空间方法,增加错误处理
    static WebElement find(By locator){
    //查找元素功能
        try {
            return Driver.getCurrentDriver().findElement(locator);
        }catch (Exception e){
            //这里是处理可能出现的弹窗,所有的弹框
            Driver.getCurrentDriver().findElement(locate_text("我知道了")).click();
            return Driver.getCurrentDriver().findElement(locator);
        }
    }
posted @ 2021-07-07 23:25  77的小白  阅读(189)  评论(0)    收藏  举报