Appium+python自動化(二十六)- 煙花一瞬,曇花一現 -Toast提示(超詳解)

  • 2019 年 10 月 3 日
  • 筆記

簡介 

  今天宏哥在這裡首先給小夥伴們和童鞋們分享一個有關曇花的小典故:話說曇花原是一位花神,她每天都開花,四季都燦爛。她還愛上了每天給她澆水除草的年輕人。後來,此事給玉帝得知。於是,玉帝大發雷霆,要拆散鴛鴦。他將花神抓了起來,把她貶為每年只能開一瞬間的曇花,不讓她再和情郎相見,還把那年輕人送去靈鷲山出家,賜名韋陀,讓他忘記前塵,忘記花神。
  多年過去了,韋陀果真忘了花神,潛心習佛,漸有所成。而花神卻怎麼也忘不了那個曾經照顧她的小夥子。她知道每年暮春時分,韋陀總要下山來為佛祖採集朝露煎茶。所以,曇花就選擇在那個時候開放。她把集聚了整整一年的精氣綻放在那一瞬間,希望韋陀能回頭看她一眼,能記起她。可是,千百年間過去了,韋陀一年年的下山來採集朝露,曇花一年年的默默綻放,韋陀始終沒有記起她。直到有一天,一名枯瘦的男子從曇花身邊走過,看到花神憂鬱孤苦之情,便停下腳步問花神:“你為什麼哀傷?”。花神驚異,因為凡人是看不到花神的真身。如果是大羅金仙頭上有金光、如果是妖魔頭上有黑氣、如果而凡人頭上是無任何靈光。剛剛從身邊走過的明明是一個凡人,如何看得見自己的真身。花神猶豫片刻,只是答到:“你幫不了我”。又默默等待韋陀,不再回答那個男子的話。40年後,那個枯瘦男子又從曇花身邊走過,重複問了40年前的那句話:“你為什麼哀傷?”花神再次猶豫片刻,只是答道“你也許幫不了我”。枯瘦的男子笑了笑離開。再40年後,一個枯瘦的老人再次出現在花神那裡,原本枯瘦的老人看起來更是奄奄一息。當年的男子已經變成老人,但是他依舊問了和80年前一樣的話:“你為什麼哀傷?”。曇花答道:“謝謝你這個凡人,在你一生問過我3次,但是你畢竟是凡人,而且已經奄奄一息,還怎麼幫我,我是因愛而被天罰的花神”。老人笑了笑,說“我是聿明氏,我只是來了斷80年前沒有結果的那段緣分。花神,我只送你一句‘緣起緣滅緣終盡、花開花落花歸塵’”。說完老人閉目坐下。時間漸漸過去,夕陽的最後一縷光線開始從老人的頭髮向眼睛划去。老人笑道:“曇花一現為韋陀,這般情緣何有錯,天罰地誅我來受,蒼天無眼我來開”。說罷,老人一把抓住花神。此時的夕陽正好滑到了老人的眼睛,老人隨即圓寂,抓著花神一同去往佛國去。花神在佛國見到了韋陀,韋陀也終於想起來前世因緣。佛祖知道後准韋陀下凡了斷未了的因緣。
  曇花一現,只為韋陀。所以,曇花又名韋陀花。也因為曇花是在夕陽後見到韋陀,所以曇花都是夜間開放。
  好了,到此故事結束了,開始今天的主題 – 獲取toast提示
在日常使用App過程中,經常會看到App介面有一些彈窗提示(如下圖所示)這些提示元素出現後等待3秒左右就會自動消失,這個和我日常生活中看到的煙花和曇花是多麼的相似,那麼我們該如何獲取這些元素文字內容呢?

 

Toast簡介

Android中的Toast是一種簡易的消息提示框。 當視圖顯示給用戶,在應用程式中顯示為浮動。和Dialog不一樣的是,它永遠不會獲得焦點,無法被點擊。
Toast類的思想就是儘可能不引人注意,同時還向用戶顯示資訊,希望他們看到。而且Toast顯示的時間有限,一般3秒左右就消失了。因此使用傳統的元素定位工具,我們是無法定位到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配置如下參數:

'automationName':'uiautomator2'  或者:  desired_caps['automationName']='uiautomator2'

2.安裝appium-uiautomator2-driver: 安裝命令如下:

cnpm install appium-uiautomator2-driver

安裝成功後可以在 C:UsersAdministratornode_modules看到對應的文件:

_appium-uiautomator2-driver@1.12.0@appium-uiautomator2-driver  _appium-uiautomator2-server@1.10.0@appium-uiautomator2-server

測試環境

1.宏哥的系統環境是Windows 10版本 64位系統

 

2.j宏哥的dk版本:”1.8.0_181″

3.宏哥的appium版本:1.4.16 

經查詢appium1.6.3以上才能識別toast,之前安裝appium版本是1.4.X,於是重整了測試環境

官方文檔是這麼說的

Firstly you should install appium server. Appium getting started. 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,官網是這麼說,因此為了不必要的麻煩折騰環境最好還是卸載低版本的appium,然後安裝版本高於1.6.3的appium。

