Appium Hybrid混合應用測試——Native切換WebView

 

  • Appium Hybrid混合應用測試過程當中,常常須要在Native和WebView之間進行切換;

1.切換至WEBVIEW操做;html

for cons in driver.contexts:
    if cons.lower().startswith("webview"):
        driver._switch_to.context(cons)
        break
#

cons = driver.contexts  # 獲取上下文列表
driver._switch_to.context(cons[-1])

2.切換至NATIVE_APP操做;node

driver._switch_to.context("NATIVE_APP")

 

  • 切換WebView時遇到兩個問題,致使沒法進行WebView切換:

【問題1 contexts只能獲取NATIVE_APP,沒法獲取WEBVIEW】android

使用uiautomatorviewer定位元素,顯示class值爲:android.webkit.WebViewes6

可是driver.contexts只打印出了‘NATIVE_APP’;web

>>> driver.contexts
['NATIVE_APP']chrome

【解決方案】shell

須要開啓webview遠程調試功能, Android 4.4以上,須要在應用代碼中增長一下代碼段開啓該功能 (可由開發人員增長後從新打包給測試):json

修改Activity extends CordovaActivity,設置setWebContentsDebuggingEnabled(true);api

public class MyActivity  extends CordovaActivity {
    CordovaWebView cwv;
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.init();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            this.appView.setWebContentsDebuggingEnabled(true);
        }
        // Set by <content src="index.html" /> in config.xml
        loadUrl(launchUrl);
    }
}

 開啓WebView遠程調試功能後,從新打印contexts,成功!promise

>>> driver.contexts
['NATIVE_APP', 'WEBVIEW_com.sxxxxx.xxx']

 

 【問題2 已經可以獲取到WEBVIEW,可是沒法切換到WEBVIEW】

查看Appium 

# 發送contexts命令

> info: --> GET /wd/hub/session/c759114f-617f-461b-8341-91ca1d25515c/contexts {}
> info: [debug] Getting a list of available webviews
> info: [debug] executing cmd: D:\Android\sdk\platform-tools\adb.exe -s f825d6cd shell "cat /proc/net/unix"
> info: [debug] WEBVIEW_16429 mapped to pid 16429
> info: [debug] Getting process name for webview
> info: [debug] executing cmd: D:\Android\sdk\platform-tools\adb.exe -s f825d6cd shell "ps"
> info: [debug] Parsed pid: 16429 pkg: com.package.name
> info: [debug] from: u0_a256,16429,502,1975592,128716,ffffffff,00000000,S,com.package.name
> info: [debug] returning process name: com.package.name
> info: [debug] Available contexts:
> info: [debug] ["WEBVIEW_com.package.name"]
> info: [debug] Available contexts: NATIVE_APP,WEBVIEW_com.package.name

# 此處顯示已成功將contexts響應給client,["NATIVE_APP","WEBVIEW_com.package.name"]
> info: [debug] Responding to client with success: {"status":0,"value":["NATIVE_APP","WEBVIEW_com.package.name"],"sessionId":"c759114f-617f-461b-8341-91ca1d25515c"}
> info: <-- GET /wd/hub/session/c759114f-617f-461b-8341-91ca1d25515c/contexts 200 395.699 ms - 112 {"status":0,"value":["NATIVE_APP","WEBVIEW_com.package.name"],"sessionId":"c759114f-617f-461b-8341-91ca1d25515c"}
> info: --> POST /wd/hub/session/c759114f-617f-461b-8341-91ca1d25515c/context {"sessionId":"c759114f-617f-461b-8341-91ca1d25515c","name":"WEBVIEW_com.package.name"}
> info: [debug] Getting a list of available webviews
> info: [debug] executing cmd: D:\Android\sdk\platform-tools\adb.exe -s f825d6cd shell "cat /proc/net/unix"
> info: [debug] WEBVIEW_16429 mapped to pid 16429
> info: [debug] Getting process name for webview
> info: [debug] executing cmd: D:\Android\sdk\platform-tools\adb.exe -s f825d6cd shell "ps"
> info: [debug] Parsed pid: 16429 pkg: com.package.name
> info: [debug] from: u0_a256,16429,502,1975592,128716,ffffffff,00000000,S,com.package.name
> info: [debug] returning process name: com.package.name
> info: [debug] Available contexts: NATIVE_APP,WEBVIEW_com.package.name
> info: [debug] ["WEBVIEW_com.package.name"]
> info: [debug] Available contexts: NATIVE_APP,WEBVIEW_com.package.name

