簡介
今天宏哥在這里首先給小伙伴們和童鞋們分享一個有關曇花的小典故:話說曇花原是一位花神,她每天都開花,四季都燦爛。她還愛上了每天給她澆水除草的年輕人。后來,此事給玉帝得知。于是,玉帝大發(fā)雷霆,要拆散鴛鴦。他將花神抓了起來,把她貶為每年只能開一瞬間的曇花,不讓她再和情郎相見,還把那年輕人送去靈鷲山出家,賜名韋陀,讓他忘記前塵,忘記花神。
多年過去了,韋陀果真忘了花神,潛心習佛,漸有所成。而花神卻怎么也忘不了那個曾經(jīng)照顧她的小伙子。她知道每年暮春時分,韋陀總要下山來為佛祖采集朝露煎茶。所以,曇花就選擇在那個時候開放。她把集聚了整整一年的精氣綻放在那一瞬間,希望韋陀能回頭看她一眼,能記起她??墒?,千百年間過去了,韋陀一年年的下山來采集朝露,曇花一年年的默默綻放,韋陀始終沒有記起她。直到有一天,一名枯瘦的男子從曇花身邊走過,看到花神憂郁孤苦之情,便停下腳步問花神:“你為什么哀傷?”。花神驚異,因為凡人是看不到花神的真身。如果是大羅金仙頭上有金光、如果是妖魔頭上有黑氣、如果而凡人頭上是無任何靈光。剛剛從身邊走過的明明是一個凡人,如何看得見自己的真身?;ㄉ癃q豫片刻,只是答到:“你幫不了我”。又默默等待韋陀,不再回答那個男子的話。40年后,那個枯瘦男子又從曇花身邊走過,重復問了40年前的那句話:“你為什么哀傷?”花神再次猶豫片刻,只是答道“你也許幫不了我”??菔莸哪凶有α诵﹄x開。再40年后,一個枯瘦的老人再次出現(xiàn)在花神那里,原本枯瘦的老人看起來更是奄奄一息。當年的男子已經(jīng)變成老人,但是他依舊問了和80年前一樣的話:“你為什么哀傷?”。曇花答道:“謝謝你這個凡人,在你一生問過我3次,但是你畢竟是凡人,而且已經(jīng)奄奄一息,還怎么幫我,我是因愛而被天罰的花神”。老人笑了笑,說“我是聿明氏,我只是來了斷80年前沒有結果的那段緣分?;ㄉ瘢抑凰湍阋痪洹壠鹁墱缇壗K盡、花開花落花歸塵’”。說完老人閉目坐下。時間漸漸過去,夕陽的最后一縷光線開始從老人的頭發(fā)向眼睛劃去。老人笑道:“曇花一現(xiàn)為韋陀,這般情緣何有錯,天罰地誅我來受,蒼天無眼我來開”。說罷,老人一把抓住花神。此時的夕陽正好滑到了老人的眼睛,老人隨即圓寂,抓著花神一同去往佛國去?;ㄉ裨诜饑姷搅隧f陀,韋陀也終于想起來前世因緣。佛祖知道后準韋陀下凡了斷未了的因緣。
曇花一現(xiàn),只為韋陀。所以,曇花又名韋陀花。也因為曇花是在夕陽后見到韋陀,所以曇花都是夜間開放。
好了,到此故事結束了,開始今天的主題 - 獲取toast提示
在日常使用App過程中,經(jīng)常會看到App界面有一些彈窗提示(如下圖所示)這些提示元素出現(xiàn)后等待3秒左右就會自動消失,這個和我日常生活中看到的煙花和曇花是多么的相似,那么我們該如何獲取這些元素文字內容呢?
?
Toast簡介
Android中的Toast是一種簡易的消息提示框。 當視圖顯示給用戶,在應用程序中顯示為浮動。和Dialog不一樣的是,它永遠不會獲得焦點,無法被點擊。
Toast類的思想就是盡可能不引人注意,同時還向用戶顯示信息,希望他們看到。而且Toast顯示的時間有限,一般3秒左右就消失了。因此使用傳統(tǒng)的元素定位工具,我們是無法定位到Toast元素的(傳說中低調奢華有內涵)。
Appium Toast內容獲取
Add ability to verify TOAST messages (these can't be interacted with, only
text retrieval allowed)
1.Appium 1.6.3開始支持識別Toast內容,主要是基于UiAutomator2,因此需要在Capablity配置如下參數(shù):
'automationName':'uiautomator2' 或者: desired_caps['automationName']='
uiautomator2'
2.安裝appium-uiautomator2-driver: 安裝命令如下:
cnpm install appium-uiautomator2-driver
安裝成功后可以在 C:\Users\Administrator\node_modules看到對應的文件:
[email protected]@appium-uiautomator2-driver _appium
[email protected]@appium-uiautomator2-server
測試環(huán)境
1.宏哥的系統(tǒng)環(huán)境是Windows 10版本 64位系統(tǒng)
?
2.j宏哥的dk版本:"1.8.0_181"
3.宏哥的appium版本:1.4.16?
經(jīng)查詢appium1.6.3以上才能識別toast,之前安裝appium版本是1.4.X,于是重整了測試環(huán)境
官方文檔是這么說的
Firstly you should install appium server.?Appium getting started
<http://appium.io/getting-started.html>. The version 1.6.3 or greater is
recommended.
Since version 5.x there many features based on Java 8. So we recommend to
install JDK SE 8 and provide that source compatibility.
也就是更新appium
到1.6.3以上,java-client版本最好是5.x,jdk要用1.8、selenium要用3.x,其他版本不一定兼容,要自己親測是否可用
想識別toast,官網(wǎng)是這么說,因此為了不必要的麻煩折騰環(huán)境最好還是卸載低版本的appium,然后安裝版本高于1.6.3的appium。
appium有兩種安裝方式,看你的需要選擇方法一或方法二
? ? ? ? 方法一:
? ? ?
使用下載地址:https://bitbucket.org/appium/appium.app/downloads/,可以下載exe應用,桌面程序,更適合新手,界面設置,更容易上手,但是目前appium已經(jīng)更新1.6.3+,以上下載地址還沒更新最新的上去。如果不使用UIAUTOMATOR2等appium提供的新功能,不需要下載比較新的ppium,
? ? ? ? 方法二:
? ? ? 已安裝了node.js,可以使用npm命令安裝appium,打開cmd,輸入npm install -g
appium,回車,即可開始安裝目前最新的版本,速度會比較慢,畢竟是國外的,如果不安裝最新的使用命令:npm install -g
appium@xxx,xxx是版本號,如下載appium1.6.3,命令為npm install -g
[email protected],我是一開始使用方法一,之后發(fā)現(xiàn)幾個功能appium要更新到1.6.3以上才支持,所以我目前版本更新到了1.6.3+以上。
4.selenium:3.141.0
安裝selenium:
輸入指令pip install selenium
驗證安裝成功:pip show selenium
5.測試設備:Android 5.1.1 (不能低于5.0版本)
6.Python:3.7.2
命令:python -V? ,回車即可。
7.測試App:考研幫Android app V3.1.0
8.測試場景
進入登錄界面輸入錯誤的用戶名或者密碼,獲取Toast內容:
“用戶名或密碼錯誤,你還可以嘗試4次”
“驗證失敗次數(shù)過多,請15分鐘后再試”
代碼實現(xiàn)
步驟一:初始化
在capability配置內部增加:desired_caps[‘uiautomationName’]=’ uiautomator2’
步驟二:定位toast元素
(1)定義toast文本內容
(2)定義路徑
(3)組合文本內容和路徑進行定位:用format()連接路徑和文本內容
參考代碼
1 # coding=utf-8 2 # 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行 3 4 # 2
.注釋:包括記錄創(chuàng)建時間,創(chuàng)建人,項目名稱。 5 ''' 6 Created on 2019-7-31 7 @author: 北京-宏哥 QQ交流群:
707699217 8 Project:學習和使用appium自動化測試-toast提示 9 ''' 10 # 3.導入模塊 11 from appium
import webdriver12 from selenium.common.exceptions import NoSuchElementException
13 from selenium.webdriver.support.ui import WebDriverWait 14 from
selenium.webdriver.support import expected_conditionsas EC 15 16 desired_caps =
{'platformName': 'Android', 17 'platforVersion': '5.1.1', 18 'automationName': '
Uiautomator2', 19 'deviceName': '127.0.0.1:62001', 20 'app': r'
C:\Users\DELL\Downloads\kaoyanbang.apk', 21 'appPackage': 'com.tal.kaoyan', 22 '
appActivity': 'com.tal.kaoyan.ui.activity.SplashActivity', 23 'noReset': 'True'}
24 25 driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) 26
driver.implicitly_wait(9) 27 try: 28 driver.find_element_by_id("
android:id/button2").click() 29 except NoSuchElementException: 30 print(1) 31
try: 32 driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click() 33
except NoSuchElementException:34 print(2) 35 driver.find_element_by_id('
com.tal.kaoyan:id/login_email_edittext').clear() 36 driver.find_element_by_id('
com.tal.kaoyan:id/login_email_edittext').send_keys('bjhongge') 37 38
driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext'
).send_keys('1213213') 39 driver.find_element_by_id('
com.tal.kaoyan:id/login_login_btn').click() 40 41 error_message = "
用戶名或密碼錯誤,你還可以嘗試3次" 42 limit_message = "驗證失敗次數(shù)過多,請15分鐘后再試" 43 44 message = '
//*[@text=\'{}\']'.format(error_message) 45 #message='//*[@text=\'{}\']'
.format(limit_message)46 47 toast_element = WebDriverWait(driver, 15
).until(lambda x:x.find_element_by_xpath(message))48 print(toast_element.text)
說明:
連接不同的類型的變量或內容format()
顯示等待:webdriver(driver,5)
driver是webdriver的驅動程序,5是超時時間,以秒為單位
WebDriverWait()一般由 until()或 until_not()方法配合使用,下面是 until()和 until_not()方法的說明。
until(method, message=’’)
調用該方法提供的驅動程序作為一個參數(shù),直到返回值不為 False。
until_not(method, message=’’)
調用該方法提供的驅動程序作為一個參數(shù),直到返回值為 False。
?
動態(tài)函數(shù):lambda x:x+5??
?????? X是函數(shù)的參數(shù),冒號后面是函數(shù)的返回值
封裝toast判斷
1.單獨寫一個函數(shù)來封裝判斷是否存在toast消息,存在返回True,不存在返回False
1 def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5): 2 3 '''is
toast exist, return True or False 4 5 :Agrs: 6 7 - driver - 傳driver 8 9
- text - 頁面上看到的文本內容 10 11 - timeout - 最大超時時間,默認30s 12 13 - poll_frequency -
間隔查詢時間,默認0.5s查詢一次14 15 :Usage: 16 17 is_toast_exist(driver, "看到的內容") 18 19 '''
20 21 try: 22 23 toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text) 24 25
WebDriverWait(driver, timeout,
poll_frequency).until(EC.presence_of_element_located(toast_loc))26 27 return
True28 29 except: 30 31 return False
封裝后參考代碼
1 # coding=utf-8 2 # 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行 3 4 # 2
.注釋:包括記錄創(chuàng)建時間,創(chuàng)建人,項目名稱。 5 ''' 6 Created on 2019-7-31 7 @author: 北京-宏哥 QQ交流群:
707699217 8 Project:學習和使用appium自動化測試-toast提示 9 ''' 10 # 3.導入模塊 11 from appium
import webdriver12 from selenium.common.exceptions import NoSuchElementException
13 from selenium.webdriver.support.ui import WebDriverWait 14 from
selenium.webdriver.support import expected_conditionsas EC 15 16 desired_caps =
{'platformName': 'Android', 17 'platforVersion': '5.1.1', 18 'automationName': '
Uiautomator2', 19 'deviceName': '127.0.0.1:62001', 20 'app': r'
C:\Users\DELL\Downloads\kaoyanbang.apk', 21 'appPackage': 'com.tal.kaoyan', 22 '
appActivity': 'com.tal.kaoyan.ui.activity.SplashActivity', 23 'noReset': 'True'}
24 25 def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5): 26 27 '''
is toast exist, return True or False 28 29 :Agrs: 30 31 - driver - 傳driver 32
33 - text - 頁面上看到的文本內容 34 35 - timeout - 最大超時時間,默認30s 36 37 - poll_frequency -
間隔查詢時間,默認0.5s查詢一次38 39 :Usage: 40 41 is_toast_exist(driver, "看到的內容") 42 43 '''
44 45 try: 46 47 toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text) 48 49
WebDriverWait(driver, timeout,
poll_frequency).until(EC.presence_of_element_located(toast_loc))50 51 return
True52 53 except: 54 55 return False 56 if __name__ == "__main__": 57 58
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) 59
driver.implicitly_wait(9) 60 try: 61 driver.find_element_by_id("
android:id/button2").click() 62 except NoSuchElementException: 63 print(1) 64
try: 65 driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click() 66
except NoSuchElementException:67 print(2) 68 driver.find_element_by_id('
com.tal.kaoyan:id/login_email_edittext').clear() 69 driver.find_element_by_id('
com.tal.kaoyan:id/login_email_edittext').send_keys('bjhongge') 70 71
driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext'
).send_keys('1213213') 72 driver.find_element_by_id('
com.tal.kaoyan:id/login_login_btn').click() 73 74 error_message = "
用戶名或密碼錯誤,你還可以嘗試3次" 75 limit_message = "驗證失敗次數(shù)過多,請15分鐘后再試" 76 77 print
is_toast_exist(driver, error_message)
?小結
1.注意:Toast內容為中文時,頂部必須注釋# coding=utf-8 否則會因為編解碼導致文字識別失敗。
2. 用npm安裝appium-uiautomator2-driver ,會出現(xiàn)錯誤,卡頓之后安裝不成功。
解決辦法
(1)首先執(zhí)行這個命令:npm install?-g cnpm?--registry=https://registry.npm.taobao.org
?????? 安裝cnpm(完成后如下圖)
(2)然后通過這個命令: cnpm install appium-uiautomator2-driver?? 安裝uiautomator2的配置文件,如圖
3.cnpm與npm的區(qū)別:
(1)npm介紹
說明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安裝、卸載、管理依賴等)?
(2)使用npm安裝插件:命令提示符執(zhí)行npm install [-g] [–save-dev]?
:node插件名稱。?
例:npm install gulp-less –save-dev?
-g:全局安裝。?
將會安裝在C:\Users\Administrator\AppData\Roaming\npm,并且寫入系統(tǒng)環(huán)境變量; 非全局安裝:將會安裝在當前定位目錄;
全局安裝可以通過命令行在任何地方調用它,本地安裝將安裝在定位目錄的node_modules文件夾下,通過require()調用;
–save:將保存配置信息至package.json(package.json是nodejs項目配置文件);
-dev:保存至package.json的devDependencies節(jié)點,不指定-dev將保存至dependencies節(jié)點;
為什么要保存至package.json?因為node插件包相對來說非常龐大,所以不加入版本管理,將配置信息寫入package.json并將其加入版本管理,其他開發(fā)者對應下載即可(命令提示符執(zhí)行npm
install,則會根據(jù)package.json下載所有需要的包)。?
(3)使用npm卸載插件:npm uninstall [-g] [–save-dev]?
PS:不要直接刪除本地插件包?
(4)使用npm更新插件:npm update [-g] [–save-dev]?
(5)更新全部插件:npm update [–save-dev]?
(6)查看npm幫助:npm help?
(7)查看當前目錄已安裝插件:npm list
PS:npm安裝插件過程:從http://registry.npmjs.org下載對應的插件包(該網(wǎng)站服務器位于國外,所以經(jīng)常下載緩慢或出現(xiàn)異常),
解決辦法:
選裝cnpm
說明:因為npm安裝插件是從國外服務器下載,受網(wǎng)絡影響大,可能出現(xiàn)異常,如果npm的服務器在中國就好了,所以我們樂于分享的淘寶團隊干了這事。來自官網(wǎng):“這是一個完整
npmjs.org 鏡像,你可以用此代替官方版本(只讀),同步頻率目前為 10分鐘 一次以保證盡量與官方服務同步?!?
官方網(wǎng)址:http://npm.taobao.org?
安裝:命令提示符執(zhí)行npm install cnpm -g –registry=https://registry.npm.taobao.org?
注意:安裝完后最好查看其版本號cnpm -v或關閉命令提示符重新打開,安裝完直接使用有可能會出現(xiàn)錯誤?
注:cnpm跟npm用法完全一致,只是在執(zhí)行命令時將npm改為cnpm。
4.好了,時間不早了!至此,有關toast的提示,就給小伙伴們和童鞋們方向到這里,謝謝你耐心的閱讀!
您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得點波?推薦?哦?。。。c擊右邊的小球即可,膽子大的可以試一下哦!?:))
? ? ? ?個人公眾號? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?微信群?
? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
熱門工具 換一換