一脐供、使用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”
方法二:查看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
注:也可以問Android開發(fā)包名和activity,執(zhí)行appium自動化測試安裝app時在appium圖形化視圖中看日志也可以查看到包名和activity沦泌。
二糊昙、使用Android工具查找元素
進入sdk\tools\uiautomatorview.bat 打開這個工具
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();
要定位到紅框里的元素默穴,首先找到它的父級目錄怔檩,父級目錄的classname是android.support.v7.widget.RecyclerView
紅框里的元素的classname是android.view.ViewGroup,他是第1個元素蓄诽,所以
寫android.view.ViewGroup[1]薛训,如果是最后一個就可以寫[last()],如果要定位倒數(shù)第2個就寫[last()-1]
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:: 定位子孫元素:
通過父級去找:
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();
以上代碼要定位到第二個視頻赃额,打開后再返回
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 滑動操作
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)
封裝的代碼:
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("坐標定位成功");
}
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
手機坐標、首頁導航滑動前面已經(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í)行測試類就可以了
5.6 元素之間的滑動
控件的滑動可以用兩種方式實現(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()方法
控件的輸入
用到sendkeys()
@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 控件長按
@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的頁面冶共。
基礎表達式部分:
高級表達式部分: