9 webview查找元素
9.1 webview 簡介
WebView是android中一個非常重要的控件,它的作用是用來展示一個web頁面。它使用的內核是webkit引擎,4.4版本之后,直接使用Chrome作為內置網頁瀏覽器。
9.2 移動端應用
移動端,一般分為三種應用:
Native應用:就是安卓的原生應用,普通APP。文件自帶的文件管理、設置等APP
Web應用:需要依托瀏覽器展示的網頁應用,比如微信里的公眾號、商城
混合應用:也就是結合了原生和網頁應用,在原生應用中嵌入網頁。很多APP都是這樣的,比如淘寶等
那么為什么是要使用webview呢?前面第二章講過UIAutomatorViewer的使用,UIAutomatorViewer是用來識別安卓原生應用的,它識別不到web網頁的內容。所以如果你要測試的APP有網頁應用,就需要用到webview來識別控件的id、name等信息。
ps:如果確定這個APP的頁面是不是網頁,一般情況下,長按文字可以出現復制粘貼的,網絡不好的時候會出現一個緩慢加載的過程等一般都是web應用。
9.3使用webview查找元素
第一種方式需要FQ:
1.將手機連接到電腦上,打開USB調試,去cmd中輸入adb devices會顯示你的設備已連接
2.然后你打開要測試的網頁版的APP,比如我打開微信里的一個商城
3.從電腦端,打開chrome瀏覽器,輸入chrome://inspect,打開,會顯示你的手機型號,以及你打開的網頁
注意:1.如果你查找的不是web網頁,webview是不會顯示的,所以如果沒顯示,首先看下自己的頁面是不是網頁版;2.如果連手機型號都沒出來,那說明手機沒有連接上,重新關閉usb調試再打開試試,還是不行確定一下自己的驅動是不是裝好了;3.這個只能適用安卓4.4版本以上的手機
4.點擊inspect,就會出來如圖:
5.點擊圖中的箭頭,左側是頁面,右側顯示的是控件的信息。想看哪個APP,在手機上打開哪個APP即可。
如果不能FQ,還有一個方法就是將網頁鏈接復制到電腦的瀏覽器,從電腦瀏覽器打開網頁,點擊右鍵--檢查/查看元素,也可以找到元素信息。和之前selenium一樣。
9.4 appium查找網頁元素
找到了元素信息后,如何寫代碼讓appium自動去找呢?
連接手機的代碼和find_element_XX都是一樣的,只是有一個地方需要注意,appium默認都是按照原生應用查找的,如果想讓它查找網頁應用,就要告訴它接下來要查找網頁應用了,用switch_to.context()方法:
#coding=utf-8 from appium import webdriver import time """連接手機,獲取driver""" server = r'http://localhost:4723/wd/hub' # Appium Server, 端口默認為4723 desired_capabilities = { 'platformName': 'Android', 'deviceName': '127.0.0.1:62001', 'platformVersion': '10', 'appPackage': 'com.ddsy.songyao', 'appActivity': '.activity.MainActivity', 'unicodeKeyboard': True, 'reserKeyBoard': True, 'noReset': True, 'fullReset': False } driver = webdriver.Remote(server, desired_capabilities) # 連接手機和APP time.sleep(3) # 點擊首頁某個元素進入到某個網頁版頁面 driver.find_element_by_xpath("//*[contains(@bounds, '[360,676][720,837]')]").click() time.sleep(5) # 獲取當前網頁頁面的contexts contexts = driver.contexts for i in contexts: print(i) # 打印的contexts結果: # NATIVE_APP # 一般情況原生的應用都是這個context # WEBVIEW_com.android.browser # 網頁應用的context都是‘WEBVIEW_’開頭的 # 如果你的當前頁面是原生的,那么只會打出來NATIVE_APP # 告訴appium接下來找到元素是網頁的元素 driver.switch_to.context("WEBVIEW_com.android.browser") # 下面的方法就一樣了
driver.find_element_by_id("網頁元素的id").click()
driver.find_element_by_xpath("//*[contains(@text, 'xxx").sendkeys('xx') #接下來回到原生應用
driver.switch_to.context("NATIVE_APP")
driver.find_element_by_id("安卓原生的id")