python3的爬蟲筆記10——Selenium的等待用法

selenium文檔中關(guān)于等待第5章有專門的說明

現(xiàn)在的大多數(shù)的Web應(yīng)用程序是使用Ajax技術(shù)泌神。當(dāng)一個(gè)頁面被加載到瀏覽器時(shí), 該頁面內(nèi)的元素可以在不同的時(shí)間點(diǎn)被加載。這使得定位元素變得困難, 如果元素不再頁面之中,會拋出 ElementNotVisibleException 異常尔觉。 使用 waits, 我們可以解決這個(gè)問題。waits提供了一些操作之間的時(shí)間間隔- 主要是定位元素或針對該元素的任何其他操作芥吟。
Selenium Webdriver 提供兩種類型的waits - 隱式和顯式穷娱。 顯式等待會讓W(xué)ebDriver等待滿足一定的條件以后再進(jìn)一步的執(zhí)行。 而隱式等待讓W(xué)ebdriver等待一定的時(shí)間后再才是查找某元素运沦。

顯式等待:

顯式等待是你在代碼中定義等待一定條件發(fā)生后再進(jìn)一步執(zhí)行你的代碼泵额。 最糟糕的案例是使用time.sleep(),它將條件設(shè)置為等待一個(gè)確切的時(shí)間段携添。 這里有一些方便的方法讓你只等待需要的時(shí)間嫁盲。WebDriverWait結(jié)合ExpectedCondition 是實(shí)現(xiàn)的一種方式。

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

WebDriverWait(driver, 10)設(shè)置了一個(gè)10秒上限的等待時(shí)間
自動化的Web瀏覽器中一些常用的預(yù)期條件烈掠,下面列出的是每一個(gè)實(shí)現(xiàn)羞秤, Selenium Python binding都提供了一些方便的方法,這樣你就不用去編寫 expected_condition類或是創(chuàng)建至今的工具包去實(shí)現(xiàn)他們左敌。傳入的參數(shù)都是元組類型的locator瘾蛋,如(By.ID, 'kw')
expected_conditions as EC后面最最常接的預(yù)期條件:

#frame可見并切換到該frame上
EC.frame_to_be_available_and_switch_to_it
#元素可以點(diǎn)擊,常用于按鍵
EC.element_to_be_clickable
#元素出現(xiàn)矫限,只要一個(gè)符合條件的元素加載出來就通過
EC.presence_of_element_located
#元素出現(xiàn)哺哼,須所有符合條件的元素都加載出來,這個(gè)基本上就是你爬取的最主要內(nèi)容了
EC.presence_of_all_elements_located
#判斷某段文本是否出現(xiàn)在某元素中叼风,常用于判斷輸入頁數(shù)與實(shí)際高亮頁數(shù)是否一致
EC.text_to_be_present_in_element

By后面常接的選擇方式(未列出全部取董,全部請dir(By)查看):

By.CLASS_NAME #根據(jù)class的名稱
By.ID #根據(jù)id的名稱
By.TAG_NAME #根據(jù)標(biāo)簽的名稱

#最最無敵的兩個(gè),直接從開發(fā)者工具中就可以無腦用css或xpath方法復(fù)制元素的位置
By.CSS_SELECTOR #應(yīng)用CSS選擇器方法
By.XPATH #應(yīng)用XPATH選擇器方法

以上一篇文章的登錄QQ空間為例无宿,我們用顯式等待修改下代碼:

from selenium import webdriver
#為了增加顯式等待茵汰,增加以下三個(gè)模塊
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


url = 'http://user.qzone.qq.com/'
driver = webdriver.Chrome()
driver.get(url)
#設(shè)置等待上限10秒
timeout = WebDriverWait(driver, 10)

#切換到登錄框中的frame
timeout.until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'login_frame')))

switcher_plogin = timeout.until(EC.element_to_be_clickable((By.ID, 'switcher_plogin')))
#點(diǎn)擊“帳號密碼登錄”按鈕
switcher_plogin.click()
#定位帳號輸入框
username = timeout.until(EC.presence_of_element_located((By.ID, 'u')))
#username = driver.find_element_by_id('u')
#清空帳號輸入框內(nèi)容
username.clear()
#填寫帳號
username.send_keys('你的賬號')
password = timeout.until(EC.presence_of_element_located((By.ID, 'p')))
#password = driver.find_element_by_id('p')
password.clear()
password.send_keys('你的密碼')
#點(diǎn)擊“登錄”按鈕
log_in = timeout.until(EC.element_to_be_clickable((By.ID, 'login_button'))).click()
#driver.quit()

還可以用username.text獲得標(biāo)簽中的文字信息。

隱式等待

如果某些元素不是立即可用的孽鸡,隱式等待是告訴WebDriver去等待一定的時(shí)間后去查找元素蹂午。 默認(rèn)等待時(shí)間是0秒栏豺,一旦設(shè)置該值,隱式等待是設(shè)置該WebDriver的實(shí)例的生命周期豆胸。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奥洼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子配乱,更是在濱河造成了極大的恐慌,老刑警劉巖皮迟,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搬泥,死亡現(xiàn)場離奇詭異,居然都是意外死亡伏尼,警方通過查閱死者的電腦和手機(jī)忿檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爆阶,“玉大人燥透,你說我怎么就攤上這事”嫱迹” “怎么了班套?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長故河。 經(jīng)常有香客問我吱韭,道長,這世上最難降的妖魔是什么鱼的? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任理盆,我火速辦了婚禮,結(jié)果婚禮上凑阶,老公的妹妹穿的比我還像新娘猿规。我一直安慰自己,他們只是感情好宙橱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布姨俩。 她就那樣靜靜地躺著,像睡著了一般师郑。 火紅的嫁衣襯著肌膚如雪哼勇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天呕乎,我揣著相機(jī)與錄音积担,去河邊找鬼。 笑死猬仁,一個(gè)胖子當(dāng)著我的面吹牛帝璧,可吹牛的內(nèi)容都是我干的先誉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼的烁,長吁一口氣:“原來是場噩夢啊……” “哼褐耳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渴庆,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤铃芦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后襟雷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刃滓,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年耸弄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咧虎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡计呈,死狀恐怖砰诵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捌显,我是刑警寧澤茁彭,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布材蛛,位于F島的核電站舵鳞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缨硝。R本人自食惡果不足惜击罪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一哲嘲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧媳禁,春花似錦眠副、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毫别,卻和暖如春娃弓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岛宦。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工台丛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓挽霉,卻偏偏與公主長得像防嗡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子侠坎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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