昨天遇到了一個問題,在京東頁面,元素是動態加載的,這個怎么獲取呢?
今天總結下這個動態加載的元素獲取
因為京東這個網頁東西太多,元素也有很多,所以處理的為動態加載,何為動態加載呢?也就是說,滑動到可視區域后才會加載。那么有人可能會有疑問說什么是可視區域呢?
看圖說話:
整個紅框就可以看成是可視區域,也就是說只有在這個可視區域里面元素才會加載
定位的是可視區域下面的元素,直接不經過處理就直接點擊的話肯定會報錯,引用顯示等待的不經過下拉滾動條也會報超時的錯誤
但是如果拉動滾動條的話又不知道拉多少,這可真是個問題呢
昨天中午花了點時間解決了下,下面寫寫我的解決思路吧
1、首先確認下我們的可視區域有多大?
2、我們一點一點的滑動這個滾動條,讓元素都加載出來,找到我們的元素之后就跳出循環。
好了,既然已經確定了我們的思路了,那就直接上代碼吧,以下代碼是保證這個元素在dom里面,不然會陷入死循環
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.get('http://www.baidu.com') driver.implicitly_wait(5) driver.maximize_window() ele = driver.find_element_by_id('kw') ele.send_keys("京東商城", Keys.ENTER) loc = (By.XPATH, '//a[contains(text(),"正品低價、品質保障")]') WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc)) driver.find_element(*loc).click() win = driver.window_handles driver.switch_to.window(win[-1]) lo = (By.XPATH, '//h3[text()="逛好店"]') while True: js = """ var a = window.innerHeight; window.scrollBy(0, a*0.5); """ driver.execute_script(js) try: WebDriverWait(driver, 3, 0.5).until(EC.visibility_of_element_located(lo)) driver.find_element(*lo).click() except: pass else: break
是不是很簡單,只是加了一個while循環,這種是簡單版本的,復雜版本的就類似於要去計算整個滾動條,我需要去滑動多少次才能滑動到底,感覺還是直接寫一個死循環吧,達到條件就直接退出。