本文集鏈接:http://www.reibang.com/nb/25338984
1. 用Xpath查找數(shù)據(jù)時(shí)無法直接獲取節(jié)點(diǎn)屬性
通常在我們使用xpath時(shí)茫舶,可以使用@class
的方式直接獲取節(jié)點(diǎn)的屬性蜂奸,如下所示:
page.xpath('//div/a/@class')
但在Selenium
中不支持這種用法饮焦,只能在找到節(jié)點(diǎn)后山孔,使用get_attribute(name)
方法來獲取屬性:
page.xpath('//div/a').get_attribute('class')
同樣的,Selenium
同樣不支持Xpath中的string()
,text()
這類的方法展鸡,只能獲取元素節(jié)點(diǎn)姨丈。
2. 使用了WebDriverWait以后仍然無法找到元素
有很多時(shí)候捺癞,一個(gè)簡(jiǎn)單的元素,明明也加了顯式等待构挤,但就是找不到髓介,代碼在仔細(xì)查看過后也沒有問題后,多半是以下這幾種情況:
- 由于分辨率設(shè)置的原因筋现,查找的元素當(dāng)前是不可見的唐础。
- 某些頁面的元素是需要向下滾動(dòng)頁面才會(huì)加載的。
- 由于某些其他元素的短暫遮擋矾飞,所以無法定位到一膨。
2.1. 分辨率原因
這時(shí)候應(yīng)該設(shè)置好分辨率,使當(dāng)前元素能夠顯示到頁面中洒沦。
2.2. 需要滾動(dòng)頁面
有些頁面為了性能的考慮豹绪,頁面下方不在當(dāng)前屏幕中的元素是不會(huì)加載的,只有當(dāng)頁面向下滾動(dòng)時(shí)才會(huì)繼續(xù)加載申眼。
而selenium本身不提供向下滾動(dòng)的方法瞒津,所以我們需要去用JS去滾動(dòng)頁面:
driver.excute_script("window.scrollTo(0, document.body.scrollHeight)")
網(wǎng)上查到的一些滾動(dòng)方式在Chrome上無效。但這一句是有效的括尸。
2.3. 由于其他元素的遮擋
有時(shí)候因?yàn)橐恍棾鲈氐脑蛳矧剑绻€使用EC.presence_of_element_located()
的話,我們需要定位的元素就無法被找到濒翻,這個(gè)時(shí)候我們就應(yīng)該改變我們判斷元素的方法:
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.XPATH, ''))
)
使用EC.visibility_of_element_located()
方法可以在等待到當(dāng)前元素可見后屁柏,才獲取元素啦膜。
在我們找不到元素,或者跟元素?zé)o法交互時(shí)淌喻,應(yīng)該多去根據(jù)當(dāng)前的情況僧家,靈活選擇顯式等待的判斷方式。