Is there a way to perform a mouseover (hover over an element) using Selenium and Python bindings?

Question:

Reading here, there apparently used to be a RenderedWebElement class with a hover method. It, however, was exclusively made for Java (I have searched the Python bindings documentation to no avail) and has since been deprecated for Java.

A hover can’t be performed using action_chains nor by using a WebElement object either.

Any ideas as to how to do this for Python? I have been here but it uses RenderedWebElement and hence doesn’t help too much.

I am using: Python 2.7, Windows Vista, Selenium 2, Python Bindings

EDIT: There is a method mouse_over for a selenium.selenium.selenium object but I cannot figure a way to create an instance without having the stand-alone server running already.

EDIT Please go through the comments of the reply marked as answer just in-case you have misconceptions like I did !

Asked By: Ashwin

||

Answers:

To do a hover you need to use the move_to_element method.

Here is an example

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

firefox = webdriver.Firefox()
firefox.get('http://foo.bar')
element_to_hover_over = firefox.find_element_by_id("baz")

hover = ActionChains(firefox).move_to_element(element_to_hover_over)
hover.perform()
Answered By: AutomatedTester

@AutomatedTester have given the community a great solution!

Below is how I used it.

I used signal to properly quit PhantomJS since it sometimes hangs in the current process.

I prefer to use find_element_by_xpath since xpath can be easily found in chrome.

Here’s how:

Right click -> Inspect -> Right click -> Copy -> CopyXpath

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import signal

browser = webdriver.PhantomJS()
browser.implicitly_wait(3)

def hover(browser, xpath):
    element_to_hover_over = browser.find_element_by_xpath(xpath)
    hover = ActionChains(browser).move_to_element(element_to_hover_over)
    hover.perform()



browser.service.process.send_signal(signal.SIGTERM)  # kill the specific phantomjs child proc
browser.quit()
Answered By: hyukkyulee