2019-06-13 selenium 之 <顯性等待> ajax加載完成后

WebDriverWait

wait模塊的WebDriverWait類是顯性等待類,先看下它有哪些參數(shù)與方法:

selenium.webdriver.support.wait.WebDriverWait(類)

init

driver: 傳入WebDriver實(shí)例,即我們上例中的driver
timeout: 超時(shí)時(shí)間喷舀,等待的最長(zhǎng)時(shí)間(同時(shí)要考慮隱性等待時(shí)間)
poll_frequency: 調(diào)用until或until_not中的方法的間隔時(shí)間,默認(rèn)是0.5秒
ignored_exceptions: 忽略的異常灶搜,如果在調(diào)用until或until_not的過(guò)程中拋出這個(gè)元組中的異常邀桑,
        則不中斷代碼瞎疼,繼續(xù)等待,如果拋出的是這個(gè)元組外的異常壁畸,則中斷代碼贼急,拋出異常。默認(rèn)只有NoSuchElementException捏萍。

until

method: 在等待期間太抓,每隔一段時(shí)間(__init__中的poll_frequency)調(diào)用這個(gè)傳入的方法,直到返回值不是False
message: 如果超時(shí)令杈,拋出TimeoutException走敌,將message傳入異常

until_not

與until相反,until是當(dāng)某元素出現(xiàn)或什么條件成立則繼續(xù)執(zhí)行逗噩,
 until_not是當(dāng)某元素消失或什么條件不成立則繼續(xù)執(zhí)行掉丽,參數(shù)也相同异雁,不再贅述纲刀。

看了以上內(nèi)容基本上很清楚了,調(diào)用方法如下:

WebDriverWait(driver, 超時(shí)時(shí)長(zhǎng), 調(diào)用頻率, 忽略異常).until(可執(zhí)行方法, 超時(shí)時(shí)返回的信息)

這里需要特別注意的是until或until_not中的可執(zhí)行方法method參數(shù)驱闷,很多人傳入了WebElement對(duì)象空另,如下:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))  # 錯(cuò)誤

這是錯(cuò)誤的用法扼菠,這里的參數(shù)一定要是可以調(diào)用的循榆,即這個(gè)對(duì)象一定有 __call__() 方法墨坚,否則會(huì)拋出異常:

TypeError: 'xxx' object is not callable

在這里泽篮,你可以用selenium提供的 expected_conditions 模塊中的各種條件帽撑,也可以用WebElement的 **is_displayed() 亏拉、is_enabled()及塘、is_selected() **方法磷蛹,或者用自己封裝的方法都可以,那么接下來(lái)我們看一下selenium提供的條件有哪些:

expected_conditions

expected_conditions是selenium的一個(gè)模塊庇勃,其中包含一系列可用于判斷的條件:

selenium.webdriver.support.expected_conditions(模塊)

以下兩個(gè)條件類驗(yàn)證title,驗(yàn)證傳入的參數(shù)title是否等于或包含于driver.title 
title_is 
title_contains

以下兩個(gè)條件驗(yàn)證元素是否出現(xiàn)罕拂,傳入的參數(shù)都是元組類型的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ù)是元組類型的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

以下條件判斷frame是否可切入锥债,可傳入locator元組或者直接傳入定位方式:id哮肚、name允趟、index或WebElement 
frame_to_be_available_and_switch_to_it

以下條件判斷是否有alert出現(xiàn) 
alert_is_present

以下條件判斷元素是否可點(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

上面是所有17個(gè)condition关摇,與until输虱、until_not組合能夠?qū)崿F(xiàn)很多判斷宪睹,如果能自己靈活封裝亭病,將會(huì)大大提高腳本的穩(wěn)定性。

爬取頁(yè)面邮屁,列表的渲染使用ajax

直接加載會(huì)報(bào)錯(cuò),找不到元素

需要等待元素渲染完畢之后才可以找到民珍,分別使用三種等待方式加載渲染后的信息

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import time

options = webdriver.ChromeOptions()
options.add_argument('test-type')
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"])
# options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)

driver.get('http://www.ahaoboy.cn:2222')
# 強(qiáng)制等待
# time.sleep(1)

# 隱性等待
# driver.implicitly_wait(1)

# 顯性等待
locator = (By.CSS_SELECTOR, '.ivu-alert.ivu-alert-info')
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))

items = driver.find_elements_by_css_selector('.ivu-alert.ivu-alert-info')
for i in items:
    print(i.text)

1, 迷宮尋路
2, 三子棋
3, N皇后
4, 約瑟夫環(huán)
5, 哈夫曼編碼
6, 拼數(shù)字小游戲
7, 簡(jiǎn)單掃雷
8, one-line-game
9, AVL樹(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梨州,更是在濱河造成了極大的恐慌暴匠,老刑警劉巖每窖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稽莉,死亡現(xiàn)場(chǎng)離奇詭異肩祥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)将饺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)湖饱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)井厌,“玉大人,你說(shuō)我怎么就攤上這事∏肫酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵释树,是天一觀的道長(zhǎng)奢啥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捞蛋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任拿穴,我火速辦了婚禮忧风,結(jié)果婚禮上默色,老公的妹妹穿的比我還像新娘。我一直安慰自己狮腿,他們只是感情好腿宰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布弟蚀。 她就那樣靜靜地躺著,像睡著了一般酗失。 火紅的嫁衣襯著肌膚如雪义钉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天规肴,我揣著相機(jī)與錄音捶闸,去河邊找鬼。 笑死拖刃,一個(gè)胖子當(dāng)著我的面吹牛删壮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兑牡,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼央碟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了均函?” 一聲冷哼從身側(cè)響起亿虽,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苞也,沒(méi)想到半個(gè)月后洛勉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡如迟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年收毫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殷勘。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡此再,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玲销,到底是詐尸還是另有隱情输拇,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布痒玩,位于F島的核電站淳附,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蠢古。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一别凹、第九天 我趴在偏房一處隱蔽的房頂上張望草讶。 院中可真熱鬧,春花似錦炉菲、人聲如沸堕战。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘱丢。三九已至薪介,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間越驻,已是汗流浹背汁政。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缀旁,地道東北人记劈。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像并巍,于是被迫代替她去往敵國(guó)和親目木。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容