今天上線發現還是有人對appium這塊感興趣的,先謝謝大家的關注和收藏了,您的收藏就是對我最大的支援
今晚也終於有空來水一下 文章了,這一次講詳細介紹appium中的元素定位。
書接上文【appium】appium自動化入門之API(下)——兩萬字API長文,建議收藏
環境搭建篇【appium】appium自動化入門之環境搭建(上)
appium 定位 app 上的元素,可以通過 ==id,name.class ==這些屬性定位到
driver.find_element_by_id(" #這 裡 是 resource-id")
driver.find_element_by_id("#com.taobao.taobao:id/home_searchedit")
name 定位就是通過 UI Automator 工具檢視的== text 屬性== (注意的是:如果 text 屬性為空,那就不能通過 name 屬性定位了)
如上圖的定位,就可以通過 name 來定位 格式:driver.find_element_by_name("#這裡是 text") driver.find_element_by_name("#搭配新寵不能缺")
class 定位就是通過 UI Automator 工具檢視的 class 屬性
如上圖的定位,就可以通過 class 來定位
格式 :driver.find_element_by_class_name("class 屬 性 ") driver.find_element_by_class_name(「android.widget.EditText」)
(注意的是:一般一個頁面上的 class 屬性不唯一,元素不唯一的話定位會報錯了)
accessibility_id 定位就是通過 UI Automator 工具檢視的 content-desc 屬 性(當然下圖這個元素的 content-desc 屬性為空,就不能通過這個屬性定位了, 這裡只是舉個例子)
如上圖的定位,看到 content-desc 屬性有值,就可以通過 accessibility_id 來定位了格式:driver.find_element_by_accessibility_id(「#content-desc 的值」) driver.find_element_by_accessibility_id(「#xxx」)
(注:一般一個頁面上的 class 屬性不唯一,元素不唯一的話定位會報錯了)
一般來說上面的這幾個定位的,相對而言比較基礎,適合一些沒程式碼基礎,依靠工具來進行定位的同學
複雜一點的還可以通過== xpath 和 CSS定位==,八大元素裡個人覺得就這兩個是最全面好用的定位方式。
不過說起來也比較多,就不在這裡面細講了,需要這方面的視訊教學可以點選並輸入暗號:CSDN或者看大家的收藏吧,收藏高可以出一期八大元素定位專欄
現在大部分 app 都是混合式的 native+webview模式,對應 native 上的元素通過 uiautomatorviewer 很容易定位到,webview 上的元素就無法識別了。
用定位工具檢視頁面,發現頁面上有些區域無法定位到,如下圖左邊紅色區域, 只能定位到這個大框框,紅色框裡面的元素是無法識別的。
這時候可以檢視元素屬性,如右圖它的 class 屬性,上面寫著 WebView,那毫 無疑問這種頁面就是 webview 了。
context 是中文翻譯是上下文,環境,當然學過 selenium 的同學,也可以理解為控制程式碼(handle),其實是一回事,反正知道是兩個不同的環境就行了。
先獲取頁面是 contexts 環境,如下圖紅色區域,獲取的是一個 list 列表:
NATIVE_APP:這個就是 native,也就是原生的 WEBVIEW_com.xxxx :這個就是 webview
當看到列印出來有下圖兩個,就說明獲取到 webview 的context 了(當然也有 的 app 有坑,可能明明有 webview,卻通過 contexts 獲取不到,這種需要特殊 處理了)
1.要想操作 webview 上的元素,第一步需要切換環境(跟 selenium 的切換 iframe, 切換 handle 思路是一樣)
2.切換方法:switch_to.context(引數是 webview 的context) 由於第二步已經獲取到 contexts 是一個 list 物件,取這個 list 的第二個引數 就行,也就是 contexts[1]
方法一
driver.switch_to.context("NATIVE_APP")
# 這個 NATIVE_APP 是固定的引數
方 法 二 :
driver.switch_to.context(contexts[0])
# 從 contexts 裡取第一個引數
#coding:utf-8
from appium import webdriver
import time
desired_caps = {'platformName': 'Android',
'deviceName': '30d4e606',
'platformVersion': '6.0',
'appPackage': 'com.baidu.yuedu',
'appActivity':
'com.baidu.yuedu.splash.SplashActivity'}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
time.sleep(30)
# 點圖書按鈕
driver.find_element_by_id("com.baidu.yuedu:id/righttitle").click()
time.sleep(3)
# 切換到圖書介面後獲取所有的環境
contexts = driver.contexts
print contexts
# 切 換 到 webview
driver.switch_to.context(contexts[1])
# 獲取當前的環境,看是否切換成功
now = driver.current_context
print now
# 切 回 native
driver.switch_to.context(contexts[0])
#driver.switch_to.context("NATIVE_APP") 這樣也是可以的
#獲取當前的環境,看是否切換成功
now = driver.current_context
print now
app 上webview 的頁面實際上是啟用的 chrome 瀏覽器的核心載入的,如何把手 機的網頁載入到電腦上,電腦的 chrome 瀏覽器上有個開發模式 DevTools,是可 以方便偵錯的。
1.手機上裝一個 chrome 瀏覽器
2.電腦上裝 chrome 瀏覽器
3.手機連電腦 第
1.電腦上開啟 chrome 瀏覽器輸入:chrome://inspect/#devices
2.Discover USB devices 這個要勾選的,可以檢查到手機裝置
3.Discover network targets 這個勾選,檢查到網路
4.下圖箭頭指向的,是手機的裝置名稱
5.Webview in com.baidu.yuedu(39.0.00)這個是手機上瀏覽器的核心版本號 39 (一般電腦上的 chrome 版本號最好要大於等於這個版本號)
上圖紅色框框的兩個地址就是載入到的 webview 的網頁地址了,點地址下的 inspect 按鈕,進入偵錯介面 (注:這個是需要梯子的)
不會爬梯子的也沒關係,把對應的 url 地址複製出來,重新開啟一個瀏覽器標 籤,輸入地址後,按 F12 也可以進偵錯介面。
接下來的元素定位就跟 selenium 的定位是一回事了。
不清楚selenium元素定位的可以點選並輸入暗號:CSDN問一下selenium元素定位的視訊,或者等我完結appium的文章,再寫appium吧(挖坑 )
最後的最後上述程式碼有出錯的,可以先根據錯誤先百度檢視一下,還是解決不了可以點選並輸入暗號:CSDN,把你的問題截圖發一下,會有大佬帶你的