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ù)