用selenium做自動化,有時候會遇到需要模擬鼠標操作才能進行的情況,比如單擊、雙擊、點擊鼠標右鍵、拖拽(滑動驗證)等等。而selenium給我們提供了一個類來處理這類事件——ActionChains;
selenium.webdriver.common.action_chains.ActionChains(driver)
這個類基本能夠滿足我們所有對鼠標操作的需求。
actionChains的基本使用:
首先需要了解ActionChains的執行原理,當你調用ActionChains的方法時,不會立即執行,而是會將所有的操作按順序存放在一個隊列里,當你調用perform()方法時,隊列中的時間會依次執行。
這種情況下我們可以有兩種調用方法:
鏈式寫法
menu = driver.find_element_by_css_selector(".div1")
hidden_submenu = driver.find_element_by_css_selector(".div1 #menu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
分步寫法
menu = driver.find_element_by_css_selector(".div1")
hidden_submenu = driver.find_element_by_css_selector(".div1 #menu1")
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()
兩種寫法本質是一樣的,ActionChains都會按照順序執行所有的操作。
actionChains方法列表:
click(on_element=None) ——單擊鼠標左鍵
click_and_hold(on_element=None) ——點擊鼠標左鍵,不松開
context_click(on_element=None) ——點擊鼠標右鍵
double_click(on_element=None) ——雙擊鼠標左鍵
drag_and_drop(source, target) ——拖拽到某個元素然后松開
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某個坐標然后松開
key_down(value, element=None) ——按下某個鍵盤上的鍵
key_up(value, element=None) ——松開某個鍵
move_by_offset(xoffset, yoffset) ——鼠標從當前位置移動到某個坐標
move_to_element(to_element) ——鼠標移動到某個元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移動到距某個元素(左上角坐標)多少距離的位置
perform() ——執行鏈中的所有動作
release(on_element=None) ——在某個元素位置松開鼠標左鍵
send_keys(*keys_to_send) ——發送某個鍵到當前焦點的元素
send_keys_to_element(element, *keys_to_send) ——發送某個鍵到指定元素
示例代碼:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
try:
driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 1、往jd發送請求
driver.get('https://www.jd.com/')
# 找到輸入框輸入圍城
input_tag = driver.find_element_by_id('key')
input_tag.send_keys('華為')
# 鍵盤回車
input_tag.send_keys(Keys.ENTER)
time.sleep(2)
# 找到輸入框輸入墨菲定
input_tag = driver.find_element_by_id('key')
input_tag.clear()
input_tag.send_keys('樊登讀書')
# 找到搜索按鈕點擊搜索
button = driver.find_element_by_class_name('button')
button.click()
time.sleep(10)
finally:
driver.close()
或者前進后退相關
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.cnblogs.com/xuanyuan/')
browser.find_element_by_partial_link_text('我是如何把計算機網絡考了100分的?').click()
time.sleep(3)
browser.back() # 后退
time.sleep(3)
browser.forward() # 前進
time.sleep(5)
browser.close()