1. 程式人生 > >Selenium phantomjs與spynner等待網頁載入完成方式總結

Selenium phantomjs與spynner等待網頁載入完成方式總結

利用無頭瀏覽器對網頁元素進行模擬操作時經常遇到的問題就是**元素不存在這樣的錯誤。原因大概有這麼幾種。
1. 網頁沒有載入完成,因此定位不到元素
2. 網頁元素顯示樣式設定為不可見,即display:none,常見的如一些懸停顯示的選單。
3. 元素在iframe 中,常見的情況比如騰訊網站的登入框。
一般來講,在網頁原始碼中能夠看到的且display屬性設定為可見的元素,selenium等工具才能夠正常定位,要不然就會出現元素不存在的錯誤。

第2種情況可以使用一些模擬行為觸發不可見的元素,或者呼叫jsjquery修改display屬性。
第3種情況selenium可以使用switch_to_frame()

切換iframe

本文重點說下第一種情況,網頁只有完全載入,元素才可能被定位,但是網頁是否載入完成又該怎麼判斷、處理呢。
常見處理方法如下:
1. time.sleep()直接等待幾秒鐘,等待網頁載入完成,這種方法很死板,網頁載入是否載入也不能預測,只能撞大運,但也是最簡單的一種方法。
2. selenium的driver.implicitly_wait(),隱式等待,全域性性設定,只用設定一次就可以。
3. selenium的WebDriverWait(driver, 100).until(lambda x: x.find_element_by_xpath('.WB_FEED')),顯式等待
4. spynner的br.wait_for_content(lambda br: 'WB_feed' in br.html)

,類似於selenium的顯式等待
5. spynner的各類操作,如load、click等等操作均內建了等待內容載入的引數,原來的引數如br.click('div.login-switch', wait_load=True),新版的引數形式如br.load("html_controls.html", 1, wait_callback=wait_load)