Python Selenium all mouse actions using ActionChains
What is ActionChains?
ActionChains are ways provided by Selenium to automate low-level interactions with the website such as mouse movements, mouse button actions, keypress, and context menu(right-click menu) interactions. These special methods are useful for doing more complex actions like mouse over and drag and drop that is not possible by direct webdriver actions.
Using ActionChains object, we call methods that perform specific actions sequentially one by one. selenium training Actions called are pushed into a queue. When performing () method is called, the events are fired in the order they are queued up.
The ActionChains implementation is available in below path.
Python
from selenium.webdriver.common.action_chains import ActionChains
actionchains = ActionChains(driver) # initialize ActionChain object
The WebDriver instance should be passed while creating ActionChains object.
ActionChains can be used in a chain pattern, adding all the methods in the same line.
Python
menu = driver.find_element_by_id("menu")
submenu = driver.find_element_by_id("submenu1")
ActionChains(driver)
.move_to_element(menu)
.click(submenu)
.perform()
Actions can be added to one by one to queue, then performed.
menu = driver.find_element_by_id("menu")
submenu = driver.find_element_by_id("submenu1")
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(submenu)
actions.perform()
In both ways, the actions are executed or performed one after another in the order they are added.
All available ActionChains method
click(on_element=None)
Left clicks on a given element.
Parameters
on_element: The element to click on. If no element passed, clicks left mouse button on current mouse position.
click_and_hold(on_element=None)
Click and holds down the left mouse button on an element.
Parameters
on_element: The element to mouse down. If no element passed, clicks on current mouse position.
context_click(on_element=None)
Performs a context-click (right click) on an element.
Parameters
on_element: The element to context-click or right click on. If no element passed, right clicks on current mouse position.
double_click(on_element=None)
Double-clicks on an element.
Parameters
on_element: The element to double-click on. If no element passed, double clicks on current mouse position.
drag_and_drop(source, target)
Holds down the left mouse button on the source element, then moves to the target element and releases the mouse button.
Parameters
source: The element to mouse down or the element to be dragged
target: The element to mouse up or target element to be dragged into
Example
Python
from_element = driver.find_element_by_id("source")
to_element = driver.find_element_by_id("target")
ActionChains(driver)
.drag_and_drop(from_element, to_element)
.perform()
drag_and_drop_by_offset(source, xoffset, yoffset)
Holds down the left mouse button on the source element, then moves to the target offset and releases the mouse button more info selenium online training.
Parameters
source: The element to mouse down.
xoffset: X offset to move to.
yoffset: Y offset to move to.
key_down(value, element=None)
Sends a key press only, without releasing it. This is used mainly with modifier keys like Control, Alt and Shift.
Parameters
value: The modifier key to send. Keys class defines all values.
element: The element to send keys. If None, sends a key to current focused element.
Example, below script presses ctrl+c
Python
ActionChains(driver)
.key_down(Keys.CONTROL)
.send_keys('c')
.key_up(Keys.CONTROL)
.perform()
key_up(value, element=None)
Releases a modifier key.
Parameters
value: The modifier key to send. Keys class defines all the values.
element: The element to send keys. If no element passed, sends a key to current focused element.
Example, below script presses ctrl+v
Python
ActionChains(driver)
.key_down(Keys.CONTROL)
.send_keys('v')
.key_up(Keys.CONTROL)
.perform()
move_by_offset(xoffset, yoffset)
Moving the mouse to an offset from current mouse position.
Parameters
xoffset: X offset to move to, as a positive or negative integer.
yoffset: Y offset to move to, as a positive or negative integer.
move_to_element(to_element)
Moving the mouse to the middle of an element. This action helps us to deal with dropdown menu that appears when the user moves the mouse over an element or when the user clicks on an element.
Parameters
to_element: The WebElement to move to.
Example
Python
menu = driver.find_element_by_id("allmenu")
ActionChains(driver)
.move_to_element(menu)
.perform()
# wait until sub menu appears on the screen
WebDriverWait(self.webdriver, 5)
.until(EC.visibility_of_element_located((By.ID, "home")))
home_menu = driver.find_element_by_id("home")
home_menu.click()
move_to_element_with_offset(to_element, xoffset, yoffset)
Move the mouse by an offset of the specified element.
Offsets are relative to the top-left corner of the element.
Parameters
to_element: The WebElement to move to.
xoffset: X offset to move to.
yoffset: Y offset to move to.
pause(seconds)
Pause all actions for the specified duration (in seconds).
perform()
Performs all stored actions.
release(on_element=None)
Releasing a held mouse button on an element.
Parameters
on_element: The element to mouse up. If None, releases on current mouse position.
reset_actions()
To clear all actions already stored locally and/or on the remote end.
send_keys(keys_to_send)
Sends keys to current focused element.
Parameters
keys_to_send: The keys to send.
send_keys_to_element(element, keys_to_send)
Sends keys to an element.
Parameters
element: The element to send keys.
keys_to_send: The keys to send.
For both send_keys and send_keys_to_element method arguments, Modifier keys constants can be found in the ‘Keys’ class.
Common Scenarios
Open link in new Tab
User has to press Control key and click on the link to open it in new browser tab. Same operation can be scripted in Selenium WebDriver as follows
Python
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox(executable_path="path to firefox webdriver")
driver.get('https://www.google.com')
element = driver.find_element_by_link_text('Privacy')
ActionChains(driver)
.key_down(Keys.CONTROL)
.click(element)
.key_up(Keys.CONTROL)
.perform()
driver.quit()
In case of Mac os
Python
ActionChains(driver) \
.key_down(Keys.COMMAND) \
.click(element) \
.key_up(Keys.COMMAND) \
.perform()
User has to press Shift key and click on the link to open it in new browser window. Same operation can be scripted in Selenium WebDriver as follows
Python
ActionChains(driver) \
.key_down(Keys.SHIFT) \
.click(element) \
.key_up(Keys.SHIFT) \
.perform()
Handle Mouse overs
Python
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox(executable_path="path to driver")
driver.get('https://www.w3schools.com/howto/howto_css_dropdown.asp')
element = driver.find_element_by_class_name('dropbtn')
ActionChains(driver) \
.move_to_element(element) \
.perform()
element = driver.find_element_by_link_text('Link 1')
element.click()
driver.quit()
Use pause() method if you like to wait before each operations. For example, if it takes few seconds to display menu items.