# 開始調用啓動Chromedriver
> info: [debug] Connecting to chrome-backed webview
> info: Chromedriver: Changed state to 'starting'
> info: Chromedriver: Set chromedriver binary as: D:\Appium\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe
> info: Chromedriver: Killing any old chromedrivers, running: FOR /F "usebackq tokens=5" %a in (`netstat -nao ^| findstr /R /C:"9515 "`) do (FOR /F "usebackq" %b in (`TASKLIST /FI "PID eq %a" ^| findstr /I chromedriver.exe`) do (IF NOT %b=="" TASKKILL /F /PID %a))
> info: Chromedriver: No old chromedrivers seemed to exist
> info: Chromedriver: Spawning chromedriver with: D:\Appium\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe --url-base=wd/hub --port=9515
> info: Chromedriver: [STDOUT] Starting ChromeDriver 2.18.343845 (73dd713ba7fbfb73cbb514e62641d8c96a94682a) on port 9515
> Only local connections are allowed.
> info: JSONWP Proxy: Proxying [GET /status] to [GET http://127.0.0.1:9515/wd/hub/status] with no body
> info: JSONWP Proxy: Got response with status 200: "{\"sessionId\":\"\",\"status\":0,\"value\":{\"build\":{\"version\":\"alpha\"},\"os\":{\"arch\":\"x86_64\",\"name\":\"Windows NT\",\"version\":\"10.0\"}}}"
> info: JSONWP Proxy: Proxying [POST /session] to [POST http://127.0.0.1:9515/wd/hub/session] with body: {"desiredCapabilities":{"chromeOptions":{"androidPackage":"com.package.name","androidUseRunningApp":true,"androidDeviceSerial":"f825d6cd"}}}
> info: JSONWP Proxy: Got response with status 200: {"sessionId":"448c057dd8e679591a99e539a6485d45","status":13,"value":{"message":"unknown error: Device f825d6cd is not online\n (Driver info: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb514e62641d...
> info: JSONWP Proxy: Proxying [POST /session] to [POST http://127.0.0.1:9515/wd/hub/session] with body: {"desiredCapabilities":{"chromeOptions":{"androidPackage":"com.package.name","androidUseRunningApp":true,"androidDeviceSerial":"f825d6cd"}}}
> info: JSONWP Proxy: Got response with status 200: {"sessionId":"a2c6259b846570c32fa66f07b8e663ba","status":13,"value":{"message":"unknown error: Device f825d6cd is not online\n (Driver info: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb514e62641d...
> info: JSONWP Proxy: Proxying [POST /session] to [POST http://127.0.0.1:9515/wd/hub/session] with body: {"desiredCapabilities":{"chromeOptions":{"androidPackage":"com.package.name","androidUseRunningApp":true,"androidDeviceSerial":"f825d6cd"}}}
> info: JSONWP Proxy: Got response with status 200: {"sessionId":"44a889342086cf78ea724e48b0958960","status":13,"value":{"message":"unknown error: Device f825d6cd is not online\n (Driver info: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb514e62641d...
> info: JSONWP Proxy: Proxying [POST /session] to [POST http://127.0.0.1:9515/wd/hub/session] with body: {"desiredCapabilities":{"chromeOptions":{"androidPackage":"com.package.name","androidUseRunningApp":true,"androidDeviceSerial":"f825d6cd"}}}
> info: JSONWP Proxy: Got response with status 200: {"sessionId":"66c261de9b5c1919eee22072feb2fa2e","status":13,"value":{"message":"unknown error: Chrome version must be >= 43.0.2357.0\n (Driver info: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb51...

# Chromedriver開始報錯!
> error: Chromedriver: Chromedriver exited unexpectedly with code null, signal SIGTERM
> info: Chromedriver: Changed state to 'stopped'
> warn: Chromedriver for context WEBVIEW_com.package.name stopped unexpectedly
> warn: Chromedriver quit unexpectedly, but it wasn't the active context, ignoring

# 此處報了重要的錯誤信息:Chrome version must be >= 43.0.2357.0,chromedriver=2.18.343845
> error: Chromedriver: Error: An unknown server-side error occurred while processing the command. (Original error: unknown error: Chrome version must be >= 43.0.2357.0
> (Driver info: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb514e62641d8c96a94682a),platform=Windows NT 10.0 x86_64))
> at JWProxy.command$ (lib/proxy.js:133:15)
> at tryCatch (D:\Appium\node_modules\appium\node_modules\appium-chromedriver\node_modules\appium-jsonwp-proxy\node_modules\babel-runtime\regenerator\runtime.js:67:40)
> at GeneratorFunctionPrototype.invoke [as _invoke] (D:\Appium\node_modules\appium\node_modules\appium-chromedriver\node_modules\appium-jsonwp-proxy\node_modules\babel-runtime\regenerator\runtime.js:315:22)
> at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (D:\Appium\node_modules\appium\node_modules\appium-chromedriver\node_modules\appium-jsonwp-proxy\node_modules\babel-runtime\regenerator\runtime.js:100:21)
> at GeneratorFunctionPrototype.invoke (D:\Appium\node_modules\appium\node_modules\appium-chromedriver\node_modules\appium-jsonwp-proxy\node_modules\babel-runtime\regenerator\runtime.js:136:37)
> at bound (domain.js:284:14)
> at GeneratorFunctionPrototype.runBound (domain.js:297:12)
> at run (D:\Appium\node_modules\appium\node_modules\appium-chromedriver\node_modules\appium-jsonwp-proxy\node_modules\babel-runtime\node_modules\core-js\library\modules\es6.promise.js:89:39)
> at D:\Appium\node_modules\appium\node_modules\appium-chromedriver\node_modules\appium-jsonwp-proxy\node_modules\babel-runtime\node_modules\core-js\library\modules\es6.promise.js:100:28
> at flush (D:\Appium\node_modules\appium\node_modules\appium-chromedriver\node_modules\appium-jsonwp-proxy\node_modules\babel-runtime\node_modules\core-js\library\modules\$.microtask.js:17:13)
> at process._tickDomainCallback (node.js:381:11)
> { [Error: An unknown server-side error occurred while processing the command. (Original error: unknown error: Chrome version must be >= 43.0.2357.0
> (Driver info: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb514e62641d8c96a94682a),platform=Windows NT 10.0 x86_64))]
> status: 13,
> value: { message: 'unknown error: Chrome version must be >= 43.0.2357.0\n (Driver info: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb514e62641d8c96a94682a),platform=Windows NT 10.0 x86_64)' },
> httpCode: 200 }

 

webview控件使用的是Android自帶的chrome內核,那麼來看看手機自帶的chrome內核版本吧;

設置>應用程序管理>所有,查找到Android System WebView應用,查看詳情,顯示版本號:42.0.2311.138

由此可知,Android系統自帶的chrom內核版本太低,形成報錯;

【解決方案】

知道了報錯緣由,那麼來進行問題解決吧。

方案1:

根據報錯信息要求的版本,下載更新Android System WebView;

 

方案2:

從報錯信息得知Appium使用的chromedriver=2.18.343845

查看ChromeDriver官網,得知ChromeDriver2.18支持Chrome 44+

So,咱們能夠更新下載對應版本的ChromeDriver.exe替換D:\Appium\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe

全部版本ChromeDriver下載地址

注:

雙擊執行「chromedriver.exe」,能夠查看版本driver版本號;

 

 

做者: SaoFox 
出處: http://www.cnblogs.com/sao-fox 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
相關文章
相關標籤/搜索