混合應(yīng)用是原生APP+webview組成的,可以簡單的理解為一個(gè)原生app的外殼旅急,內(nèi)部全是html頁面杠步。在處理這樣的app的定位的時(shí)候 需要先定位原生APP上的按鈕或者鏈接鸟顺,然后點(diǎn)擊按鈕或者鏈接,然后經(jīng)過appium提供的方法亥贸,進(jìn)入webview頁面躬窜,通過定位工具和方法進(jìn)行元素定位(同web自動(dòng)化元素定位)。
移動(dòng)端
1.將手機(jī)與PC通過USB連接炕置,開啟USB調(diào)試模式荣挨;
- 使用360手機(jī)助手或在dos窗口輸入adb devices查看手機(jī)驅(qū)動(dòng)連接是否成功;
PC端
1.搭建Appium環(huán)境朴摊,并下載SDK
- 在Chrome的應(yīng)用商店下載 ADB Plugin插件并安裝垦沉,點(diǎn)擊進(jìn)入下載 ADB Plugin插件,進(jìn)入調(diào)試模式仍劈;
- 此時(shí)頁面顯示了手機(jī)型號(hào)厕倍、驅(qū)動(dòng)名稱、APP要調(diào)試的WebView名稱贩疙;
-
點(diǎn)擊inspect讹弯,若成功加載與APP端相同界面的調(diào)試頁面,則配置成功这溅;
因?yàn)锳ppium是通過 chromedriver-port 9515進(jìn)行通信组民,驅(qū)動(dòng)安卓手機(jī)上的WebView;
所以需要查看手機(jī)系統(tǒng)的Android System WebView顯示的Chrome版本悲靴,下載對應(yīng)的chromedriver并添加到Appium的chromedriver目錄臭胜,保證驅(qū)動(dòng)程序版本對應(yīng)。然后Appium后臺(tái)啟動(dòng)時(shí)會(huì)自動(dòng)重啟chromedriver癞尚;
例如遇到這類問題:
An unknown server-side error occurred while processing the command. (Original error: unknown error: Chrome version must be >= 43.0.2357.0
解決方案:
1耸三、查看手機(jī)的Android System WebView ,打開手機(jī)的設(shè)置>應(yīng)用程序管理>全部,注意浇揩,一定要在全部里面找仪壮。
2、查找到Android System WebView應(yīng)用胳徽,查看詳情积锅,顯示版本號(hào):55.0.2883.91爽彤,需要下載55~56版本的chromdriver
3、然后找到對應(yīng)的Chromedriver版本進(jìn)行下載缚陷。下載地址:chromedriver各版本下載适篙。
注意:最新版本是:2.37,可通過對應(yīng)版本的目錄下的notes.txt查看箫爷。
4匙瘪、在PC端找到Appium中chromdriver目錄下,替換chromdriver.exe.我的路徑是:D:\software\app tools\nodeV8.7.0Winx64\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win
Appium切換context蝶缀、切換webview
@Test
public void test1() {
logger.info("開始了------------------------");
Set<String> contexts = driver.getContextHandles();
for(String context:contexts) {
logger.info(context);
//會(huì)打印出 NATIVE_APP(原生app handle)和WEBVIEW_com.example.testapp(webview的 handle)
}
//進(jìn)入webview中
driver.context((String) contexts.toArray()[1]);
WebElement vin = driver.findElement(By.xpath("http://input[@ng-model=\"vehicleInfo.vin\"]"));
vin.clear();
vin.sendKeys("LFV2B21K1D0904712");
}
或者是
public static void getContextHandle(AndroidDriver<WebElement> driver) {
Set<String> context = null ;
for(int i=1;i<=20;i++){
context = driver.getContextHandles();
for(String contextName : context) {
System.out.println(contextName);//打印當(dāng)前上下文
if(contextName!=null && contextName.contains("WEBVIEW_com.quantum.Tmsp7")||contextName.contains("WEBVIEW_com.tencent.mm:tools")){
switchTo_WEBVIEW(driver);
driver.getPageSource();
return;
}
if(i==20) assert false;
}
Log.goSleep(1);
}
}
public static void switchTo_WEBVIEW(AndroidDriver<WebElement> driver) {
String str = driver.currentActivity();//檢查當(dāng)前APP
for(int k=0;k<30;k++){
try {
if(str.equals(".MainActivity")){
driver.context("WEBVIEW_com.quantum.Tmsp7");
return;
}else if(str.equals(".plugin.webview.ui.tools.WebViewUI")){
driver.context("WEBVIEW_com.tencent.mm:tools");
return;
}
} catch (Exception e) {
if(k<10){
logger.info("switch...");
}if(k==30){
logger.fatal(driver, "switch fail!", e);
}
} finally{
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
}
}
為了預(yù)防端口被占用丹喻,請關(guān)閉91助手、殺毒軟件等翁都。
(1)啟動(dòng)appium
(2)運(yùn)行cmd 輸入 adb devices -l 查看UDID 如圖:
(3)再在cmd中輸入 appium -a 127.0.0.1 -p4723 -Uf4a4d8bb (-a表示ip碍论,-p表示端口,-U表示設(shè)備的udid )
執(zhí)行上述測試類即可柄慰。