ActionChains
有時候我們在通過Selenium做UI自動化的時候,明明能夠在DOM樹內看到這個元素,但是我在通過driver click、sendkey的時候,就是點擊不到或無法輸入字符串。實際上這是由於WEB中某些元素需要通過一系列連貫的操作才能處於可以點擊的狀態,driver提供的click方法是每次都只執行一個命令操作,而我們需要連貫的操作。或者經常遇到那種,需要鼠標懸浮后,要操作的元素才會出現的某種場景,那么我們就要模擬鼠標懸浮到某一個位置,做一系列的連貫操作,這里就要應用Selenium提供的ActionChains模塊
引入方式
from selenium.webdriver.common.action_chains import ActionChains
實際上ActionChains這個模塊的實現的核心思想就是,當你調用ActionChains的方法時,不會立即執行,而是會將所有的操作按順序存放在一個List里,當你調用perform()方法時,隊列中的時間會依次執行。(注:推薦一個尺子工具,MeasulerIt)
drag_and_drop(鼠標拖動)
# 將source元素拖放至target元素處,參數為兩個elementObj
ActionChains(driver).drag_and_drop(source=source,target=target) # 將一個source元素 拖動到針對source坐上角坐在的x y處 可存在負寬度的情況和負高度的情況
ActionChains(driver).drag_and_drop_by_offset(source, x, y) # 這種也是拖拽的一種方式,都是以源元素的左上角為基准,移動坐標
ActionChains(driver).click_and_hold(dom).move_by_offset(169,188).release().perform()
move_to_element
# 鼠標移動到某一個元素上,結束elementObj
ActionChains(driver).move_to_element(e) # 鼠標移動到制定的坐標上,參數接受x,y
ActionChains(driver).move_by_offset(e['x'],e['y']) 例: driver = webdriver.Chrome() driver.maximize_window() driver.get('http://www.baidu.com') time.sleep(2) # driver.execute_script('document.body.scrollTop=0')
driver.execute_script('document.documentElement.scrollTop') time.sleep(1) a = driver.find_element_by_id('a').location dis = driver.find_element_by_id('dis1') ActionChains(driver).move_by_offset(a['x'],a['y']).double_click(dis).perform()
click
# 單擊事件,可接受elementObj
ActionChains(driver).click() # 雙擊事件,可接受elementObj
ActionChains(driver).double_click() # 點擊鼠標右鍵
ActionChains(driver).context_click() # 點擊某個元素不松開,接收elementObj
ActionChains(driver).click_and_hold() # # 某個元素上松開鼠標左鍵,接收elementObj
ActionChains(driver).release()
key_down與key_up
有時我們需要模擬鍵盤操作時,那么就需要用到ActionChains中的key操作了,提供了兩個方法,key_down與key_up,模擬按下鍵盤的某個鍵子,與松開某個鍵子,接收的參數是按鍵的Keys與elementObj。可以與send_keys連用(例:全選、復制、剪切、粘貼)
# key_down 模擬鍵盤摁下某個按鍵 key_up 松開某個按鍵,與sendkey連用完成一些操作,每次down必須up一次否則將出現異常
ActionChains(driver).key_down(Keys.CONTROL,dom).send_keys('a').send_keys('c').key_up(Keys.CONTROL)\ .key_down(Keys.CONTROL,dom1).send_keys('v').key_up(Keys.CONTROL).perform()
Keys 實際是Selenium提供的一個鍵盤事件模塊,在模擬鍵盤事件時需要導入Keys模塊
引入路徑
from selenium.webdriver.common.keys import Keys
