在使用selenium+爬蟲的時候,經常會遇到一個問題,就是NoSuchElementException,定位不到元素的問題
一,打開了新頁面,一般selenium點擊新鏈接跳轉打開了一個新頁面,那么定位不到元素就很正常了,這種情況一般我們使用driver.get(url)來代替click(),dirver.get(url)就不會打開信的界面,而是在原來的瀏覽器上刷新了頁面
二,frame,如果說一個頁面里有frame或者iframe的話,也會定位不到元素,這種我們要switch_to.frame(),先跳轉到要定位的元素所在的frame上,才能進一步定位
三,動態的id或者xpath,這種很隱蔽,我之前使用driver.find_element_by_xpath()一直定位不到元素,后來發現xpath是動態的,最后使用了find_element_by_css_selector定位到了,還有的情況是xpath絕對定位不到,可以使用xpah的相對定位。/html/body/div[2]/div[1]/div/div[3]/a[7]這是絕對定位,如果中間的元素有變動或者隱藏了,那么它就沒法定位到。r'//*[@id ='ul' ]/a[7]'這個是相對定位,結合了id定位,這種定位就比較精准。
四,對話框的話,分為兩大類,第一類就是一個隱藏的div綁定的click點擊事件,這種情況直接用id或者name定位就可以了。第二類是alert或者confirm這種windows對話框,這種對話框,要通過switch_to_alert.accept()或者swicth_to_alert.dismiss()這種處理。
五,等待時間不夠,頁面還沒加載出來。
下面舉個例子,selenium模擬登陸百度登陸對話框
# coding=utf-8 from selenium import webdriver import time obj = webdriver.Firefox() obj.get('https://www.baidu.com/') obj.find_element_by_xpath(r'//*[@id="u1"]/a[7]').click() time.sleep(1) obj.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click() # obj.find_element_by_class_name('tang-content').find_element_by_name('userName').send_keys('1712256304') obj.find_element_by_id('TANGRAM__PSP_10__userName').send_keys('12341241') obj.find_element_by_id('TANGRAM__PSP_10__password').send_keys('123423') obj.find_element_by_id('TANGRAM__PSP_10__submit').click()