appium有兩種安裝方式,看你的需要選擇方法一或方法二

        方法一:

      使用下載地址:https://bitbucket.org/appium/appium.app/downloads/,可以下載exe應用,桌面程式,更適合新手,介面設置,更容易上手,但是目前appium已經更新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],我是一開始使用方法一,之後發現幾個功能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次”
“驗證失敗次數過多,請15分鐘後再試”

程式碼實現

步驟一:初始化

在capability配置內部增加:desired_caps[‘uiautomationName’]=’ uiautomator2’

步驟二:定位toast元素

(1)定義toast文本內容

(2)定義路徑

(3)組合文本內容和路徑進行定位:用format()連接路徑和文本內容

參考程式碼

 1 # coding=utf-8   2 # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行   3   4 # 2.注釋:包括記錄創建時間,創建人,項目名稱。   5 '''   6 Created on 2019-7-31   7 @author: 北京-宏哥   QQ交流群:707699217   8 Project:學習和使用appium自動化測試-toast提示   9 '''  10 # 3.導入模組  11 from appium import webdriver  12 from selenium.common.exceptions import NoSuchElementException  13 from selenium.webdriver.support.ui import WebDriverWait  14 from selenium.webdriver.support import expected_conditions as 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:UsersDELLDownloadskaoyanbang.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 = "驗證失敗次數過多,請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=’’)

調用該方法提供的驅動程式作為一個參數,直到返回值不為 False。

until_not(method, message=’’)

調用該方法提供的驅動程式作為一個參數,直到返回值為 False。
 

動態函數:lambda x:x+5  

       X是函數的參數,冒號後面是函數的返回值

封裝toast判斷

1.單獨寫一個函數來封裝判斷是否存在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 True  28  29    except:  30  31        return False

封裝後參考程式碼

 1 # coding=utf-8   2 # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行   3   4 # 2.注釋:包括記錄創建時間,創建人,項目名稱。   5 '''   6 Created on 2019-7-31   7 @author: 北京-宏哥   QQ交流群:707699217   8 Project:學習和使用appium自動化測試-toast提示   9 '''  10 # 3.導入模組  11 from appium import webdriver  12 from selenium.common.exceptions import NoSuchElementException  13 from selenium.webdriver.support.ui import WebDriverWait  14 from selenium.webdriver.support import expected_conditions as 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:UsersDELLDownloadskaoyanbang.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 True  52  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 = "驗證失敗次數過多,請15分鐘後再試"  76  77     print is_toast_exist(driver, error_message)

 小結

1.注意:Toast內容為中文時,頂部必須注釋# coding=utf-8 否則會因為編解碼導致文字識別失敗。

2. 用npm安裝appium-uiautomator2-driver ,會出現錯誤,卡頓之後安裝不成功。

解決辦法

(1)首先執行這個命令:npm install -g cnpm --registry=https://registry.npm.taobao.org       安裝cnpm(完成後如下圖)

(2)然後通過這個命令: cnpm install appium-uiautomator2-driver   安裝uiautomator2的配置文件,如圖

3.cnpm與npm的區別:

(1)npm介紹

說明:npm(node package manager)是nodejs的包管理器,用於node插件管理(包括安裝、卸載、管理依賴等) 
(2)使用npm安裝插件:命令提示符執行npm install [-g] [–save-dev] 
:node插件名稱。 
例:npm install gulp-less –save-dev 
-g:全局安裝。 
將會安裝在C:UsersAdministratorAppDataRoamingnpm,並且寫入系統環境變數; 非全局安裝:將會安裝在當前定位目錄; 全局安裝可以通過命令行在任何地方調用它,本地安裝將安裝在定位目錄的node_modules文件夾下,通過require()調用;

–save:將保存配置資訊至package.json(package.json是nodejs項目配置文件);

-dev:保存至package.json的devDependencies節點,不指定-dev將保存至dependencies節點;

為什麼要保存至package.json?因為node插件包相對來說非常龐大,所以不加入版本管理,將配置資訊寫入package.json並將其加入版本管理,其他開發者對應下載即可(命令提示符執行npm install,則會根據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下載對應的插件包(該網站伺服器位於國外,所以經常下載緩慢或出現異常),

解決辦法:

選裝cnpm

說明:因為npm安裝插件是從國外伺服器下載,受網路影響大,可能出現異常,如果npm的伺服器在中國就好了,所以我們樂於分享的淘寶團隊幹了這事。來自官網:“這是一個完整 npmjs.org 鏡像,你可以用此代替官方版本(只讀),同步頻率目前為 10分鐘 一次以保證盡量與官方服務同步。” 
官方網址:http://npm.taobao.org 
安裝:命令提示符執行npm install cnpm -g –registry=https://registry.npm.taobao.org 
注意:安裝完後最好查看其版本號cnpm -v或關閉命令提示符重新打開,安裝完直接使用有可能會出現錯誤 
註:cnpm跟npm用法完全一致,只是在執行命令時將npm改為cnpm。

4.好了,時間不早了!至此,有關toast的提示,就給小夥伴們和童鞋們方向到這裡,謝謝你耐心的閱讀!

您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得點波 推薦 哦!!!(點擊右邊的小球即可,膽子大的可以試一下哦! :)

       個人公眾號                                                             微信群