Selenium EC 與 Wait

爬蟲經常出現錯誤,多半是沒等待控件加載出來。利用selenium雖然方便,但是還是需要控制一下等待時間。

Selenium有兩個常見的模塊來控制等待。

EC(expected_conditions)

EC作爲預期條件,經常與util()和util_not()連用。

這是EC的16個方法

#這兩個條件類驗證title,驗證傳入的參數title是否等於或在driver.title中
EC.title_is
EC.title_contains
#這兩個條件驗證元素是否出現,傳入的參數都是元組類型的locator,如(By.ID, 'kw')
#一個只要一個符合條件的元素加載出來就通過;另一個必須所有符合條件的元素都加載出來才行
EC.presence_of_element_located((By.CSS_SELECTOR,'.ui-page > div.ui-page-wrap'))
EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.ui-page > div.ui-page-wrap'))
#這三個條件驗證元素是否可見,前兩個傳入參數是元組類型的locator,第三個傳入WebElement
#第一個和第三個其實質是一樣的
EC.visibility_of_element_located
EC.invisibility_of_element_located
EC.visibility_of
#這兩個人條件判斷某段文本是否出現在某元素中,一個判斷元素的text,一個判斷元素的value屬性
EC.text_to_be_present_in_element
EC.text_to_be_present_in_element_value
#這個條件判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id、name、index或WebElement
EC.frame_to_be_available_and_switch_to_it
#這個條件判斷是否有alert出現
EC.alert_is_present
#這個條件判斷元素是否可點擊,傳入locator
EC.element_to_be_clickable
#這四個條件判斷元素是否被選中,第一個條件傳入WebElement對象,第二個傳入locator元組
#第三個傳入WebElement對象以及狀態,相等返回True,否則返回False
#第四個傳入locator以及狀態,相等返回True,否則返回False
EC.element_to_be_selected
EC.element_located_to_be_selected
EC.element_selection_state_to_be
EC.element_located_selection_state_to_be
#最後一個條件判斷一個元素是否仍在頁面中,傳入WebElement對象,可以判斷頁面是否刷新
EC.staleness_of

利用條件來設置等待用的多的是presence_of_element_located

WebDriverWait

from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait爲顯型等待,配合until()和until_not()方法,就能夠根據EC而進行靈活地等待了。
它主要的意思就是:程序每隔xx秒看一眼,如果條件成立了,則執行下一步,
否則繼續等待,直到超過設置的最長時間,然後拋出TimeoutException。

#每隔0.5查看DOM裏中條件是否成立,一般要被try catch包圍
try{
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located((By.ID, "nc_1_n1z")))
    swipe_button = self.browser.find_element_by_id('nc_1_n1z') #獲取滑動拖動控件

    #模擬拽託
    action = ActionChains(self.browser) # 實例化一個action對象
    action.click_and_hold(swipe_button).perform() # perform()用來執行ActionChains中存儲的行爲
    action.reset_actions()
    action.move_by_offset(580, 0).perform() # 移動滑塊
}except TimeoutException as e1:
    print('Timeout: ', e1)
except Exception as e:
    print('get button failed: ', e)


implicitly_wait():隱式等待


當使用了隱式等待執行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間後則拋出找不到元素的異常
換句話說,當查找元素或元素並沒有立即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是0
一旦設置了隱式等待,則它存在整個 WebDriver 對象實例的聲明週期中,隱式的等到會讓一個正常響應的應用的測試變慢,
它將會在尋找每個元素的時候都進行等待,這樣會增加整個測試執行的時間。

driver.implicitly_wait(30)
driver.find_element_by_xpath('//*[@class="weibo-login"]').click()

sleep()

有時候在控件加載出來都可能會進行sleep,以防止網站認爲是爬蟲

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章