动态加载元素可以这样获取

昨天遇到了一个问题,在京东页面,元素是动态加载的,这个怎么获取呢?

今天总结下这个动态加载的元素获取

因为京东这个网页东西太多,元素也有很多,所以处理的为动态加载,何为动态加载呢?也就是说,滑动到可视区域后才会加载。那么有人可能会有疑问说什么是可视区域呢?

看图说话:

 整个红框就可以看成是可视区域,也就是说只有在这个可视区域里面元素才会加载

定位的是可视区域下面的元素,直接不经过处理就直接点击的话肯定会报错,引用显示等待的不经过下拉滚动条也会报超时的错误

但是如果拉动滚动条的话又不知道拉多少,这可真是个问题呢

昨天中午花了点时间解决了下,下面写写我的解决思路吧

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循环,这种是简单版本的,复杂版本的就类似于要去计算整个滚动条,我需要去滑动多少次才能滑动到底,感觉还是直接写一个死循环吧,达到条件就直接退出。

原文地址:https://www.cnblogs.com/LCboss/p/11949410.html