Reputation: 20746
Why am I unable to click the following checkbox on the page https://realty.yandex.ru/add via Selenium in Python?
import traceback
import selenium.webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import selenium.webdriver.support
import selenium.webdriver.support.ui
explicit_wait_timeout_secs = 10
def wait_for_element_presence(driver, find_type, web_element):
return selenium.webdriver.support.ui.WebDriverWait(driver, explicit_wait_timeout_secs).until(EC.presence_of_element_located((find_type, web_element)))
def wait_for_element_clickable(driver, find_type, web_element):
return selenium.webdriver.support.ui.WebDriverWait(driver, explicit_wait_timeout_secs).until(EC.element_to_be_clickable((find_type, web_element)))
try:
driver = selenium.webdriver.Chrome()
driver.get('https://realty.yandex.ru/add/')
# element = wait_for_element_clickable(driver, By.NAME, 'lift') # TimeoutException
element = wait_for_element_presence(driver, By.NAME, 'lift') # WebDriverException: Message: unknown error: Element is not clickable at point (203, 899). Other element would receive the click: <span class="checkbox__box">...</span>
element.click()
except Exception:
print('ERROR: \n' + traceback.format_exc())
try:
driver.quit()
except Exception:
pass
If I'm trying to wait for the "clickability" of this element, it gives me TimeoutException
error. If I'm trying to wait for the presence of the element, it gives me "element is not clickable" error.
However, I can click this checkbox via Javascript:
driver.execute_script("document.getElementsByName('lift')[0].click();")
Also it works in Firefox btw.
Why? What am I doing wrong? How can I fix it?
Thanks in advance.
Upvotes: 5
Views: 8288
Reputation: 515
we can use this to click on an element using Javascript
element=driver.find_element(By.ID,"sdd")
driver.execute_script("arguments[0].click();", element)
or
driver.execute_script("arguments[0].click();", driver.find_element(By.ID,"sdd"))
Upvotes: 1
Reputation: 473873
You need to click on the span
tag that is a parent of a parent of the input
tag with name="lift"
:
element = driver.find_element_by_xpath('//span[span/input[@name="lift"]]')
element.click()
Works for me in both Chrome and Firefox:
To be safe, you can also scroll to an element before clicking:
def scroll_element_into_view(driver, element):
"""Scroll element into view"""
y = element.location['y']
driver.execute_script('window.scrollTo(0, {0})'.format(y))
element = driver.find_element_by_xpath('//span[span/input[@name="lift"]]')
scroll_element_into_view(driver, element)
element.click()
Upvotes: 9