4.1 等待函數癈使用
4.1.1 為什么要使用等待函數
我們在做自動化的時候很多時候都不是很順利,不是因為app的問題,我們的腳本也沒問題,但是很多時候都會報錯,比如一個頁面本來就有id為1的這個元素,可是我無論怎么定位他都沒辦法操作,然后報錯,這個是怎么個情況呢?因為當我們app打開一個頁面的時候我們的appium的運行速度過快那么可能害沒有將頁面的資源解析完成然后你就去操作了,這樣能行嗎?肯定不行的,這樣不報錯誰錯呢?所以在很多的時候我們都需要加載等待時間的。那什么時候為每個頁面都加載等待時間呢?
4.1.2 什么時候用等待函數
自動化的目的是高效,如果你每個頁面都去添加等待時間那么執行下來的效率是不是大大降低了?在加載等待時間時我們需要根據自己的判斷去增加,比如一些頁面資源較多加載慢了那你肯定需要加的。是不是都是這樣呢?其實不是的,下面介紹幾種不同類型的等待。
4.2 強制等待
4.2.1 什么是強制等待
故名思義就是你必須給我等,有點耍流氓的意思。比如:我進入到登陸頁面,剛好有一個強制等待的函數,那么結果就是無論頁面的資源加載完沒有你都得給我等着。
4.2.2 強制等待使用
import time time.sleep(10) #單位秒
備注:調試程序的時候這樣寫寫就好,千萬別在實際項目中多用。因為這個time的等待是線程的死等,就是無論如何都會執行這一條語句,如果你在實際項目中去運行那么你會發現效率會很慢。所以實際項目不推薦
4.2.3 強制等待封裝
#!/usr/bin/env python # -*- codinfg:utf-8 -*- ''' @author: Jeff LEE @file: 等待函數.py @time: 2018-07-30 11:08 @desc: ''' import time from appium import webdriver import os def Case(platformName, platformVersion, deviceName, app, appPackage, appActivity): PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p)) # print getConfig("baseconf", "platformName") desired_caps = {} desired_caps['platformName'] = platformName # 設置平台 desired_caps['platformVersion'] = platformVersion # 系統版本 desired_caps['deviceName'] = deviceName # 設備id # desired_caps['autoLaunch'] = 'true' # 是否自動啟動 # desired_caps['noReset'] = 'true' # desired_caps['newCommandTimeout'] = 20 # desired_caps['app'] = PATH(app) # 安裝包路徑,放在該py文件的目錄下) desired_caps['appPackage'] = appPackage # 包名 desired_caps['appActivity'] = appActivity # 啟動的activity driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) waitFor(5)
# 等待函數 def waitFor(t): time.sleep(t)
4.3 隱式等待
4.3.1 什么是隱式等待
driver.implicitly_wait(10) #單位秒
隱式等待,顧名思義看不見,也可理解為智能等待,從上面函數可以看出,這個等待函數是webdriver提供的一個等待函數,它是針對我們整個driver的。也就是說你只要是用driver去操作一個對象,或者一個元素,當你找不到這個元素或者對象的時候他就會自動的去等待你設置的這個超時時間,如果在超時時間內還沒有找到,程序才會報錯。
4.3.2 隱式等待封裝
#!/usr/bin/env python # -*- codinfg:utf-8 -*- ''' @author: Jeff LEE @file: 等待函數.py @time: 2018-07-30 11:08 @desc: ''' import time from appium import webdriver import os def Case(platformName, platformVersion, deviceName, app, appPackage, appActivity): PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p)) # print getConfig("baseconf", "platformName") desired_caps = {} desired_caps['platformName'] = platformName # 設置平台 desired_caps['platformVersion'] = platformVersion # 系統版本 desired_caps['deviceName'] = deviceName # 設備id # desired_caps['autoLaunch'] = 'true' # 是否自動啟動 # desired_caps['noReset'] = 'true' # desired_caps['newCommandTimeout'] = 20 # desired_caps['app'] = PATH(app) # 安裝包路徑,放在該py文件的目錄下) desired_caps['appPackage'] = appPackage # 包名 desired_caps['appActivity'] = appActivity # 啟動的activity driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) waitFor(5) return driver # 等待函數 def waitFor(t): time.sleep(t) # 隱式等待 def implicit_for_wait(t): driver = Case(platformName, platformVersion, deviceName, app, appPackage, appActivity) driver.implicitly_wait(t)
4.4 顯示等待
4.4.1 什么是顯示等待
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
首先我們來弄明白這個方法里面幾個參數的含義:
1、driver:是我們操作的driver。
2、timeout:超時時間,也就是我們找這個元素要找多久
3、poll_frequency:間隔時間,怎么理解?就是說在超時時間內每多少秒去查詢一次,默認情況是0.5秒一次
4、ignored_exceptions:異常,就是沒有找到程序拋出什么異常。在默認情況是跑出:NoSuchElementException
4.4.2 顯示等待封裝
#!/usr/bin/env python # -*- codinfg:utf-8 -*- ''' @author: Jeff LEE @file: 等待函數.py @time: 2018-07-30 11:08 @desc: ''' import time import os from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait def Case(platformName, platformVersion, deviceName, app, appPackage, appActivity): PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p)) # print getConfig("baseconf", "platformName") desired_caps = {} desired_caps['platformName'] = platformName # 設置平台 desired_caps['platformVersion'] = platformVersion # 系統版本 desired_caps['deviceName'] = deviceName # 設備id # desired_caps['autoLaunch'] = 'true' # 是否自動啟動 # desired_caps['noReset'] = 'true' # desired_caps['newCommandTimeout'] = 20 # desired_caps['app'] = PATH(app) # 安裝包路徑,放在該py文件的目錄下) desired_caps['appPackage'] = appPackage # 包名 desired_caps['appActivity'] = appActivity # 啟動的activity driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) waitFor(5) return driver # 等待函數 def waitFor(t): time.sleep(t) # 隱式等待 def implicit_for_wait(t): driver = Case(platformName, platformVersion, deviceName, app, appPackage, appActivity) driver.implicitly_wait(t) #顯示等待 def wait(t): driver = Case(platformName,platformVersion,deviceName,app,appPackage,appActivity) WebDriverWait(driver, 10,5).until(lambda driver:driver.find_element_by_id("XXXX"))