selenium.common.exceptions.ElementClickInterceptedException:消息:拦截了元素单击:Selenium和Python无法点击元素

时间:2019-08-31 22:03:14

标签: python selenium xpath css-selectors webdriverwait

我目前正在从事一个自动填写表格的项目。填写表单后,出现下一个按钮,这就是为什么它给我一个错误。

我尝试过:

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)不可点击。   其他元素将获得点击:...(会话信息:chrome = 76.0.3809.132)

6 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,.click() 总是返回一个 Not clickable 异常。

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)

答案 1 :(得分:0)

看起来还有其他一些具有相同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可以工作

答案 2 :(得分:0)

如果 xpath 的路径正确,则可以尝试使用此方法来解决此问题。将旧代码替换为以下代码:

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

我之前已经解决了这个问题,但是老实说,我不知道原因。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

         

此错误消息...

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()。另外,由于系统中其他活动的安排,暂停时间可能比请求的时间长任意数量。


解决方案

要单击具有 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