selenium自動化JS滾動條獲取動態加載的元素


昨天的滾動條是在非動態的頁面加載,但是購物網站,比如京東頁面,他的元素是動態加載的,

動態加載就是頁面滑動到頁面的可是區域才會被加載,

一、先滑動一下,等待新元素加載出來,再尋找元素,沒有則繼續滾動,只到元素出現

 2、獲取當前窗口的可視區域大小

 3、獲取整個HTML的body高度

 4、循環判斷只要整個HTML頁面的高度和現在的高度是否一致,不一致就循環接着找,

 

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])
# 獲取當前窗口的內容可視區域 inner_height = driver.execute_script("var a = window.innerHeight;return a;") print("當前窗口的內容可視區域-高度:", inner_height) # 獲取當前整個html頁面的body高度。 body_height = driver.execute_script("var a = document.body.scrollHeight;return a;") print("當前整個html頁面的body-高度:", body_height) # 京東頁面的內容 - 滾動多少,加載多少。所要操作的內容,並不知道大概要滾動多少。
# 查找的元素定位
lo = (By.XPATH, '//*[@id="J_top"]/div[1]/a/h3') scrolled_height = 0 new_body_height = body_height # 當前整個html頁面的body高度 old_body_height = 0 break_flag = False while new_body_height != old_body_height: distance = int((new_body_height - scrolled_height) / (inner_height * 0.5)) + 1 for i in range(distance): # 滾動距離為 窗口內容可視區域的百分之50.可靈活配置哦!
     # window.innerHeight:返回窗口的文檔顯示區的高度。 window.scrollBy():會使元素從當前的滾動條位置向下滾動
driver.execute_script("var a = window.innerHeight;window.scrollBy(0,a*0.5);") # 滾動一次,頁面內容會更新一部分。在滾動之后,查找當前頁面是否包含了它。如果沒有,繼續滾動。如果有,退出。 try: WebDriverWait(driver, 10).until(EC.visibility_of_element_located(lo)) except: pass else: print("找到啦!!!") driver.find_element(*lo).click() break_flag = True # 終止for循環 break if break_flag is True: # 終止While循環 break # time.sleep(3) # 更新滾動 old_body_height = new_body_height scrolled_height = new_body_height new_body_height = driver.execute_script("var a = document.body.scrollHeight;return a;") print("老 - 當前整個html頁面的body-高度:", old_body_height) print("新 - 當前整個html頁面的body-高度:", new_body_height)

 

簡易版 :搬運  動態加載元素可以這樣獲取


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM