selenium報(bào)錯(cuò)Element is not clickable at point及四種解決方法
selenium報(bào)錯(cuò)Element is not clickable at point及四種解決方法
使用Selenium時(shí),觸發(fā)點(diǎn)擊事件,經(jīng)常報(bào)如下異常:
Element is not clickable at point
?
1、未加載
沒(méi)加載出來(lái)就等待元素加載出來(lái),再往下執(zhí)行。
可以使用python庫(kù)time
不過(guò)最好還是使用selenium自帶WebDriverWait
2、在iframe里
如果元素在iframe里,在窗口里找是找不到元素的,更是無(wú)法點(diǎn)擊。所以,要切換到iframe里去找元素。
3、不在視窗里,需要拉滾動(dòng)條
很多網(wǎng)站的列表頁(yè)不是立馬返回所有內(nèi)容,是根據(jù)視圖來(lái)顯示的。所以,我們就需要拖動(dòng)滾動(dòng)條來(lái)把要獲取的內(nèi)容顯示到視窗里才可以獲取到。
js="var q=document.documentElement.scrollTop=100000"?? driver.execut_script(js)
#滑動(dòng)到頂部??? js="var q=document.documentElement.scrollTop=0"??? driver.execut_script(js)
#滑到底部??? js="window.scrollTo(0,100000)"???? driver.execute_script(js)
#滑動(dòng)到頂部??? js="window.scrollTo(0,0)"????? driver.execute_script(js)
目前在firefox,chrome上驗(yàn)證都是可以跑通的
4、要點(diǎn)擊的元素被覆蓋
可以使用事件鏈來(lái)解決
例如下拉菜單,通過(guò)hover,讓子菜單顯示,就可以點(diǎn)擊了。
menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
5、要點(diǎn)擊的元素被遮擋
如圖:無(wú)法點(diǎn)擊go,被前面的懸浮元素遮擋
3. 解決方案
現(xiàn)在我們已經(jīng)了解到錯(cuò)誤的原因,接下來(lái)我們來(lái)聊聊解決方案,如果元素被擋住的話有兩種情況:
遮擋是臨時(shí)的
在這種情況下,我們可以添加等待,等待元素可被點(diǎn)擊。具體方法可參考?Selenium系列教程 - 解讀selenium等待方式?和?Selenium系列教程 - WebDriverWait 詳解以及自定義判斷條件?。WebDriverWait(driver, 10).until(EC.element_to_be_clickable(("id", "su")))
遮擋是永久的
在這種情況下,我們可以調(diào)用 JavaScript 直接在元素上發(fā)送單擊。調(diào)用 JavaScript 可參考?Selenium系列教程 - 調(diào)用JavaScript?。driver.execute_script("arguments[0].click()", element)
?(此為通用的解決方法)