Reputation: 4045
I am still learning and in response to one of my questions: here, I was told to that it might be due because the element in question is not in view.
I looked through the documentation and SO, here was the most relevant answer: here
You can use the "org.openqa.selenium.interactions.Actions" class to move to an element:
WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
## actions.click();
actions.perform();
When I try to use the above to scroll to the element: It says WebElement not defined.
I think this is because I have not imported the relevant module. Can someone point out what I am supposed to import?
Edit: As pointed out by alecxe, this was java code.
But in the meantime right after trying to figure it out for some time. I have found out the import method for WebElement:
from selenium.webdriver.remote.webelement import WebElement
Might help someone like me.
The how of it is also a good lesson, IMO:
Went to: Documentation The
class selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False)
Need to be separated into the command form mentioned above.
Upvotes: 123
Views: 259287
Reputation: 251
This might be helpful to whoever gets here, as the methods in the top answer here didn't work for me - actions.move_to_element(element).perform()
did nothing, and driver.execute_script("arguments[0].scrollIntoView();", element)
scrolled the view so the element was obscured by a floating menu bar positioned on top of the view. What worked for me was using scrollIntoView
with options that centered it in the view, to make sure it was clickable:
driver.execute_script('arguments[0].scrollIntoView({block: "center", inline: "center"})', elem)
Upvotes: 1
Reputation: 4212
Example:
driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_css_selector(.your_css_selector))
This one always works for me for any type of selectors. There is also the Actions class, but for this case, it is not so reliable.
Upvotes: 8
Reputation: 3243
This can be done using driver.execute_script():-
driver.execute_script("document.getElementById('myelementid').scrollIntoView();")
Upvotes: 2
Reputation: 20244
In addition to move_to_element()
and scrollIntoView()
I wanted to pose the following code which attempts to center the element in the view:
desired_y = (element.size['height'] / 2) + element.location['y']
window_h = driver.execute_script('return window.innerHeight')
window_y = driver.execute_script('return window.pageYOffset')
current_y = (window_h / 2) + window_y
scroll_y_by = desired_y - current_y
driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by)
Upvotes: 16
Reputation: 1103
You can scroll to the element by using javascript through the execute_javascript
method.
For example here is how I do it using SeleniumLibrary on Robot Framework:
web_element = self.selib.find_element(locator)
self.selib.execute_javascript(
"ARGUMENTS",
web_element,
"JAVASCRIPT",
'arguments[0].scrollIntoView({behavior: "instant", block: "start", inline: "start"});'
)
Upvotes: 0
Reputation: 52665
There is another option to scroll page to required element if element has "id"
attribute
If you want to navigate to page and scroll down to element with @id
, it can be done automatically by adding #element_id
to URL...
Example
Let's say we need to navigate to Selenium Waits documentation and scroll page down to "Implicit Wait" section. We can do
driver.get('https://selenium-python.readthedocs.io/waits.html')
and add code for scrolling...OR use
driver.get('https://selenium-python.readthedocs.io/waits.html#implicit-waits')
to navigate to page AND scroll page automatically to element with id="implicit-waits"
(<div class="section" id="implicit-waits">...</div>
)
Upvotes: 0
Reputation: 52665
It's not a direct answer on question (its not about Actions
), but it also allow you to scroll easily to required element:
element = driver.find_element_by_id('some_id')
element.location_once_scrolled_into_view
This actually intend to return you coordinates (x
, y
) of element on page, but also scroll down right to target element
Upvotes: 78
Reputation: 473763
You are trying to run Java code with Python. In Python/Selenium, the org.openqa.selenium.interactions.Actions
are reflected in ActionChains
class:
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element_by_id("my-id")
actions = ActionChains(driver)
actions.move_to_element(element).perform()
Or, you can also "scroll into view" via scrollIntoView()
:
driver.execute_script("arguments[0].scrollIntoView();", element)
If you are interested in the differences:
Upvotes: 221