我正在使用 Selenium 进行测试。我想点击一个元素。该元素非常可点击和可见,但恰好元素的中点被遮挡,导致错误。
这是一个MCVE:
HTML 代码(演示链接):
<style>
button {
width: 90vw;
height: 90vh;
position: fixed;
top: 5vh;
left: 5vw;
}
.cover {
background: grey;
opacity: 0.3;
width: 80vw;
height: 80vh;
position: fixed;
top: 10vh;
left: 10vw;
}
</style>
<button onclick="alert('hi');">
Click me!
</button>
<div class="cover">
I'm in the way!
</div>
Python硒代码:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://blissfulpreciouslanservers--five-nine.repl.co/")
button = driver.find_element_by_tag_name("button")
button.click()
结果:
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <button onclick="alert('hi');">...</button> is not clickable at point (451, 450). Other element would receive the click: <div class="cover">...</div>
这似乎是 Selenium 的一个相当可悲的限制。该按钮是可点击的,但不是所有点。我不想摆弄滚动和坐标。
一般来说,关于异常有很多类似的问题,例如:
- 无法单击元素:Splinter / Selenium 中的 ElementClickInterceptedException
- Selenium 无法单击元素,因为其他元素会遮挡它
- 元素不可点击,因为另一个元素在 python 中隐藏了它
但是,这些问题从来都不是专门针对仅部分模糊的元素,因此我还没有设法找到自己问题的正确答案。其他问题的答案通常分为以下几类:
- 等到元素可点击。不适用于这里。
- 使用动作链,例如
ActionChains(driver).move_to_element(button).click().perform()
。这无济于事,因为.move_to_element()
移动到元素的中间。 - 使用 JavaScript 执行点击。看来我可能不得不求助于这个,但这很不令人满意。我仍然想验证该元素至少在某处是可点击的,而不是绕过所有检查。