selenium.common.exceptions.ElementClickInterceptedException:消息:元素点击被拦截:元素不可点击 Selenium 和 Python

Posted

技术标签:

【中文标题】selenium.common.exceptions.ElementClickInterceptedException:消息:元素点击被拦截:元素不可点击 Selenium 和 Python【英文标题】:selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable with Selenium and Python 【发布时间】:2020-01-04 14:26:10 【问题描述】:

我目前正在从事一个自动填写表格的项目。填写表格时会出现下一个按钮,这就是它给我一个错误的原因。

我试过了:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//input[@type='button' and @class='button']")))
Next = driver.find_element_by_xpath("//input[@type='button' and @class='button']")
Next.click()

html

<span class="btn">
    <input type="button" value="Next" class="button" payoneer="Button" data-controltovalidate="PersonalDetails" data-onfieldsvalidation="ToggleNextButton" data-onclick="UpdateServerWithCurrentSection();" id="PersonalDetailsButton">
     </input>
     <div class="clearfix"></div>
</span>

错误:

selenium.common.exceptions.ElementClickInterceptedException:消息: 元素点击被拦截:元素在点 (203, 530) 处不可点击。 其他元素会收到点击:... (Session info: chrome=76.0.3809.132)

【问题讨论】:

你试过javascript click()吗? 【参考方案1】:

我没有足够的代表发表评论,但此错误的常见原因可能是 Selenium 从屏幕上的 DOM 定位元素并定位 xy 坐标 (300, 650) 然后单击它们,但如果发生一些变化点击持续时间之间的屏幕,例如谷歌广告或一些弹出窗口,然后它无法点击它导致此异常

我只是猜测是否有人有适当的解释请分享

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review【参考方案2】:

我遇到了类似的问题,.click() 总是返回不可点击的异常。

driver.execute_script('arguments[0].click()', button)

会变魔术。你也可以通过这种方式使用它来执行任何其他的 js 脚本

script = 'your JavaScript goes here'
element = driver.find_element_by_*('your element identifier goes here')
driver.execute_script(script, element)

【讨论】:

【参考方案3】:

如果xpath的路径是对的,或许你可以试试这个方法来解决这个问题。将旧代码替换为以下代码:

button = driver.find_element_by_xpath("xpath")
driver.execute_script("arguments[0].click();", button)

我以前解决过这个问题,但老实说,我不知道原因。

【讨论】:

对我来说,在 selenium 中使用 driver.find_element_by_class_name("secondary-action").click() 函数是行不通的,但使用这个建议的函数可以。也不知道为什么:) 我遇到了与@Craig 类似的问题,但有趣的是它可以通过使用以下内容来工作。 searchbox = driver.find_element_by_xpath('//*[@id="smartSearch"]') 然后 searchbox.click() 但它突然停止工作。感谢分享! 如果有人知道原因,请不要犹豫发表评论!我曾经使用过 wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Display available']"))).click() 并花了几天时间调试.. 【参考方案4】:

我遇到了类似的问题,我观察到一些可能有助于了解问题根本原因的事情。在我的情况下,我能够单击网站的 PC 视图模式下的元素,但在移动视图中未能这样做(我需要在其中运行我的脚本)。我发现在移动视图中,元素的顺序(在我的例子中是 li)在视图中发生了变化,而它们在 html 文档中保持不变。这就是为什么我没有真正先滚动到它就无法点击它的原因。它也可以解释为什么会这样:-

driver.execute_script("arguments[0].click();", button)

【讨论】:

【参考方案5】:

我查看了导致它的确切元素,它是关于同意/cookie 的横幅。所以一开始,我确保它点击了同意横幅上的“确定”,然后我点击了我需要的另一个按钮。希望它可以帮助某人。

【讨论】:

【参考方案6】:

此错误消息...

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (203, 530). Other element would receive the click: ... (Session info: chrome=76.0.3809.132)

...表示所需元素上的click() 被其他元素拦截,并且所需元素不可点击。


您需要考虑以下几点:

虽然使用Selenium 进行自动化 使用time.sleep(secs) 没有任何特定条件来实现 违背了自动化,应该不惜一切代价避免。根据文档:

time.sleep(secs) 将当前线程的执行挂起给定的秒数。该参数可以是一个浮点数,以指示更精确的睡眠时间。实际的挂起时间可能少于请求的时间,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长。

可以在How to sleep webdriver in python for milliseconds找到详细讨论 由于WebDriverWait 返回WebElement,您可以直接调用click() 方法。

解决方案

要单击 value 作为 Next 的按钮,您可以使用以下任一Locator Strategies:

使用CSS_SELECTOR

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.button#PersonalDetailsButton[data-controltovalidate='PersonalDetails']"))).click()

使用XPATH

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='button' and @id='PersonalDetailsButton'][@data-controltovalidate='PersonalDetails']"))).click()

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

【讨论】:

【参考方案7】:

看起来有一些其他元素具有相同的 xpath 尝试像这样更改 xpath

Next = driver.find_element_by_xpath("//input[@id='PersonalDetailsButton']");
Next.Click();

Next = driver.find_element_by_xpath(//input[@value='Next' and @id='PersonalDetailsButton']);
Next.Click();

如果第二个不起作用,请尝试第一个 xpath。如果这也不起作用,请尝试使用 sikuli。我很确定第一个 xpath 会起作用

【讨论】:

以上是关于selenium.common.exceptions.ElementClickInterceptedException:消息:元素点击被拦截:元素不可点击 Selenium 和 Python的主要内容,如果未能解决你的问题,请参考以下文章