问题
I am trying to automate the download of data from a website with a python script using selenium but I get the following error:
"WebDriverException: Message: TypeError: rect is undefined".
Code trial:
from selenium import webdriver
from selenium.webdriver.common import action_chains
driver = webdriver.Firefox()
url="https://www.hlnug.de/?id=9231&view=messwerte&detail=download&station=609"
driver.get(url)
Now I define the check-box I want to click and I try to click on it:
temp=driver.find_element_by_xpath('//input[@value="TEMP"]')
action = action_chains.ActionChains(driver)
action.move_to_element(temp)
action.click()
action.perform()
I already searched 2 hours on the net without any success. Any idea is therefore welcome!
Thanks a lot in advance!
回答1:
There are two elements that match that locator. The first one is not visible so I'm assuming you want to click on the second.
temp = driver.find_elements_by_xpath('//input[@value="TEMP"]')[1] # get the second element in collection
action = action_chains.ActionChains(driver)
action.move_to_element(temp)
action.click()
action.perform()
回答2:
This error message...
WebDriverException: Message: TypeError: rect is undefined
...implies that the desired WebElement might not have client rects defined when you tried to interact with it.
As per TypeError: rect is undefined, when using Selenium Actions and element is not displayed. the main issue is though the desired element with which you are trying to interact [i.e. invoke click()
] is present within the HTML DOM but is not visible i.e. not displayed.
Reason
The most probhable reasons and solutions are as follows :
- Moving ahead as you are trying to click the element, the desired element may not be interactable at that point of time as some JavaScript / Ajax call may be still active.
- Element is out of the Viewport
Solution
Induce WebDriverWait for the element to be clickable as follows :
temp = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@value="TEMP"]"))) action = action_chains.ActionChains(driver) action.move_to_element(temp) action.click() action.perform()
Use execute_script() method to scroll the element in to view as follows :
temp = driver.find_element_by_xpath("//input[@value="TEMP"]") driver.execute_script("arguments[0].scrollIntoView();", temp); action = action_chains.ActionChains(driver) action.move_to_element(temp) action.click() action.perform()
来源:https://stackoverflow.com/questions/50276598/webdriverexception-message-typeerror-rect-is-undefined