在爬取網頁的過程中,經常會遇到壹些彈窗的情況,有alert、confirm、prompt等三種,區別如下:
提示消息框 提供了壹個文本字段,用戶可以在此字段輸入壹個答案來響應您的提示。該消息框有壹個“確定”按鈕和壹個“取消”按鈕。如果您提供了壹個輔助字符串參數,則提示消息框將在文本字段顯示該輔助字符串作為默認響應。否則,默認文本為 "<undefined>"。
這三種彈窗的***同點是,彈出之後妳是獲取不到任何網頁內容的,也就是無法通過常規的driver.find_element_by_xpath這種形式來獲取元素。F12是沒有任何內容,也無法點選的。
selenium另外有壹套方法來把driver轉換到彈窗上:
其中driver就是妳設置好的瀏覽器句柄,switch_to.alert代表妳當前的彈窗類型,alert就對應alert,accept的意思就是點確定,另外還有dismiss等用法,網上很多了,不詳細說。
用這個語句,就可以把彈窗點掉,之後正常操作,但是我重點想說的是以下內容:
在實際網頁中,往往彈窗會有壹定延時,這時候妳用這個語句就會報壹個no such alert的錯誤,意味著獲取不到彈窗,此時要用如下的辦法解決:
引用Webdriver類,裏面的參數第壹個是句柄,第二個則是超時等待時間,這裏是10秒鐘。
Webdriver這種方法叫做 顯示等待 ,用壹個默認頻率不停的刷新(默認是0.5s),檢測當前頁面元素是否存在,如果超過10秒則拋出TimeOut。
很顯然,這種方法比壹般的sleep效率要高。
wait.until(EC.alert_is_present())就是判斷彈窗是否存在,如果存在,那麽就不會拋出異常,繼續走下壹步也就是獲取到彈窗點擊確定。
之後就可以進行正常的操作了。