Appium 在測試android混合應用時,關於webview頁面切換的那些事兒


 在一些混合應用中,有很多頁面都是用的內嵌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中的方法,可以打印出以下結果:

    

 打印出如圖所示結果,就表示你已經獲取到了當前頁面Webviewcontext ,接下來就是考慮如何去切換到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",

 然后再次運行原來的代碼

 可以運行成功啦~~~

 

大家如果有更好的解決方案,歡迎留言補充


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM