昨天遇到了一个问题,在京东页面,元素是动态加载的,这个怎么获取呢?
今天总结下这个动态加载的元素获取
因为京东这个网页东西太多,元素也有很多,所以处理的为动态加载,何为动态加载呢?也就是说,滑动到可视区域后才会加载。那么有人可能会有疑问说什么是可视区域呢?
看图说话:
整个红框就可以看成是可视区域,也就是说只有在这个可视区域里面元素才会加载
定位的是可视区域下面的元素,直接不经过处理就直接点击的话肯定会报错,引用显示等待的不经过下拉滚动条也会报超时的错误
但是如果拉动滚动条的话又不知道拉多少,这可真是个问题呢
昨天中午花了点时间解决了下,下面写写我的解决思路吧
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循环,这种是简单版本的,复杂版本的就类似于要去计算整个滚动条,我需要去滑动多少次才能滑动到底,感觉还是直接写一个死循环吧,达到条件就直接退出。