Appium學習(二)--工具介紹疏咐、服務關鍵字、元素定位

一脐供、使用Android工具查找包名和activity

以下有三種查看應用包名package和入口activity名稱的方法:
方法一:使用aapt //aapt是sdk自帶的一個工具浑塞,在sdk\builds-tools\目錄下
1.以ES文件瀏覽器為例,命令行中切換到aapt.exe目錄執(zhí)行:aapt dump badging E:\apk\es3.apk | findstr "package launchable-activity"
2.運行后的結(jié)果中以下兩行分別是應用包名package和入口activity名稱
package: name=’com.estrongs.android.pop’
launchable-activity: name=’com.estrongs.android.pop.view.FileExplorerActivity’
注:在android sdk目錄搜索可以找到aapt.exe政己,如果沒有可以下載apktool酌壕。

查看當前的activity:
adb shell dumpsys window windows|findstr “mCurrentFocus”


image.png

方法二:查看AndroidManifest.xml
1.使用apktool反編譯app:apktool.bat d es3.apk E:\apk\es
2.打開AndroidManifest.xml
manifest節(jié)點的package屬性值是應用的包名:<manifest package=”com.estrongs.android.pop”>
查找android.intent.action.MAIN和android.intent.category.LAUNCHER對應的activity,該activity對應的android:name屬性既是入口activity名稱歇由,如下:
<activity android:theme=”@*android tyle/Theme.NoTitleBar” android:label=”@string/app_name” android:name=”com.estrongs.android.pop.view.FileExplorerActivity”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
android.intent.action.MAIN決定應用程序最先啟動的Activity
android.intent.category.LAUNCHER決定應用程序是否顯示在程序列表里

方法三:通過hierarchyviewer.bat查看包名和activity
比如在設備上打開一個計算器卵牍,然后進入adt目錄的sdk\tools中打開hierarchyviewer.bat
D:\adt-bundle-windows-x86_64-20140702\sdk\tools\hierarchyviewer.bat
就能看到包名和activity

image.png

注:也可以問Android開發(fā)包名和activity,執(zhí)行appium自動化測試安裝app時在appium圖形化視圖中看日志也可以查看到包名和activity沦泌。

二糊昙、使用Android工具查找元素

進入sdk\tools\uiautomatorview.bat 打開這個工具


image.png

monitor.bat和hierarchyviewer.bat工具也能查看元素,只能看到元素的坐標赦肃,沒有uiautomatorview.bat好用溅蛉。

三、擴展學習adb命令

參考:http://www.reibang.com/p/fb4462919015

四他宛、appium服務關鍵字

1.deviceName
手機設備的名字或者模擬器名字(雖然是必須項船侧,但在安卓平臺上這個值寫啥都行,不影響腳本)
2.app
App(.ipa/.apk)安裝文件所在路徑厅各,本地路徑或者遠程路徑镜撩,或者是一個包含app安裝文件的.zip文件。Appium將先嘗試安裝應用到設備上队塘。注意袁梗,如果在安卓上你指定了應用的appPackage和appActivity那么app這個參數(shù)就不是必須的。這個參數(shù)與browserName沖突,例如:/abs/path/to/my.apk or http://myapp.com/app.ipa
3.browserName
手機web自動化的瀏覽器的名字憔古。如果是做一個app的自動化這個參數(shù)值為空(但是實際上這個參數(shù)直接不寫就可以了)
例如:'Safari' for iOS and 'Chrome', 'Chromium', or 'Browser' for Android
4.newCommandTimeout
等待新命令超時時間遮怜,單位是秒,默認是60秒鸿市。當appium服務在指定的超時時間內(nèi)未接收到任何來自客戶端的指令锯梁,appium服務端與客戶端會主動斷開鏈接
一般可以設置時間為600秒,即10分鐘焰情,這樣不影響自動化在執(zhí)行過程中等待元素的加載陌凳。
5.autoLaunch
設置appiun啟動后是否自動安裝和啟動app應用。默認值是true(當這個值是true時内舟,代碼里則不能使用driver.launchApp方法)
6.udid
鏈接物理指定設備的唯一標識(安卓上就是通過adb devices看到的設備名稱)
7.noReset
不重置應用數(shù)據(jù)合敦,默認是false
8.fullReset
(iOS) 刪除整個虛擬目錄,(Android) 通過卸載app來重置應用默認是false
9.appActivity
應用的起始啟動
10.appPackage
應用的包名(當以安裝模式執(zhí)行腳本的時候验游,appPackage和appActivity可以不寫)
11.appWaitActivity
啟動后等待的activity
12.deviceReadyTimeout
等待設備連接正常的超時時間
13.unicodeKeyboard
使用Unicode input輸入法, true
14.resetKeyboard
在運行了unicodeKeyboard完成測試后將輸入法重置為原有狀態(tài)充岛,如果單獨使用該參數(shù)將被忽略保檐,true(該參數(shù)好像沒用,測試前需要把Android的輸入法改成appium Android input manager for unicode裸准,測試時才可以輸入中文展东。如果測試前沒有修改為這個輸入法赔硫,測試時中文輸入會失敵淳恪)
15.noSign
在uiautomator模式下跳過檢查和應用的重簽名, true

