selenium鼠標(biāo)操作實(shí)戰(zhàn)案例詳解
前言
人類頻繁的用手操作鼠標(biāo)和鍵盤,為了解決這個(gè)問(wèn)題,selenium工具為我們提供了一個(gè)類來(lái)處理這些事件— Actionchains ,該類可以完成鼠標(biāo)移動(dòng),鼠標(biāo)點(diǎn)擊事件、鍵盤輸入、內(nèi)容菜單交互等交互行為。
1、常見的鼠標(biāo)操作有:?jiǎn)螕?、右鍵點(diǎn)擊、雙擊、移動(dòng)鼠標(biāo)、拖拽鼠標(biāo)。( Actionchains 代替人類之手去模擬鼠標(biāo)操作,比如單擊、雙擊、點(diǎn)擊右鍵、拖拽、長(zhǎng)按等動(dòng)作)
2、selenium工具中全局鼠標(biāo)操作語(yǔ)法如下:
第1步:初始化ActionChians類(動(dòng)作鏈條): actions = ActionChains(driver)
第2步:找到要操作的元素: find_element
第3步:調(diào)用鼠標(biāo)操作方法: actions.move_to_element(element)
第4步:執(zhí)行鼠標(biāo)操作方法: actions.perform()
3、實(shí)際上在調(diào)用 Actionchains 類的方法時(shí),不會(huì)立即執(zhí)行鼠標(biāo)操作,而是會(huì)將所有的操作按順序存放在一個(gè)隊(duì)列里,最終調(diào)用 perform() 方法時(shí),隊(duì)列中的操作會(huì)依次進(jìn)行。
( ActionChains 類提供了對(duì)動(dòng)作的鏈?zhǔn)讲僮?,也就是可以生成一個(gè)操作的隊(duì)列,將復(fù)雜的操作過(guò)程分解成單個(gè)操作,然后組合起來(lái)一次性執(zhí)行)
(在 ActionChains 類中所有提供的鼠標(biāo)事件方法,在調(diào)用的時(shí)候所有的行為都存儲(chǔ)在 ActionChains 對(duì)象中,而 perform() 方法就是真正去執(zhí)行所有的鼠標(biāo)事件。)
4、鼠標(biāo)的操作都包含在 ActionChains 類中,所以要模擬鼠標(biāo)操作是首先要導(dǎo)入該包: (對(duì) ActionChains 類進(jìn)行實(shí)例化對(duì)象操作,調(diào)用操作(元素)方法,再執(zhí)行 perform() 方法。)
from selenium.webdriver.common.action_chains import ActionChains
ActionChains 類常用方法
1、click_and_hold(on_element=None) :點(diǎn)擊鼠標(biāo)左鍵,不松開
2、context_click(on_element=None) :點(diǎn)擊鼠標(biāo)右鍵
說(shuō)明:對(duì)于點(diǎn)擊鼠標(biāo)右鍵,如果彈出的是瀏覽器默認(rèn)的菜單,Selenium沒有提供操作菜單選項(xiàng)的方法; 如果是自定義的右鍵菜單,則可以通過(guò)元素定位來(lái)操作菜單中的選項(xiàng)。
3、double_click(on_element=None) :雙擊鼠標(biāo)左鍵
4、drag_and_drop(source, target) :拖拽到某個(gè)元素然后松開
說(shuō)明:模擬鼠標(biāo)拖動(dòng)動(dòng)作,選定拖動(dòng)源元素釋放到目標(biāo)元素后鼠標(biāo)松開。
1.源元素:source = driver.find_element_by_id(xxx)
2.目標(biāo)元素 :target = driver.find_element_by_id(xxx)
3.調(diào)用方法 :action.drag_and_drop(source, target).perform()
5、move_by_offset(xoffset, yoffset) :鼠標(biāo)從當(dāng)前位置移動(dòng)到某個(gè)坐標(biāo)
6、move_to_element(to_element) :鼠標(biāo)移動(dòng)到某個(gè)元素
說(shuō)明: 模擬鼠標(biāo)懸停在指定的的元素上
7、release(on_element=None) :在元素上釋放按住的鼠標(biāo)按鈕(在某個(gè)元素位置松開鼠標(biāo)左鍵)
8、pause(seconds) :暫停操作(秒)
ActionChains 類其他方法
1、 perform(self) --執(zhí)行鼠標(biāo)操作方法
2、 reset_actions() :清除已在隊(duì)列中的鼠標(biāo)操作命令
3、 click(on_element=None) :點(diǎn)擊鼠標(biāo)左鍵
4、 click_and_hold(on_element=None) :點(diǎn)擊鼠標(biāo)左鍵,不松開
5、 context_click(on_element=None) :點(diǎn)擊鼠標(biāo)右鍵
6、 double_click(on_element=None) :雙擊鼠標(biāo)左鍵
7、 drag_and_drop(source, target) :拖拽到某個(gè)元素然后松開(需要獲取到目標(biāo)位置的元素定位)
8、 drag_and_drop_by_offset(source, xoffset, yoffset) :拖拽到某個(gè)坐標(biāo)然后松開(需要獲取到目標(biāo)位置的位置坐標(biāo))
9、 key_down(value, element=None) :按下某個(gè)鍵盤上的鍵
10、key_up(value, element=None) :松開某個(gè)鍵
11、 move_by_offset(xoffset, yoffset) :鼠標(biāo)從當(dāng)前位置移動(dòng)到某個(gè)坐標(biāo)(需要獲取到目標(biāo)位置的位置坐標(biāo))
12、 move_to_element(to_element) :鼠標(biāo)移動(dòng)到某個(gè)元素
13、 move_to_element_with_offset(to_element, xoffset, yoffset) :移動(dòng)到距某個(gè)元素(左上角坐標(biāo))多少距離的位置
14、 pause(seconds) :暫停操作(秒)—結(jié)合使用,比如:鼠標(biāo)移動(dòng)到某元素上懸停的時(shí)間。(暫停所有動(dòng)作,相當(dāng)于等待,用于鏈?zhǔn)讲僮鬟^(guò)程中的等待)
15、 release(on_element=None) :在元素上釋放按住的鼠標(biāo)按鈕,與 click_and_hold(on_element=None) 點(diǎn)擊鼠標(biāo)左鍵不松開結(jié)合使用。(如果有鼠標(biāo)按下的操作,那么需要通過(guò) release() 方法釋放鼠標(biāo))
16、 send_keys(*keys_to_send) :發(fā)送某個(gè)鍵到當(dāng)前焦點(diǎn)的元素
17、 send_keys_to_element(element, *keys_to_send) :發(fā)送某個(gè)鍵到指定元素
實(shí)例
示例1
1、鼠標(biāo)單擊操作: ac.click(element).perform()
2、元素單擊操作: element.click()
3、移動(dòng)操作(鼠標(biāo)懸停): ac.move_to_element(element).perform()
將鼠標(biāo)移動(dòng)至右側(cè)【設(shè)置】處,并點(diǎn)擊【高級(jí)搜索】
示例2:
import time from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get('https://www.baidu.com/') driver.maximize_window() driver.implicitly_wait(5) # 定位百度首頁(yè)右上角的設(shè)置元素 set_ele = driver.find_element(by=By.XPATH, value="http://span[@id='s-usersetting-top']") # # 第一步:創(chuàng)建一個(gè)鼠標(biāo)操作的對(duì)象 action = ActionChains(driver) # # 第二步:添加移動(dòng)操作 action.move_to_element(set_ele) # # 第三步:執(zhí)行動(dòng)作 action.perform() # 三行代碼可寫成一行:支持鏈?zhǔn)秸{(diào)用 # ActionChains(driver).move_to_element(set_ele).perform() # (鼠標(biāo)移動(dòng)到設(shè)置元素后,會(huì)出現(xiàn)一個(gè)下選框,其中有高級(jí)搜索) 顯式等待設(shè)置:高級(jí)搜索可點(diǎn)擊 WebDriverWait(driver, 5, 0.2).until( EC.element_to_be_clickable((By.XPATH, "http://a[text()='高級(jí)搜索']")) ).click() time.sleep(5) driver.quit()
實(shí)例3
代碼如下:
from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver chr_driver = webdriver.Chrome() chr_driver.maximize_window() chr_driver.get("https://www.baidu.com/") ele = chr_driver.find_element_by_xpath('//*[@id="s-usersetting-top"]') # 實(shí)例化,懸浮、點(diǎn)擊,可以連續(xù)調(diào)用多個(gè)方法,是因?yàn)榉祷氐亩际莝elf對(duì)象 ActionChains(chr_driver).move_to_element(ele).pause(0.5).click(ele).perform()
實(shí)例4
1、鼠標(biāo)右鍵單擊操作
# 創(chuàng)建瀏覽器實(shí)例對(duì)象 driver = webdriver.Chrome() # 創(chuàng)建鼠標(biāo)實(shí)例化對(duì)象 chains = ActionChains(driver) # 訪問(wèn)商城網(wǎng)站 driver.get("http://39.98.138.157/shopxo/index.php") # 最大化瀏覽器窗口 driver.maximize_window() # 通過(guò) xpath 定位用戶名 username = driver.find_element_by_xpath("http://input[@name='accounts']") # 再鼠標(biāo)右鍵單擊輸入框 chains.context_click(username).perform()
2、鼠標(biāo)左鍵雙擊動(dòng)作
# 創(chuàng)建瀏覽器實(shí)例對(duì)象 driver = webdriver.Chrome() # 創(chuàng)建鼠標(biāo)實(shí)例化對(duì)象 chains = ActionChains(driver) # 訪問(wèn)商城網(wǎng)站 driver.get("http://39.98.138.157/shopxo/index.php") # 最大化瀏覽器窗口 driver.maximize_window() # 通過(guò) xpath 定位用戶名 username = driver.find_element_by_xpath("http://input[@name='accounts']") # 再鼠標(biāo)雙擊全選輸入框內(nèi)容 chains.double_click(username).perform()
3、鼠標(biāo)懸停操作
# 創(chuàng)建瀏覽器實(shí)例對(duì)象 driver = webdriver.Chrome() # 創(chuàng)建鼠標(biāo)實(shí)例化對(duì)象 chains = ActionChains(driver) # 訪問(wèn)商城網(wǎng)站 driver.get("http://39.98.138.157/shopxo/index.php") # 最大化瀏覽器窗口 driver.maximize_window() # 通過(guò) xpath 定位登錄文本 login = driver.find_element_by_xpath("http://div[@class='member-login']/a[text()='登錄']") # 再讓鼠標(biāo)懸停到該元素上 chains.move_to_element(login).perform()
4、鼠標(biāo)將某元素拖拽到另一個(gè)元素的位置后松開
# 創(chuàng)建瀏覽器實(shí)例對(duì)象 driver = webdriver.Chrome() # 創(chuàng)建鼠標(biāo)實(shí)例化對(duì)象 chains = ActionChains(driver) # 訪問(wèn)商城網(wǎng)站 driver.get("http://39.98.138.157/shopxo/index.php") # 最大化瀏覽器窗口 driver.maximize_window() # 先定位被拖拽的元素 source = driver.find_element_by_xpath('//*[@id="doc-topbar-collapse"]/ul/li[1]/a') # 再定位目標(biāo)元素 target = driver.find_element_by_xpath("http://input[@name='accounts']") # 最后調(diào)用 drag_and_drop 方法將定位到的source元素拖拽到目標(biāo)元素target chains.drag_and_drop(source, target)
5、鼠標(biāo)移動(dòng)到指定元素
element = driver.find_element_by_id('xxx') ActionChains(driver).move_to_element(element).perform()
6、鼠標(biāo)以某個(gè)元素位置為原點(diǎn),在該元素位置的橫向和縱向格移動(dòng)100像素
element = driver.find_element_by_id('xxx') ActionChains(driver).move_to_element_with_offset(element, 100, 100).perform()
7、雙擊元素(如果沒有指定元素則在當(dāng)前鼠標(biāo)所在位置雙擊)
element = driver.find_element_by_id('xxx') ActionChains(driver).double_click(element).perform()
8、在指定元素上點(diǎn)擊鼠標(biāo)右鍵(如果沒有指定元素則在當(dāng)前鼠標(biāo)所在位置單擊右鍵)
element = driver.find_element_by_id('xxx') ActionChains(driver).context_click(element).perform()
9、鼠標(biāo)左鍵在某元素處按下不松(如果沒有指定元素則在當(dāng)前鼠標(biāo)所在位置按下左鍵不松開)
element = driver.find_element_by_id('xxx') ActionChains(driver).click_and_hold(element).perform()
10、鼠標(biāo)按住element1元素,拖動(dòng)到element2元素。
element1 = driver.find_element_by_id('xxx') element2 = driver.find_element_by_id('xxx') ActionChains(driver).drag_and_drop(element1, element2).perform()
11、鼠標(biāo)拖動(dòng)某指定元素向左上角橫向縱向移動(dòng)100像素
element = driver.find_element_by_id('xxx') ActionChains(driver).drag_and_drop_by_offset(element, -100, -100)
總結(jié)
到此這篇關(guān)于selenium鼠標(biāo)操作實(shí)戰(zhàn)案例的文章就介紹到這了,更多相關(guān)selenium鼠標(biāo)操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用pandas將非數(shù)值數(shù)據(jù)轉(zhuǎn)換成數(shù)值的方式
今天小編就為大家分享一篇利用pandas將非數(shù)值數(shù)據(jù)轉(zhuǎn)換成數(shù)值的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Pytorch實(shí)現(xiàn)張量的創(chuàng)建與使用方法
本文主要介紹了Pytorch實(shí)現(xiàn)張量創(chuàng)建使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08PyQt5 關(guān)于Qt Designer的初步應(yīng)用和打包過(guò)程詳解
Qt Designer中的操作方式十分靈活,其通過(guò)拖拽的方式放置控件可以隨時(shí)查看控件效果。這篇文章主要介紹了PyQt5 關(guān)于Qt Designer的初步應(yīng)用和打包,需要的朋友可以參考下2021-09-09Python?matplotlib實(shí)戰(zhàn)之氣泡圖繪制
氣泡圖是一種多變量的統(tǒng)計(jì)圖表,可以看作是散點(diǎn)圖的變形,這篇文章主要為大家介紹了如何使用Matplotlib繪制氣泡圖,需要的小伙伴可以參考下2023-08-08python 用opencv實(shí)現(xiàn)圖像修復(fù)和圖像金字塔
這篇文章主要介紹了python 如何用opencv實(shí)現(xiàn)圖像修復(fù)和圖像金字塔,幫助大家更好的理解和使用python處理圖片,感興趣的朋友可以了解下2020-11-11

python操作mysql實(shí)現(xiàn)一個(gè)超市管理系統(tǒng)