我有一个代码告诉Selenium等到元素可点击但由于某种原因,Selenium不会等待,而是单击该元素并立即在点(x,y)处引发Not clickable。知道如何解决这个问题吗?
x = '//*[@id="arrow-r"]/i'
driver = webdriver.Chrome(path)
driver.get('https://www.inc.com/inc5000/list/2017')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, x)))
driver.find_element_by_xpath(x).click()
答案 0 :(得分:1)
EC.element_to_be_clickable检查元素是否可见并启用。在可见性方面,它不包括元素落后于其他方面的情况。也许你的页面使用像blockUI widget这样的东西,并且在封面消失之前会发生click()。您可以通过丰富EC.element_to_be_clickable((By.XPATH,x))来检查元素是否真正可点击,并使用断言确保元素不被其他元素所支持。在我的项目中,我使用如下实现:
static bool IsElementClickable(this RemoteWebDriver driver, IWebElement element)
{
return (bool)driver.ExecuteScript(@"
(function(element){
var rec = element.getBoundingClientRect();
var elementAtPosition = document.elementFromPoint(rec.left+rec.width/2, rec.top+rec.height/2);
return element == elementAtPosition || element.contains(elementAtPosition);
})(arguments[0]);
", element);
}
此代码在C#中,但我确信您可以轻松地转换为您选择的编程语言。
更新: 我写了一篇关于点击selenium framework https://cezarypiatek.github.io/post/why-click-with-selenium-so-hard/
的问题的博客文章答案 1 :(得分:0)
以下是Python Selenium文档的“等待”部分的链接:Click here
等等会:
element = WebDriverWait(driver, 10).until(
EC.visibility_of((By.XPATH, "Your xpath"))
)
element.click();