在Androidsetting方法中會用到上面講到的關鍵字,代碼如下:

public void AndroidSettings() throws MalformedURLException {
        //獲取當前根目錄下的文件爪膊,當前根目錄就是D:\Springboot\AppiumTest
        File classpathRoot = new File(System.getProperty("user.dir"));
        //獲取apps目錄下的文件
        File appDir = new File(classpathRoot, "/apps");
        //需要提前把該apk放到apps文件夾下
        File app = new File(appDir, "meituan-9.12.801.apk");

        //創(chuàng)建設備屬性對象
        DesiredCapabilities capabilities = new DesiredCapabilities();
        //設置設備系統(tǒng)為Android
        capabilities.setCapability("platformName", "Android");
        //設置設備名稱為edaed87d权悟,可以通過usb連接手機,在cmd中輸入命令推盛,adb devices 看到設備名稱
        // (這個名稱寫什么都行峦阁,通常情況下測試時只會連一臺設備,appium會直接去連耘成,如果有多臺用udid參數(shù)指定設備號)
        capabilities.setCapability("deviceName","edaed87d");
        //udid指定設備信息榔昔,如果有多臺設備這個值會有用
//        capabilities.setCapability("udid","edaed87d");
        //設置設備安卓系統(tǒng),可以在手機的設置中查看系統(tǒng)號
        capabilities.setCapability("platformVersion", "6.0.1");

        //獲取app的絕對路徑
//        capabilities.setCapability("app", app.getAbsolutePath());
        //設置app的包名瘪菌,在cmd中進入aapt.exe的目錄輸入命令aapt dump badging E:\apk\es3.apk | findstr "package launchable-activity" 查看包名和activity
        capabilities.setCapability("appPackage", "com.sankuai.meituan");
        //設置app的入口activity
        capabilities.setCapability("appActivity", "com.meituan.android.pt.homepage.activity.MainActivity");
        //設置每次運行不清空app的數(shù)據(jù)
        capabilities.setCapability("noReset","true");
//        //設置每次運行不重簽名app
//        capabilities.setCapability("noSign","true");
        //設置超時時間,超過10分鐘撒会,客戶端與服務器斷開鏈接
//        capabilities.setCapability("newCommandTimeout",600);
        //在Android4.2版本以下需要指定這個Selendroid
//        capabilities.setCapability("automationName","Selendroid");


        //使用Unicode編碼方式發(fā)送字符串
        capabilities.setCapability("unicodeKeyboard","True");
        //恢復鍵盤輸入法,也可以說是隱藏鍵盤(要輸入中文师妙,需要先把手機上的輸入法調(diào)整成appium android input manager for unicode)
        //如果需要把鍵盤調(diào)出來只能手工的去改輸入法
        capabilities.setCapability("resetKeyboard","True");

        //設置測試機與idea的通訊協(xié)議
        driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        System.out.println("App is launched!");
}

五诵肛、定位

