前言
①在HTML頁面中,由於前端技術框架的原因,頁面中的一些元素為動態顯示,元素根據滾動條的下拉而被加載(元素在當前顯示的頁面不可見,拖動頁面下拉直到該元素出現,此時才可以定位到該元素。)。
②例如:頁面注冊同意條款,需要滾動條到最底層,才能點擊同意。
實例
下面一個網頁,需要進行拖動頁面下拉條后才能通過selenium代碼找到密碼輸入框的元素。
拖動頁面下拉條后:
方法①:使用JavaScript腳本直接操作滾動條元素向下拖動
注意:這里的id為滾動條的id,但js中沒有xpath的方法,所以滾動條沒有id的網頁此方法不適用。
js = "var q=document.getElementById('id').scrollTop=10000"
driver.execute_script(js)
或者:
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
方法②:使用JavaScript腳本將滾動條拖動到指定地方:
聚焦元素:就是把滾動條滾動到你想要查找的元素的位置
# 1 定位需要聚焦元素 target = driver.find_element_xx # 2 js代碼 js = "arguments[0].scrollIntoView();" # 3 執行聚焦元素操作 driver.execute_script(js代碼, 元素target)
注意:使用該方法需要獲取將滾動條拖動至指定元素的元素對象定位。
target = driver.find_element_by_id("id_keypair") # 需要將滾動條拖動至的指定的元素對象定位
driver.execute_script("arguments[0].scrollIntoView();", target) # 將滾動條拖動到元素可見的地方
該方法可以將頁面滾動條拖動到需要顯示的元素位置,此方法用途比較廣,可以使用。
示例:
頁面代碼:
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <style type="text/css"> button{padding: 8px; background: #f8f8f8;border-radius: 5px} button{margin-left:200px;margin-top:2000px} </style> </head> <body> <button type="submitA" value="注冊A" title="加入會員A" >注冊用戶A</button> </body> </html>
腳本代碼:
""" 1.學習目標: 掌握聚焦元素的操作方法 2.語法(操作方法) 2.1 定位需要聚焦元素 target = driver.find_element_xx 2.2 js代碼 js = "arguments[0].scrollIntoView()" 2.3 執行聚焦元素操作 driver.execute_script(js代碼,元素target) 3.需求 在頁面中,滾動條下拉聚焦元素位置。 """ # 1.導入selenium from selenium import webdriver from time import sleep import os # 2.打開瀏覽器 driver = webdriver.Chrome() # 3.打開頁面 url = "file:///" + os.path.abspath("./1.html") driver.get(url) sleep(2) # 4.滾動條下拉聚焦元素位置 # 4.1 定位需要聚焦元素-淘寶首頁的END文字 element = driver.find_element_by_css_selector("[type='submitA']") # 4.2 js代碼 js = "arguments[0].scrollIntoView()" # 4.3 執行聚焦元素操作 driver.execute_script(js, element) sleep(3) # 5.關閉瀏覽器 driver.quit()
方法③:根據頁面顯示進行變通實現滾動條下拉效果:
在本實例中的頁面中,密碼是輸入框,正常手工操作時,可以通過tab鍵可以從用戶框切換到密碼框中,所以根據此思路,在腳本中也可以發送tab鍵來切換,使元素顯示。
from selenium.webdriver.common.keys import Keys # 導入Keys類 driver.find_element_by_id("id_login_method_0").send_keys(Keys.TAB) # 定位元素並操作輸入
方法④:send_keys(Keys.Space) 模擬向頁面發送空格鍵實現滾動條下拉效果:
注意:發送空格鍵的元素應該是整個頁面對象,比如說定位到頁面body后進行操作。
# coding=utf-8 import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import TimeoutException browser = webdriver.Chrome(executable_path="G:/dj/chromedriver.exe") browser.set_window_size(1400, 900) def search(): try: browser.get("https://www.taobao.com") for i in range(5): browser.find_element_by_tag_name('body').send_keys(Keys.SPACE) time.sleep(1) except TimeoutException: search() search()
方法⑤:鼠標移動到指定元素位置
# coding=utf-8 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.action_chains import ActionChains browser = webdriver.Chrome("G:/dj/chromedriver.exe") browser.set_window_size(1400, 900) def search(): try: browser.get("https://www.taobao.com") target = browser.find_element_by_css_selector('body > div:nth-child(29)') actions = ActionChains(browser) actions.move_to_element(target) actions.perform() except TimeoutException: search() search()
方法⑥:操作滾動條實現
""" 設置JavaScritp腳本控制滾動條 """ js = "window.scrollTo(0, 1000)" # (0:水平距離;1000:垂直距離;單位像素px) """ WebDriver調用JavaScritp腳本方法 """ driver.execute_script(js) # 提示: """最頂層""" js = "window.scrollTo(0,0)" """最底層""" js = "window.scrollTo(0,1000)" # 注:1000不代表一定到最底層,要根據瀏覽器頁面的實際大小。 """ 直接操作垂直距離的方式 """ js = "var q=document.documentElement.scrollTop=n"
示例:
""" 1.學習目標: 掌握瀏覽器滾動條的操作方法 2.語法 2.1使用js語言編寫控制滾動條代碼 參數: 0,表示水平距離; 10000,表示垂直距離 單位:px 格式: 向下滾動:window.scrollTo(0,10000) 向上滾動:window.scrollTo(0,0) 2.2使用selenium中方法執行js代碼 driver.execute_script(js代碼) 3.需求 在頁面中,控制滾動條 4.總結 如果需要測試寫的js代碼,可以在瀏覽器F12,控制台console中執行查看結果。 """ # 1.導入selenium from selenium import webdriver from time import sleep # 2.打開瀏覽器 driver = webdriver.Chrome() # 3.打開頁面 url = "https://www.taobao.com" driver.get(url) sleep(2) # 4.滾動條操作 # 4.1 滾動條向下滾動 js_down = "window.scrollTo(0,1000)" # 執行向下滾動操作 driver.execute_script(js_down) sleep(2) # 4.2 滾動條向上滾動 js_up = "window.scrollTo(0,0)" driver.execute_script(js_up) sleep(2) # 向下滾動操作 # n為從頂部往下移動滾動距離 js1 = "var q=document.documentElement.scrollTop=2000" driver.execute_script(js1) sleep(2) # 5.關閉瀏覽器 driver.quit()
注意:
window.scrollBy(0, 100):從當前位置向下滾動100像素;
window.scrollTo(0,100):從0滾動到100像素,
這兩個方法都是滾動操作,但是scrollTo方法只會從0像素滾動到100像素,除非修改數值才可以滾動到對應像素位置,二scrollBy則會一直向下滾動。
# coding=utf-8 import time from selenium import webdriver from selenium.common.exceptions import TimeoutException def search(): t = True time.sleep(1) while t: driver.execute_script("window.scrollBy(0, 1000)") try: driver.find_element('link_text', '沒有更多推薦了,返回首頁').click() time.sleep(1) t = False except TimeoutException: search() if __name__ == '__main__': driver = webdriver.Chrome() driver.get("https://blog.csdn.net/sily_z/article/details/80733267") driver.maximize_window()