selenium三種等待方式

作者:Gakki

前言

  • 在瀏覽器加載一個頁面時,頁面內(nèi)得元素可能是在不同的時間載入的锈拨,這會加大定位元素的困難程度砌庄,因為元素不在DOM里,會拋出ElementNotVisibleException異常奕枢,使用waits娄昆,我們就可以解決這個問題了。
  • 超時的情況大致區(qū)分兩類:
    • 頁面加載出現(xiàn)的超時
    • 獲取頁面元素的超時

等待方式

  • Thread.sleep()方法
  • 隱式等待
    • 它允許您將WebDriver暫停特定的時間缝彬,直到WebDriver在網(wǎng)頁上找到所需的元素為止萌焰。
  • 顯示等待
    • 但是如果我們不知道在加載時該元素是可見/可點擊的,該怎么辦谷浅?正如它出現(xiàn)的時候一樣扒俯,元素是動態(tài)的,并且可能會不時地變化一疯。在這種情況下陵珍,顯式等待將幫助解決此問題。讓我們看一下顯示等待的細節(jié)违施。
    • 顯式等待是動態(tài)Selenium等待的另外一種類型。顯式等待幫助可在特定時間段內(nèi)根據(jù)特定條件停止腳本的執(zhí)行瑟幕。時間到了以后磕蒲,腳本將拋出ElementNotVisibleException異常。在測試人員不確定要等待的時間的情況下只盹,顯式等待會派上大用場辣往。使用elementToBeClickable()textToBePresentInElement()之類的條件,可以等待指定的持續(xù)時間殖卑≌鞠鳎可以結(jié)合使用WebDriverWaitExpectedConditions類來使用這些預(yù)定義方法。

預(yù)期條件的類型

以下是在使用Selenium執(zhí)行自動化測試時通常使用的幾種預(yù)期條件孵稽。

  • visibleOfElementLocated():驗證給定元素是否存在
  • alertIsPresent():驗證是否存在警報许起。
  • elementToBeClickable():驗證給定元素是否在屏幕上存在/可單擊
  • textToBePresentInElement():驗證給定元素是否具有必需的文本
  • titlels():驗證條件十偶,等待具有給定標(biāo)題的頁面

還有更多可用的預(yù)期條件,您可以通過Selenium官方GitHub頁面進行引用园细。與隱式等待一樣惦积,顯式等待也會在每500毫秒后繼續(xù)輪詢。

顯式等待與隱式等待區(qū)別

隱式等待 顯式等待
默認情況下應(yīng)用于腳本中的所有元素猛频。 僅適用于特定條件的特定元素狮崩。
不能基于指定條件(例如元素選擇/可點擊)而不是顯式地等待。 可以根據(jù)特定條件指定等待時間鹿寻。
確定該元素在特定時間內(nèi)可能可見時睦柴,通常使用它 不知道元素可見性的時間時,通常使用它毡熏。它具有動態(tài)性質(zhì)坦敌。

強制等待:sleep()

  • 定義:設(shè)置固定休眠時間,單位為秒招刹。缺點是不智能恬试,使用太多的sleep會影響腳本運行速度。
  • 代碼展示:
    from selenium import webdriver
    from time import sleep
    driver = webdriver.Chrome()
    driver.get("http://www.reibang.com/")
    sleep(5)
    print(driver.current_url)
    driver.quit()
    

隱式等待:implicitly_wait

  • 由webdriver提供的方法疯暑。一旦設(shè)置這個隱式等待會在WebDriver對象實例的整個生命周期起作用训柴,只需要設(shè)置一次即可。它不針對某一個元素妇拯,是全局元素等待幻馁,即在定位元素時,需要等待頁面全部元素加載完成越锈,才會執(zhí)行下一個語句仗嗦。如果超出了設(shè)置時間則拋出異常。
  • 注意: 當(dāng)同時使用隱式等待顯式等待時甘凭,超時時間取二者中較大的
  • driver.implicitly_wait(10) #隱式等待10秒
  • 代碼展示:
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)  # 隱性等待稀拐,最長等10秒
    driver.get("http://www.reibang.com/")
    print(driver.current_url)
    driver.quit()
    