5.1 Xpath定位:
Xpath定位中都是用classname定位的。

        WebElement element = driver.findElement(By.xpath("http://android.support.v7.widget.RecyclerView/child::android.view.ViewGroup[1]/android.widget.FrameLayout"));
        element.click();
image.png

要定位到紅框里的元素默穴,首先找到它的父級目錄怔檩,父級目錄的classname是android.support.v7.widget.RecyclerView
紅框里的元素的classname是android.view.ViewGroup,他是第1個元素蓄诽,所以
寫android.view.ViewGroup[1]薛训,如果是最后一個就可以寫[last()],如果要定位倒數(shù)第2個就寫[last()-1]


image.png

android.view.ViewGroup[1]下面還有元素仑氛,我們要定位到以上圖中的紅框的元素乙埃,找到該元素的classname是android.widget.FrameLayout

該xpath中用到一個child:: 就是存在一個父級和子級的關系:
driver.findElement(By.xpath("http://android.support.v7.widget.RecyclerView/child::android.view.ViewGroup[1]/android.widget.FrameLayout"));

如果父級跟目錄下有多個級別元素,可以通過descendant:: 定位子孫元素:


image.png

通過父級去找:

        driver.findElement(By.xpath("http://android.widget.FrameLayout{contains(@resource-id,'tv.danmaku.bili:id/cover_layout')}/parent::android.view.ViewGroup/fowlling:sibling::android.view.ViewGroup[2]/android.widget.FrameLayout/android.widget.ImageView")).click();

通過parent找到上一級调衰,然后再找同一目錄下的其他元素膊爪。

一般通過定位classname和id就能定位到元素,Xpath會有點繁瑣嚎莉,用findElementbyId和findElementbyClassname實現(xiàn)上面的定位
代碼如下:

        //找到第一個元素點擊,默認是第一個元素
//        driver.findElement(By.id("tv.danmaku.bili:id/cover")).click();
        //找到第二個元素點擊米酬,因為id都一樣,所有通過list來接收趋箩,通過elements.get(1).click();點擊第二個元素
        List<AndroidElement> elements = driver.findElementsById("tv.danmaku.bili:id/cover");
        elements.get(1).click();
        //點擊屏幕
        driver.findElementById("tv.danmaku.bili:id/video_view_biliplayer").click();
        //點擊右上角返回鍵
        driver.findElementByClassName("android.widget.ImageButton").click();

以上代碼要定位到第二個視頻赃额,打開后再返回


image.png

xpath內(nèi)容補充:
一加派、XPath

from lxml import etree

html = etree.parse('html源代碼',etree.HTMLPaser())

1.節(jié)點的獲取

a.html.xpath('//*') #匹配HTML中的所有節(jié)點

b.html.xapth('//li') #匹配所有的li節(jié)點

c.// 獲取所有的子孫節(jié)點 ‘/’ 獲取子節(jié)點(區(qū)別好 '//' 與 '/')

d.html.xapth('//li[@class='item-0']') #根據(jù)屬性匹配

