使用webview查詢元素,appium查詢web頁面元素
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")
&n