顯式等待:WebDriverWait

  • 定義:
    • 等待某個條件成立時繼續(xù)執(zhí)行,否則在達到最大時長時拋出異常(TimeoutException)
  • WebDriverWait類是由webdriver提供的等待方法丹弱,配合該類提供的until()和until_not()方法一起使用德撬,就可以根據(jù)判斷條件靈活的進行等待。
    • from selenium.webdriver.support.wait import WebDriverWait
  • 調(diào)用方法:
    • WebDriverWait(driver, 超時時長, 調(diào)用頻率, 忽略異常).until(可執(zhí)行方法, 超時時返回的信息)
    • WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None).until()
  • 參數(shù):
    • driver:傳入WebDriver實例躲胳,瀏覽器驅(qū)動
    • timeout:超時時間蜓洪,等待的最長時間
    • poll_frequency:調(diào)用until或until_not中的方法間隔時間,默認是0.5秒
    • ignored_exceptions:忽略的異常坯苹,如果在調(diào)用until或until_not的過程中拋出這個元組中的異常隆檀,則不中斷代碼,繼續(xù)等待。如果拋出的是這個元組外的異常恐仑,則中斷代碼泉坐,拋出異常。默認中有NoSuchElementException菊霜。
  • until與until_not
    • until:當(dāng)某元素出現(xiàn)或什么條件成立則繼續(xù)執(zhí)行
    • until_not:當(dāng)某元素消失或什么條件不成立則繼續(xù)執(zhí)行
  • until與until_not里面的兩個參數(shù)
    • method:在等待期間坚冀,每隔一段時間調(diào)用這個傳入的方法,直到返回值為True;
    • message:如果超時鉴逞,拋出TimeoutException记某,將message傳入異常
  • method的設(shè)置
    • 必須是含有call的可執(zhí)行方法。因此我們引用selenium提供的一個模塊
    • from selenium.webdriver.support import expected_conditions as EC
  • expected_conditions類提供的預(yù)期條件判斷方法:
    1. title_is:判斷當(dāng)前頁面的title是否完全等于(==)預(yù)期字符串构捡,返回布爾值
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    
    driver = webdriver.Chrome()
    driver.get("http://www.reibang.com/")
    locator = (By.CLASS_NAME, 'logo')
    
    title = WebDriverWait(driver, 10).until(EC.title_is('簡書 - 創(chuàng)作你的創(chuàng)作'))
    print(title)
    
    1. title_contains:判斷當(dāng)前頁面的title是否包含預(yù)期字符串液南,返回布爾值
    WebDriverWait(driver, 10).until(EC.title_contains('創(chuàng)作你的創(chuàng)作'))
    
    1. presence_of_element_located:判斷某個元素是否被加到了dom樹里,并不代表改元素一定可見勾徽,如果定位到就返回WebElement
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'logo')))
    
    1. visibility_of_element_located:判斷某個元素是否可見滑凉,可見代表元素非隱藏,并且元素的寬和高都不等于0喘帚,如果可見就返回這個元素畅姊。
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, 'write-btn')))
    
    1. visibility_of:如4一樣,只是4需要傳入locator吹由,而5直接傳所定位到的元素element就可以了若未。
      WebDriverWait(driver, 10).until(EC.visibility_of(driver.find_element(by=By.CLASS_NAME, value='write-btn')))
    
    1. presence_of_all_elements_located:判斷是否至少有1個元素存在于dom樹中。如:某個頁面上含有N個元素的class都是'title'倾鲫,那么只要有1個元素存在就返回列表
    WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'title')))
    
    1. visibility_of_any_elements_located:判斷是否至少有一個元素在頁面中可見粗合,存在就返回列表
    WebDriverWait(driver, 10).until(EC.visibility_of_any_elements_located((By.CLASS_NAME, 'title')))
    
    1. text_to_be_present_in_element:判斷某個元素中的text是否包含了預(yù)期的字符串,返回布爾值
    WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.ID, 'sign_in'), '登錄'))
    
    1. text_to_be_present_in_element_value:判斷某個元素中的value屬性是否包含了預(yù)期的字符串乌昔,返回布爾值
    WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element_value((By.NAME, 'utf8'), '?'))
    
    1. frame_to_be_available_and_switch_to_it:判斷該frame是否可以switch進去隙疚。如果可以,返回True并且switch進去磕道,否則返回False供屉。(很少使用)
    2. invisibility_of_element_located:判斷某個元素中是否不存在于dom樹中或不可見,如果可見返回False溺蕉,不可見返回這個元素
    WebDriverWait(driver, 10).until(EC.invisibility_of_element_located((By.CLASS_NAME, 'popver')))
    # popver在此頁面中是一個隱藏元素
    
    1. element_to_be_clickable:判斷某個元素中是否可見并且是enable的伶丐,這樣的話才叫clickable,才可以點擊
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'sign_up'))).click()
    
    1. staleness_of:等某個元素從dom樹中移除焙贷,返回True。否則返回false
    2. element_to_be_selected:判斷某個元素是否別選中了贿堰,一般用在下拉列表
    3. element_selection_state_to_be:判斷某個元素的選中狀態(tài)是否符合預(yù)期
    4. element_located_selection_state_to_be:跟上面的方法作用一樣辙芍,只是上面的方法傳入定位到的element,而這個方法傳入locator。
    5. alert_is_present:判斷頁面上是否存在alert
    alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
    # 如果有就切換到alert并返回alert的內(nèi)容
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末故硅,一起剝皮案震驚了整個濱河市庶灿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吃衅,老刑警劉巖往踢,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異徘层,居然都是意外死亡峻呕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門趣效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘦癌,“玉大人,你說我怎么就攤上這事跷敬⊙端剑” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵西傀,是天一觀的道長斤寇。 經(jīng)常有香客問我,道長拥褂,這世上最難降的妖魔是什么娘锁? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮肿仑,結(jié)果婚禮上致盟,老公的妹妹穿的比我還像新娘。我一直安慰自己尤慰,他們只是感情好馏锡,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伟端,像睡著了一般杯道。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上责蝠,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天党巾,我揣著相機與錄音,去河邊找鬼霜医。 笑死齿拂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肴敛。 我是一名探鬼主播署海,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼吗购,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砸狞?” 一聲冷哼從身側(cè)響起捻勉,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刀森,沒想到半個月后踱启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡研底,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年埠偿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飘哨。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡胚想,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芽隆,到底是詐尸還是另有隱情浊服,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布胚吁,位于F島的核電站牙躺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腕扶。R本人自食惡果不足惜孽拷,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望半抱。 院中可真熱鬧脓恕,春花似錦、人聲如沸窿侈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽史简。三九已至乃秀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間圆兵,已是汗流浹背跺讯。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殉农,地道東北人刀脏。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像超凳,于是被迫代替她去往敵國和親愈污。 傳聞我的和親對象是個殘疾皇子危队,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344