e.html.xapth('//li[contains(@class,'li')]) #屬性多值匹配 contains()方法,第一個參數(shù)傳入屬性名稱,第二個參數(shù)傳入屬性值跳芳,只要此屬性包含所傳入的屬性值就可以完成匹配

f.多屬性匹配 .html.xapth('//li[contains(@class,'li') and @name='item'])

g.按順序選擇 html.xapth('//li[last()]') 最后一個li節(jié)點

html.xapth('//li[position()<3]') 位置小于3的li節(jié)點

html.xapth('//li[1]') 選擇第一個li節(jié)點

h.節(jié)點軸選擇 html.xapth('//li/child::') 直接子節(jié)點

html.xapth('//li/ancestor::') 所有祖先節(jié)點

html.xapth('//li'/attribute::) 獲取所有的屬性值

html.xapth('//li/decendant::') 獲取所有的子孫節(jié)點

2.屬性芍锦,文本獲取

(1).文本獲取

html.xapth('//li/text()')

(2).屬性獲取

html.xapth('//li/@class') #獲取li標簽的class的屬性值

5.2 滑動操作

image.png

Appium處理滑動方法是swipe

滑動API:Swipe(int start x,int start y,int end x,int y,duration)
解釋:
int start x-開始滑動的x坐標;
int start y -開始滑動的y坐標 飞盆;
int end x -結(jié)束點x坐標娄琉;
int end y -結(jié)束點y坐標;
duration 滑動時間(默認5毫秒)吓歇。

屏幕左上角為起點孽水,坐標為(0,0),起點往右為Y軸城看,起點以下為X軸
微信來說女气,登錄按鈕起點和終點坐標分別為(63,1716)和(432测柠,1860)


image.png

封裝的代碼:

package com.yin.Appiumdemo;

import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.WebElement;

public class SwipeCenter {

    /*
    方法參數(shù)介紹:
    driver(就是把appiumdriver對象傳進來)
    during(這里是填寫毫秒數(shù)炼鞠,這里的 毫秒數(shù)越小 滑動的速度越快~ 一般設定在500~1000,如果你想快速滑動 那就可以設置的更加泻湫病)
    num(是只滑動的次數(shù)谒主,如相冊多張圖片翻頁測試什么的滑動或者滑動到列表底部。就直接輸入次數(shù)就行了)
     */

    //上滑 swipeToUp
    public static void swipeToUp(AppiumDriver driver,int during,int num) throws InterruptedException {
        //先獲取屏幕的分辨率
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        Thread.sleep(2000);
        for (int i=0;i<num;i++){
            driver.swipe(width/2,height*3/4,width/2,height/4,during);
            Thread.sleep(2000);
        }

    }
    //下拉 swipeToDown
    public static void swipeToDown(AppiumDriver<WebElement> driver,int during,int num) throws InterruptedException {
        //先獲取屏幕的分辨率
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        //等待2秒
        Thread.sleep(2000);
        for (int i=0;i<num;i++){
            driver.swipe(width/2,height/4,width/2,height*3/4,during);
            //等待2秒
            Thread.sleep(2000);
        }

    }
    //向左滑動 swipeToLeft
    public static void swipeToLeft(AppiumDriver<WebElement> driver,int during,int num) throws InterruptedException {
        //先獲取屏幕的分辨率
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        //等待2秒
        Thread.sleep(2000);
        for (int i=0;i<num;i++){
            driver.swipe(width*3/4,height/2,width/4,height/2,during);
            //等待2秒查看界面變動
            Thread.sleep(2000);
        }

    }
    //向右滑動 swipeToRight
    public static void swipeToRight(AppiumDriver<WebElement> driver,int during,int num) throws InterruptedException {
        //先獲取屏幕的分辨率
        int width = driver.manage().window().getSize().width;
        int height = driver.manage().window().getSize().height;
        //等待2秒
        Thread.sleep(2000);
        for (int i=0;i<num;i++){
            driver.swipe(width/4,height/2,width*3/4,height/2,during);
            //等待2秒查看界面變動
            Thread.sleep(2000);
        }

    }

}

調(diào)用的代碼:

    @Test(description = "滑動操作")
    public void testswip() throws InterruptedException {

        //調(diào)取SwipeCenter類中的方法软吐,實現(xiàn)向上瘩将、向下、向左凹耙、向右滑動
        //向上滑動
        SwipeCenter.swipeToUp(driver,500,2);
        //向下滑動
        SwipeCenter.swipeToDown(driver,500,1);
        //向左滑動
        SwipeCenter.swipeToLeft(driver,500,1);
        //向右滑動
        SwipeCenter.swipeToRight(driver,500,1);
}

還可以利用try姿现、catch,先去找元素肖抱,找不到滑動頁面再找

        WebElement element = null;
        try {
            //先去找元素
            element = driver.findElementByName("百萬播放");
        }catch(Exception e){
            e.printStackTrace();
            //找不到向左滑動
            SwipeCenter.swipeToLeft(driver,500,1);
            element = driver.findElementByName("百萬播放");
            //找到后再點擊click
            element.click();
        }

5.3 location坐標定位

    @Test(description = "location坐標定位")
    public void testlocation() throws InterruptedException {
        //tap模擬手指點擊
        //先等待2秒备典,等待元素出來
        Thread.sleep(2000);
        //使用tap方法,第一個參數(shù)是模擬一個手指去點意述,第二個參數(shù)是X點提佣,第三個是y點,第四個是持續(xù)點擊0.5秒
        //通過Ui Automator viewer定位看到坐標點是[846,362][1080,482]荤崇,取X值在846~1080之間拌屏,取Y值在362~482之間
        driver.tap(1,900,420,500);
        Thread.sleep(2000);
        System.out.println("坐標定位成功");
    }
image.png

5.4 混合應用定位獲取webview頁面的元素
混合應用就是在app中嵌套了H5的頁面,H5頁面的元素是webview的术荤。
步驟都在代碼中有些注釋:

    @Test(description = "獲取webview頁面元素")
    public void testwebview(){

        //獲取driver中的handles倚喂,利用foreach循環(huán)查找如果是webview的頁面就進入webview頁面,轉(zhuǎn)換成html在瀏覽器中打開再去定位到某個元素
        //定位成功之后再轉(zhuǎn)回到NATIVE_APP 頁面
        Set<String> contextset = driver.getContextHandles();
        for (String context : contextset ){
            System.out.println("頁面上context是:"+context);


            if (context.toLowerCase().contains("webview")){
                driver.context(context);//進入webview頁面
                System.out.println("進入成功");
                break;
            }
        }
        //通過封裝的方法把webview源碼轉(zhuǎn)換成html瓣戚,然后在瀏覽器中打開去定位到元素
        //封裝的方法還沒有實現(xiàn)端圈,如果找到webview頁面焦读,獲取到源碼使用chrome-development tool 來定位元素
        //使用步驟參考:https://blog.csdn.net/wanglin_lin/article/details/77100028
//        PageResourceGetter.initialize("uers/dir/prg.html",driver.getPageSource());
        //定位到元素
       driver.findElement(By.id("username")).sendKeys("appium.test@gmail.com");
       //再回到原生app
        driver.switchTo().window("NATIVE_APP");

    }

參考地址:https://blog.csdn.net/wanglin_lin/article/details/77100028
一般情況下通過Ui Automator viewer也可以看到webview中的控件,如果看不到就把driver.getPageSource()的內(nèi)容打印出來舱权,然后分析里面的控件再定位也可以矗晃。

appium的api

image.png

手機坐標、首頁導航滑動前面已經(jīng)講過宴倍,省略张症。

5.5 截屏操作
先創(chuàng)建一個截屏類:

package com.yin.Appiumdemo;
/*
截圖操作
 */

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Screenshot {
    public static void Screenshot(AppiumDriver driver, String ScreenName) throws IOException {
        //設置時間格式,截圖的文件要加上時間戳這樣不會重復
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
        //生成時間戳
        String dataString = simpleDateFormat.format(new Date());
        //設置存放圖片目錄
        String dir_name = System.getProperty("user.dir")+"\\異常圖片";
        System.out.println("異常圖片目錄:"+dir_name);
        //防止出現(xiàn)圖片目錄被刪除啊楚,所以先判斷目錄是否存在吠冤,如果不存在就新建一個目錄
        if (!(new File(dir_name).isDirectory())){
            //如果不存在就創(chuàng)建一個目錄
            new File(dir_name).mkdir();
        }
        //調(diào)用方法獲取頁面截屏
        File screenfile = driver.getScreenshotAs(OutputType.FILE);
        //復制圖片到指定目錄,放到dir_name目錄下,命名是時間戳+測試用例名稱
        FileUtils.copyFile(screenfile,new File(dir_name+"\\"+dataString+ScreenName+".jpg"));
        //打印圖片名稱,
        System.out.println("異常圖片名稱:"+dir_name+"\\"+dataString+ScreenName+".jpg");

    }
}

在測試方法中調(diào)用:

    @Test(description = "截屏")
    public void testscreenshot() throws InterruptedException, IOException {
        //正常請求的截圖
        Thread.sleep(1000);
        Screenshot.Screenshot(driver,"test001");
        Thread.sleep(1000);

        //異常的截圖放到catch中
        try{
            driver.findElementByName("百萬播放");
        }catch (Exception e){
            Screenshot.Screenshot(driver,"test001");
        }


    }

生成目錄時可能會遇到目錄出現(xiàn)亂碼的情況恭理,進入idea的設置中找到File Encoding 都設置成UTF-8,然后再執(zhí)行測試類就可以了


image.png

5.6 元素之間的滑動

image.png

image.png

image.png
image.png

控件的滑動可以用兩種方式實現(xiàn)郭变,第一種是TouchAction颜价,第二種是swipe
封裝的方法如下:

package com.yin.Appiumdemo;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.TouchAction;
import org.openqa.selenium.WebElement;

/*
封裝方法,實現(xiàn)控件的滑動
 */
public class ElementHua {
    //利用TouchAction 拖動控件
    public static void Element_HuaWithTouchAction(AppiumDriver driver,WebElement element, String swipeway) throws InterruptedException {
        //先獲取控件的起點x坐標值
        int xStartPoint = element.getLocation().getX();
        //獲取控件的寬度,計算出控件的x終點坐標值
        int xEndPoint = xStartPoint+element.getSize().getWidth();
        //獲取控件的Y起點坐標值
        int yStartPoint = element.getLocation().getY();
        System.out.println("X起點坐標是"+xStartPoint);
        System.out.println("X終點坐標是"+xEndPoint);
        System.out.println("Y起點坐標是"+yStartPoint);

        //利用TouchAction類實現(xiàn)拖動
        TouchAction action = new TouchAction(driver);

        if (swipeway.equals("左滑")){
            Thread.sleep(1000);
            //可以根據(jù)控件的寬度調(diào)整滑動多寬诉濒,可以調(diào)整20為30周伦、40等等,以下方法類似
            action.press(xEndPoint-20,yStartPoint+20).waitAction(1000).moveTo(xStartPoint,yStartPoint+20).release().perform();
            Thread.sleep(1000);

        }
        if (swipeway.equals("右滑")){
            Thread.sleep(1000);
            action.press(xStartPoint+20,yStartPoint+20).waitAction(1000).moveTo(xEndPoint,yStartPoint+20).release().perform();
            Thread.sleep(1000);
        }

    }
    //利用滑動 滑動控件
    public static void Element_HuaWithSwipe(AppiumDriver driver,WebElement element, String swipeway) throws InterruptedException {
        //先獲取控件的起點x坐標值
        int xStartPoint = element.getLocation().getX();
        //獲取控件的寬度,計算出控件的x終點坐標值
        int xEndPoint = xStartPoint+element.getSize().getWidth();
        //獲取控件的Y起點坐標值
        int yStartPoint = element.getLocation().getY();
        System.out.println("X起點坐標是"+xStartPoint);
        System.out.println("X終點坐標是"+xEndPoint);
        System.out.println("Y起點坐標是"+yStartPoint);


        if (swipeway.equals("左滑")){
            Thread.sleep(1000);
            driver.swipe(xEndPoint-20,yStartPoint+20,xStartPoint+10,yStartPoint+20,500);
            Thread.sleep(1000);

        }
        if (swipeway.equals("右滑")){
            Thread.sleep(1000);
            driver.swipe(xStartPoint+10,yStartPoint+20,xEndPoint-20,yStartPoint+20,500);
            Thread.sleep(1000);
        }

    }
}

調(diào)用的方法是:

    @Test(description = "控件滑動")
    public void testactionswipe() throws InterruptedException {
        //調(diào)用封裝的方法實現(xiàn)控件滑動

        driver.findElementByName("追番").click();
        driver.findElementByName("時間表").click();
        List<WebElement> elements = driver.findElementsById("tv.danmaku.bili:id/date_item");
        WebElement element = elements.get(2);

        ElementHua.Element_HuaWithTouchAction(driver,element,"左滑");
        ElementHua.Element_HuaWithTouchAction(driver,element,"右滑");

        ElementHua.Element_HuaWithSwipe(driver,element,"左滑");
        ElementHua.Element_HuaWithSwipe(driver,element,"右滑");
    }

5.7 控件點擊操作
很簡單未荒,就用click()方法

image.png

控件的輸入
用到sendkeys()

image.png

    @Test(description = "控件的輸入")
    public void testsendkeys() throws InterruptedException {
        Thread.sleep(1000);
        driver.findElementById("tv.danmaku.bili:id/expand_search").click();
        Thread.sleep(1000);
        driver.findElementById("tv.danmaku.bili:id/search_src_text").sendKeys("test");
        Thread.sleep(1000);

    }

5.8 控件長按

image.png

    @Test(description = "控件的長按")
    public void testlongpress(){
        //獲取控件的X专挪、Y坐標點,通過坐標點長按

        WebElement element = driver.findElementByName("追番");
        int X = element.getLocation().getX();
        int Y = element.getLocation().getY();

        TouchAction action = new TouchAction(driver);
        //通過坐標點長按
        action.longPress(X,Y).perform();
        //通過定位到元素長按
        action.longPress(driver.findElementByName("時間表")).perform();
    }

5.9 控件的點擊
TouchAction action = new TouchAction(driver);
//通過坐標點點擊控件片排,
action.tap(X寨腔,Y).release().perform();
//通過輸入控件的element點擊控件
action.tap(element).release().perform();

tap比click點擊準確,會點擊控件的中間位置率寡,click會存在點擊不準確的情況迫卢。

5.10 Appium調(diào)起手機端chrome app瀏覽器
appium測試手機web的方法。
請參考http://www.reibang.com/p/b46d3687fcfc

5.11 CSS定位
適用與webview的頁面冶共。
基礎表達式部分:

image.png

image.png

高級表達式部分:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乾蛤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捅僵,更是在濱河造成了極大的恐慌家卖,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庙楚,死亡現(xiàn)場離奇詭異上荡,居然都是意外死亡,警方通過查閱死者的電腦和手機醋奠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門榛臼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伊佃,“玉大人,你說我怎么就攤上這事沛善『饺啵” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵金刁,是天一觀的道長帅涂。 經(jīng)常有香客問我,道長尤蛮,這世上最難降的妖魔是什么媳友? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮产捞,結(jié)果婚禮上醇锚,老公的妹妹穿的比我還像新娘。我一直安慰自己坯临,他們只是感情好焊唬,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著看靠,像睡著了一般赶促。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挟炬,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天鸥滨,我揣著相機與錄音,去河邊找鬼谤祖。 笑死婿滓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的泊脐。 我是一名探鬼主播空幻,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼容客!你這毒婦竟也來了秕铛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缩挑,失蹤者是張志新(化名)和其女友劉穎但两,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供置,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡谨湘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紧阔。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡坊罢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出擅耽,到底是詐尸還是另有隱情活孩,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布乖仇,位于F島的核電站憾儒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乃沙。R本人自食惡果不足惜起趾,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望警儒。 院中可真熱鬧训裆,春花似錦、人聲如沸冷蚂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝙茶。三九已至,卻和暖如春诸老,著一層夾襖步出監(jiān)牢的瞬間隆夯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工别伏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹄衷,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓厘肮,卻偏偏與公主長得像愧口,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子类茂,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程耍属,因...
    小菜c閱讀 6,409評論 0 17
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,100評論 1 32
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件巩检、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,102評論 4 62
  • 莎士比亞:上大學還是不上大學厚骗,這是一個值得思考的問題。 蘇軾:月有陰晴圓缺兢哭,學有大小之分领舰,此事古難全,但愿人長久,...
    海紅果閱讀 196評論 0 4
  • 我抬筆將冷暖世態(tài)隔絕 究竟抵不過 所鐘情之人贈我涼薄 早春暮春 酒暖花深 酒自飄香 花自飄落 千千心結(jié) 付與誰知 ...
    曾經(jīng)美得像花兒閱讀 464評論 0 1