南京網(wǎng)站建設(shè)推南京網(wǎng)站建設(shè)設(shè)計山東16市最新疫情
思考
在自動化過程中,元素出現(xiàn)受網(wǎng)絡(luò)環(huán)境,設(shè)備性能等多種因素影響。因此元素加載的時間可能不一致,從而會導致元素無法定位超時報錯,但是實際上元素是正常加載了的,只是出現(xiàn)時間晚一點而已。那么如何解決這個問題呢?
實際測試過程中,比如點擊一個控件需要啟動一個新activiy界面,或需要加載彈框,或請求網(wǎng)絡(luò)加載數(shù)據(jù)成功后刷新界面,此時需要等待一段時間,新界面出現(xiàn)了才能繼續(xù)執(zhí)行UI操作,否則還在加載中,程序已開始執(zhí)行新界面操作的代碼,腳本就會報錯了。
元素等待作用
1.設(shè)置元素等待可以更加靈活的制定等待定位元素的時間,從而增強腳本的健壯性,提高執(zhí)行效率。
2.元素等待是為了解決如下場景的問題:腳本執(zhí)行時,腳本的執(zhí)行速度和頁面元素的加載速度未必一致,也就是說,可能出現(xiàn)腳本已經(jīng)運行到某個元素,但該元素尚未加載到頁面,此時腳本會因無法定位到該元素而導致執(zhí)行失敗。元素等待本質(zhì)是為了解決時序上不匹配的問題。
元素等待類型
類型 | 特點 | 舉例 |
強制等待 | 設(shè)置固定的等待時間 | from time import sleep |
隱式等待 | 針對全部元素設(shè)置的等待時間 | driver.implicitly_wait(5) |
顯示等待 | 針對某個元素來設(shè)置的等待時間 | from selenium.webdriver.support.ui import WebDriverWait WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) |
強制等待
設(shè)置固定的等待時間,使用sleep()方法即可實現(xiàn)
sleep(): 設(shè)置固定休眠時間。 python 的 time 包提供了休眠方法 sleep() , 導入 time包后就可以使用 sleep()進行腳本的執(zhí)行過程進行休眠。
1 from time import sleep
2
3 #強制等待5秒
4
5 sleep(5)
隱式等待
隱式等待是針對全部元素設(shè)置的等待時間
1 #implicitly_wait():是 webdirver 提供的一個超時等待。隱的等待一個元素被發(fā)現(xiàn),或一個命令完成。如果超出了設(shè)置時間的則拋出異常。2 #implicitly_wait():隱式等待3 #當使用了隱士等待執(zhí)行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續(xù)等待,超出設(shè)定時間后則拋出找不到元素的異常4 #換句話說,當查找元素或元素并沒有立即出現(xiàn)的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是05 #一旦設(shè)置了隱式等待,則它存在整個 WebDriver 對象實例的聲明周期中,隱式的等到會讓一個正常響應(yīng)的應(yīng)用的測試變慢,6 #它將會在尋找每個元素的時候都進行等待,這樣會增加整個測試執(zhí)行的時間。7 8 #implicitly_wait()方法比 sleep() 更加智能,后者只能選擇一個固定的時間的等待,前者可以在一個時間范圍內(nèi)智能的等待。9
10 driver.implicitly_wait(20)
顯式等待
顯式等待是針對某個元素來設(shè)置的等待時間。
WebDriverWait():同樣也是 webdirver 提供的方法。在設(shè)置時間內(nèi),默認每隔一段時間檢測一次當前。頁面元素是否存在,如果超過設(shè)置時間檢測不到則拋出異常。
方法WebDriverWait格式參數(shù)如下:
1 '''詳細格式如下:2 WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)3 driver - WebDriver 的驅(qū)動程序(Ie, Firefox, Chrome 或遠程)4 timeout - 最長超時時間,默認以秒為單位5 poll_frequency - 休眠時間的間隔(步長)時間,默認為 0.5 秒6 ignored_exceptions - 超時后的異常信息,默認情況下拋 NoSuchElementException 異常。7 WebDriverWai()一般由 until()或 until_not()方法配合使用,下面是 until()和 until_not()方法的說明。8 until(method, message=’’)9 調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù),直到返回值不為 False。
10 until_not(method, message=’’)
11 調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù),直到返回值為 False。
12 lambda
13 lambda 提供了一個運行時動態(tài)創(chuàng)建函數(shù)的方法。'''
14
15 from selenium.webdriver.support.ui import WebDriverWait
16
17 WebDriverWait(driver,10).until(lambda x:x.find_element_by_id("elementID"))
其中,三種等待方法的作用和區(qū)別,如下:
強制等待,也就是常說的死等待,使用time模塊提供的sleep方法,腳本在等待sleep(x)?x秒后才執(zhí)行,此時腳本也許出現(xiàn)了無效等待,即元素已經(jīng)出現(xiàn),可以繼續(xù)操作,但因指定的時間未到,腳本無法執(zhí)行,因而,在實際Web UI開發(fā)中應(yīng)杜絕sleep等待;
顯式等待,WebDriver提供的針對元素級別的、靈活、智能的等待方法,通過配合until()、until_not()、ExpectedCondition等條件的使用,默認每500ms檢查一次條件狀態(tài),可以及時將腳本從等待中喚醒,避免無效等待,在實際應(yīng)用中推薦使用該方法。
該等待的調(diào)用方法如下:
WebDriverWait(driver,?超時時長,?調(diào)用頻率,?忽略異常).until(可執(zhí)行方法,?超時時返回的信息)
隱式等待,WebDriver提供的針對driver級別的適用整個生命周期的等待方法,該等待是全局設(shè)置,因而只需在實例化driver后設(shè)置一次即可。從等待作用上看,是可以滿足需要的,但是考慮到實際應(yīng)用場景,driver要等待的元素和腳本要操作的元素未必相同,也就是說,腳本要操作的元素已經(jīng)出現(xiàn),但因為設(shè)置了全局等待,driver也會繼續(xù)等待頁面上其他無關(guān)元素,直至整個頁面加載完畢。因而,與顯式等待相比,可能出現(xiàn)無效等待的情況。
等待方法實戰(zhàn)舉例
1.強制等待方法應(yīng)用實例
1 # coding=utf-82 # 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注釋:包括記錄創(chuàng)建時間,創(chuàng)建人,項目名稱。5 '''6 Created on 2019-7-267 @author: 瀟瀟說測試8 Project:學習和使用appium自動化測試-元素等待9 '''
10 # 3.導入模塊
11 from appium import webdriver
12 import time
13 desired_caps = {}
14 desired_caps['platformName'] = 'Android' #android的apk還是IOS的ipa
15 desired_caps['platformVersion'] = '8.0' #android系統(tǒng)的版本號
16 desired_caps['deviceName'] = '127.0.0.1:62001' #手機設(shè)備名稱,通過adb devices 查看
17 desired_caps['appPackage'] = 'com.taobao.taobao' #apk的包名
18 desired_caps['appActivity'] = 'com.taobao.tao.welcome.Welcome' #apk的launcherActivity
19 desired_caps['unicodeKeyboard'] = True #使用unicodeKeyboard的編碼方式來發(fā)送字符串
20 desired_caps['resetKeyboard'] = True #將鍵盤給隱藏起來
21 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) #啟動服務(wù)器地址,后面跟的是手機信息
22 # 休眠五秒等待頁面加載完成
23 time.sleep(5) #強制等待5s,不管等待的元素是否出現(xiàn),都要等5s
24 driver.find_element_by_id("com.taobao.taobao:id/home_searchedit").click()
25 time.sleep(3) #演示效果
26 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").click()
27 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys(u"瀟瀟")
28 driver.quit()
2.顯示等待方法應(yīng)用實例
1 # coding=utf-82 # 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注釋:包括記錄創(chuàng)建時間,創(chuàng)建人,項目名稱。5 '''6 Created on 2019-7-267 @author: 瀟瀟說測試8 Project:學習和使用appium自動化測試-元素等待9 '''
10 # 3.導入模塊
11 from appium import webdriver
12 from selenium.webdriver.support.ui import WebDriverWait
13 import time
14 desired_caps = {}
15 desired_caps['platformName'] = 'Android' #android的apk還是IOS的ipa
16 desired_caps['platformVersion'] = '8.0' #android系統(tǒng)的版本號
17 desired_caps['deviceName'] = '127.0.0.1:62001' #手機設(shè)備名稱,通過adb devices 查看
18 desired_caps['appPackage'] = 'com.taobao.taobao' #apk的包名
19 desired_caps['appActivity'] = 'com.taobao.tao.welcome.Welcome' #apk的launcherActivity
20 desired_caps['unicodeKeyboard'] = True #使用unicodeKeyboard的編碼方式來發(fā)送字符串
21 desired_caps['resetKeyboard'] = True #將鍵盤給隱藏起來
22 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) #啟動服務(wù)器地址,后面跟的是手機信息
23 try:
24 # 顯示等待(等待特定元素出現(xiàn))
25 WebDriverWait(driver, 3).until(lambda x: x.find_element_by_id('com.taobao.taobao:id/home_searchedit'))
26 driver.find_element_by_id("com.taobao.taobao:id/home_searchedit").click()
27 time.sleep(3) # 演示效果
28 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").click()
29 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys(u"瀟瀟")
30 finally:
31 driver.quit()
3.隱式等待方法應(yīng)用實例
1 # coding=utf-82 # 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注釋:包括記錄創(chuàng)建時間,創(chuàng)建人,項目名稱。5 '''6 Created on 2019-7-267 @author: 瀟瀟說測試8 Project:學習和使用appium自動化測試-元素等待9 '''
10 # 3.導入模塊
11 from appium import webdriver
12 from selenium.webdriver.support.ui import WebDriverWait
13 import time
14 desired_caps = {}
15 desired_caps['platformName'] = 'Android' #android的apk還是IOS的ipa
16 desired_caps['platformVersion'] = '8.0' #android系統(tǒng)的版本號
17 desired_caps['deviceName'] = '127.0.0.1:62001' #手機設(shè)備名稱,通過adb devices 查看
18 desired_caps['appPackage'] = 'com.taobao.taobao' #apk的包名
19 desired_caps['appActivity'] = 'com.taobao.tao.welcome.Welcome' #apk的launcherActivity
20 desired_caps['unicodeKeyboard'] = True #使用unicodeKeyboard的編碼方式來發(fā)送字符串
21 desired_caps['resetKeyboard'] = True #將鍵盤給隱藏起來
22 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) #啟動服務(wù)器地址,后面跟的是手機信息
23
24 # 隱式等待(等待所有元素)
25 driver.implicitly_wait(3) #隱式等待,最長3s
26 driver.find_element_by_id("com.taobao.taobao:id/home_searchedit").click()
27 time.sleep(3) #演示效果
28 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").click()
29 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys(u"瀟瀟")
30 driver.quit()
小結(jié)
1.本節(jié)主要介紹appium自動化中三種元素等待方法,并講解了各自的優(yōu)缺點,實際開發(fā)中推薦使用顯示等待,最后,為了便于理解和應(yīng)用,針對每種等待方法,編寫了對應(yīng)的腳本。
2.強制等待的方法,在debug時候很有用,不過建議慎用這種方法,因為太死板,嚴重影響程序執(zhí)行速度!
3.以上三種等待方法,在具體的場景中需要根據(jù)情況選擇合適的方法,靈活運用。。。
4.做過自動化的小伙伴們或者童鞋們,在啟動app的時候,幸運的小伙伴和同學們都會中這個大獎:如果直接做下一步點擊操作,經(jīng)常會報錯,于是我們便會自然而然的想到上邊介紹的三種方法,會在啟動完成的時候加sleep等方法。那么問題來了,問你這個sleep時間到底設(shè)置多少合適呢?你不知道我也不知道這個問題的答案,如果設(shè)置長了,就浪費時間,設(shè)置短了,就會找不到元素報錯了。過長過短都是個讓你頭疼的事,那么有沒有別的方法可以克服這個問題了。當然有,一般人都不告訴他,大家都是二般人,就分享給各位吧!但是這個只是針對安卓手機的哦,要記住了,iPhone不適合的。這個時候我們可以用wait_activity的語法,等到你想點擊的頁面activity出現(xiàn)了,再點擊,可以有效的節(jié)省時間。
wait_activity
(1)查看源碼
1 def wait_activity(self, activity, timeout, interval=1):2 """Wait for an activity: block until target activity presents3 or time out.4 5 This is an Android-only method.6 7 :Agrs:8 - activity - target activity9 - timeout - max wait time, in seconds
10 - interval - sleep interval between retries, in seconds
11 """
12 try:
13 WebDriverWait(self, timeout, interval).until(
14 lambda d: d.current_activity == activity)
15 return True
16 except TimeoutException:
17 return False
(2)解釋說明:
1 def wait_activity(self, activity, timeout, interval=1):2 """Wait for an activity: block until target activity presents3 or time out.4 5 This is an Android-only method.6 7 :Agrs:8 - activity - target activity9 - timeout - max wait time, in seconds
10 - interval - sleep interval between retries, in seconds
11 """
12 try:
13 WebDriverWait(self, timeout, interval).until(
14 lambda d: d.current_activity == activity)
15 return True
16 except TimeoutException:
17 return False
獲取current_activity
(1)打開app后,先sleep10秒,等app完全啟動完成進入主頁面,然后獲取當前界面的activity
1 # coding=utf-82 # 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注釋:包括記錄創(chuàng)建時間,創(chuàng)建人,項目名稱。5 '''6 Created on 2019-7-267 @author: 瀟瀟說測試8 Project:學習和使用appium自動化測試-元素等待9 '''
10 # 3.導入模塊
11 from appium import webdriver
12 from time import sleep
13 desired_caps = {
14 'platformName': 'Android',
15 'deviceName': '127.0.0.1:62001',
16 'platformVersion': '4.4.2',
17 'appPackage': 'com.baidu.yuedu',
18 'appActivity': 'com.baidu.yuedu.splash.SplashActivity'
19 }
20 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
21
22 sleep(10)
23 # 獲取當前界面activity
24 ac = driver.current_activity
25 print(ac)
(2)運行結(jié)果:
等待activity
(1)用sleep太浪費時間了,并且不知道什么時候能啟動完成,所以盡量不用sleep,不推薦使用。因為這個確實是太low了。
(2)上一步已經(jīng)獲取當主頁面的activity了,那就可以用wait_activity等它出現(xiàn)了,再做下一步的點擊操作
(3)參考代碼
1 # coding=utf-82 # 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注釋:包括記錄創(chuàng)建時間,創(chuàng)建人,項目名稱。5 '''6 Created on 2019-7-267 @author: 瀟瀟說測試8 Project:學習和使用appium自動化測試-元素等待9 '''
10 # 3.導入模塊
11 from appium import webdriver
12 from time import sleep
13 desired_caps = {
14 'platformName': 'Android',
15 'deviceName': '127.0.0.1:62001',
16 'platformVersion': '4.4.2',
17 'appPackage': 'com.baidu.yuedu',
18 'appActivity': 'com.baidu.yuedu.splash.SplashActivity'
19 }
20 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
21
22 sleep(10)
23 # 獲取當前界面activity
24 ac = driver.current_activity
25 print(ac)
5.? 好了,關(guān)于元素等待目前就說這么多!!!
????????????? 【下面是我整理的2023年最全的軟件測試工程師學習知識架構(gòu)體系圖】
一、Python編程入門到精通
二、接口自動化項目實戰(zhàn)
三、Web自動化項目實戰(zhàn)

四、App自動化項目實戰(zhàn)
五、一線大廠簡歷

六、測試開發(fā)DevOps體系
七、常用自動化測試工具

八、JMeter性能測試
九、總結(jié)(尾部小驚喜)
生命不息,奮斗不止。每一份努力都不會被辜負,只要堅持不懈,終究會有回報。珍惜時間,追求夢想。不忘初心,砥礪前行。你的未來,由你掌握!
生命短暫,時間寶貴,我們無法預知未來會發(fā)生什么,但我們可以掌握當下。珍惜每一天,努力奮斗,讓自己變得更加強大和優(yōu)秀。堅定信念,執(zhí)著追求,成功終將屬于你!
只有不斷地挑戰(zhàn)自己,才能不斷地超越自己。堅持追求夢想,勇敢前行,你就會發(fā)現(xiàn)奮斗的過程是如此美好而值得。相信自己,你一定可以做到!