在一些混合應用中,有很多頁面都是用的內嵌webview窗口來展示的,如我們APP的登錄新設備驗證頁面(用的就是內嵌webview)。 
在用Appium 做此類頁面的測試時,一般都是用 switch_to.context(參數是webview的context) 來進行窗口切換,但是需要注意一下幾點:
1.在做窗口切換之前,首先要查看當前頁面有多少個視窗,可以用以下方法:
WebView = driver.contexts print(WebView)
如果輸出結果是:

那很遺憾,當前頁面是不能直接使用 switch_to.context() 該函數的。
針對這種情況,一般的處理方法是讓開發人員幫你在APP源碼中加入:
WebView.setWebContentsDebuggingEnabled(true);
將Debug模式打開,然后重新打個包給你測試。
當然 自己有APP源碼的話,你自己也可以修改源碼打開Debug模式,加入:
WebView.setWebContentsDebuggingEnabled(true);
具體最好可以咨詢下開發人員,然后重新打個包。
一般情況下,重新打包后,再使用1中的方法,可以打印出以下結果:

打印出如圖所示結果,就表示你已經獲取到了當前頁面Webview 的 context ,接下來就是考慮如何去切換到Webview叻
2.切換Webview
想要操作Webview上頁面內元素,首先需要切換環境(context),就好象selenium的切換iframe,切換handle思路是一樣
切換環境,可以理解為切換窗口,從原生的NATIVE窗口切換到Webview窗口。可以用switch_to.context()方法來操作。注:括號內參數填寫Webview的context
通過操作1,可以獲取到的 “WebView” 是一個list對象,而在這里咱們要Webview頁面的context,即獲取該list對象的第二個參數WebView[1]。

獲取到Webview頁面的context之后,就可以進行切換:

切換完成后就可以對對應的元素進行操作了。
在操作完成后,想回到原本的NATIVE窗口,對原生部分的元素進行操作,就需要切換會原本的NATIVE窗口,即切換回WebView[0]:
driver.switch_to.context(WebView[0])
可以通過這種方式來實現回切,:

參考代碼如下:
def get_web_view(): sleep(30) print('開始切換') #獲取當前界面的所有窗口 WebView = driver.contexts print(WebView) View = WebView[1] print(View) #切換到Webview窗口 driver.switch_to.context(View) #獲取當前所處的環境窗口 New_View = driver.current_context print('New_View is :',New_View) #切換到NATIVE窗口 driver.switch_to.context(WebView[0]) #獲取當前所處的環境窗口 New_View = driver.current_context print('New_View is :',New_View)
3.使用switch_to.context()方法的時候出現報錯。
Traceback (most recent call last): File "E:\Appium\FXJC_Appium_Python\Start_Appium.py", line 207, in <module> get_web_view() File "E:\Appium\FXJC_Appium_Python\Start_Appium.py", line 109, in get_web_view driver.switch_to.context('WEBVIEW_com.cs_credit_bank') File "C:\Python36\lib\site-packages\appium\webdriver\switch_to.py", line 31, in context self._driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {'name': context_name}) File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute self.error_handler.check_response(response) File "C:\Python36\lib\site-packages\appium\webdriver\errorhandler.py", line 29, in check_response raise wde File "C:\Python36\lib\site-packages\appium\webdriver\errorhandler.py", line 24, in check_response super(MobileErrorHandler, self).check_response(response) File "C:\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome '39.0.0'. See https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md for more details. [Finished in 44.6s]
由上面的報錯可以得知Appium在運行過程中找不到設備系統自帶瀏覽器Webview版本所對應版本的Chromedriver。導致了報錯。
這個時候我們可以通過將Appium目錄下的Chromedriver文件更換成對應版本的Chromedriver就可以解決該問題了。
Chromedriver在Appium(1.6.3版本)下的目錄“C:\Program Files (x86)\Appium\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\”
偶爾可能遇到更換后還是會繼續報錯的情況,我就遇到了這種情況,我的解決方法是在腳本內Appium的driver配置內指定Chromedriver的路徑,如下圖:

即增加一個:
"chromedriverExecutable": "C:\\Program Files (x86)\\Appium\\resources\\app\\node_modules\\appium\\node_modules\\appium-chromedriver\\chromedriver\\win\\chromedriver.exe",
然后再次運行原來的代碼

可以運行成功啦~~~
大家如果有更好的解決方案,歡迎留言補充
