1.強(qiáng)制等待(sleep)
設(shè)置等待最簡(jiǎn)單的方法就是強(qiáng)制等待穆役,其實(shí)就是time.sleep()方法获三,不管它什么情況旁蔼,讓程序暫停運(yùn)行一定時(shí)間,時(shí)間過(guò)后繼續(xù)運(yùn)行疙教;缺點(diǎn)時(shí)不智能棺聊,設(shè)置的時(shí)間太短,元素還沒(méi)有加載出來(lái)松逊,那照樣會(huì)報(bào)錯(cuò)躺屁;設(shè)置的時(shí)間太長(zhǎng),則會(huì)浪費(fèi)時(shí)間经宏,不要小瞧每次幾秒的時(shí)間犀暑,case多了,代碼量大了烁兰,很多個(gè)幾秒就會(huì)影響整體的運(yùn)行速度了耐亏;所以盡量少用這個(gè)
2.隱性等待(implicitly_wait())
driver.implicitly_wait(),隱性等待設(shè)置了一個(gè)時(shí)間沪斟,在一段時(shí)間內(nèi)網(wǎng)頁(yè)是否加載完成广辰,如果完成了,就進(jìn)行下一步主之;在設(shè)置的時(shí)間內(nèi)沒(méi)有加載完成择吊,則會(huì)報(bào)超時(shí)加載;
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(20) # 隱性等待槽奕,最長(zhǎng)等30秒
driver.get('https://www.baidu.com')
time.sleep(3)
driver.quit()
缺點(diǎn)也是不智能几睛,因?yàn)殡S著ajax技術(shù)的廣泛應(yīng)用,頁(yè)面的元素往往都可以時(shí)間局部加載粤攒,也就是在整個(gè)頁(yè)面沒(méi)有加載完的時(shí)候所森,可能我們需要的元素已經(jīng)加載完成了囱持,那就么有必要再等待整個(gè)頁(yè)面的加載,執(zhí)行進(jìn)行下一步焕济,而隱性等待滿足不了這一點(diǎn)纷妆;
另外一點(diǎn),隱性等待的設(shè)置時(shí)全局性的晴弃,在開(kāi)頭設(shè)置過(guò)之后掩幢,整個(gè)的程序運(yùn)行過(guò)程中都會(huì)有效,都會(huì)等待頁(yè)面加載完成肝匆;不需要每次設(shè)置一遍粒蜈;
3.顯性等待(WebDriverWait)
WebDriverWait(driver, 20, 0.5).until(expected_conditions.presence_of_element_located(locator))顺献,selenium中的wait模塊的WebDriverWait()方法旗国,配合until或者until_not方法,再輔助以一些判斷條件注整,就可以構(gòu)成這樣一個(gè)場(chǎng)景:每經(jīng)過(guò)多少秒就查看一次locator的元素是否可見(jiàn)能曾,如果可見(jiàn)就停止等待,如果不可見(jiàn)就繼續(xù)等待直到超過(guò)規(guī)定的時(shí)間后肿轨,報(bào)超時(shí)異常寿冕;當(dāng)然也可以判斷某元素是否在規(guī)定時(shí)間內(nèi)不可見(jiàn)等等的各種場(chǎng)景吧,需要根據(jù)你自己實(shí)際的場(chǎng)景選擇判斷條件椒袍;
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get('https://huilansame.github.io')
WebDriverWait(driver,20,0.5).until(
EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))
print driver.find_element_by_link_text('CSDN').get_attribute('href')
driver.close()
在本示例中驼唱,我們?cè)O(shè)置了隱性等待(10秒)和顯性等待(20秒),在其他的操作中隱性等待起決定性作用驹暑,在示例中的WebDriverWait設(shè)置了顯性等待的地方玫恳,則顯性等待起決定性作用,但要注意的是:最長(zhǎng)等待時(shí)間取決于兩者之間的大值优俘,所以這里顯性等待的最長(zhǎng)時(shí)間為20s京办。
selenium.webdriver.support.expected_conditions(模塊)
這兩個(gè)條件類(lèi)驗(yàn)證title,驗(yàn)證傳入的參數(shù)title是否等于或包含于driver.title
title_is
title_contains
這兩個(gè)人條件驗(yàn)證元素是否出現(xiàn)帆焕,傳入的參數(shù)都是元組類(lèi)型的locator惭婿,如(By.ID, 'kw')
顧名思義,一個(gè)只要一個(gè)符合條件的元素加載出來(lái)就通過(guò)叶雹;另一個(gè)必須所有符合條件的元素都加載出來(lái)才行
presence_of_element_located
presence_of_all_elements_located
這三個(gè)條件驗(yàn)證元素是否可見(jiàn)财饥,前兩個(gè)傳入?yún)?shù)是元組類(lèi)型的locator,第三個(gè)傳入WebElement
第一個(gè)和第三個(gè)其實(shí)質(zhì)是一樣的
visibility_of_element_located
invisibility_of_element_located
visibility_of
這兩個(gè)人條件判斷某段文本是否出現(xiàn)在某元素中折晦,一個(gè)判斷元素的text钥星,一個(gè)判斷元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value
這個(gè)條件判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id筋遭、name打颤、index或WebElement
frame_to_be_available_and_switch_to_it
這個(gè)條件判斷是否有alert出現(xiàn)
alert_is_present
這個(gè)條件判斷元素是否可點(diǎn)擊暴拄,傳入locator
element_to_be_clickable
這四個(gè)條件判斷元素是否被選中,第一個(gè)條件傳入WebElement對(duì)象编饺,第二個(gè)傳入locator元組
第三個(gè)傳入WebElement對(duì)象以及狀態(tài)乖篷,相等返回True,否則返回False
第四個(gè)傳入locator以及狀態(tài)透且,相等返回True撕蔼,否則返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
最后一個(gè)條件判斷一個(gè)元素是否仍在DOM中,傳入WebElement對(duì)象秽誊,可以判斷頁(yè)面是否刷新了
staleness_of
特別注意:
很多時(shí)候大家在使用until或until_not時(shí)鲸沮,會(huì)將一個(gè)WebElement對(duì)象傳入給method,如下:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # 這是錯(cuò)誤的用法
這里的參數(shù)一定要是可調(diào)用的锅论,這個(gè)對(duì)象一定要有call()方法讼溺,否則會(huì)拋出異常:
TypeError: 'xxx' object is not callable
在這里,也可以用selenium2提供的expected_conditions模塊中提供的各種條件最易,也可用WebElement中的is_displayed()怒坯,is_selected(),is_enabled()方法或是自己封裝的方法均可藻懒。下面我們?cè)倏纯磗elenium提供了哪些條件剔猿,如圖所示: