无法在Splinter / Selenium中单击Element:ElementClickInterceptedException

时间:2018-02-07 13:25:37

标签: python selenium exception splinter

我试图刮一页,但有时候点击链接/按钮时会遇到麻烦。 当网页加载时,那么" loadingWhiteBox"将出现在第一个然后在几秒后消失(但它将保留在HTML代码中),只要该框出现在网站上,我无法点击该链接并收到以下错误消息:

selenium.common.exceptions.ElementClickInterceptedException: Message: 
Element <span class="taLnk ulBlueLinks"> is not clickable at point 
(318.3000030517578,661.7999877929688) because another element <div 
class="loadingWhiteBox"> obscures it

有什么方法可以解决这个问题吗?我已经尝试过使用以下命令:

driver.is_element_present_by_css('div[class*="loadingWhiteBox"]')

但即使元素不活跃,元素仍然存在。

7 个答案:

答案 0 :(得分:14)

此错误消息...

selenium.common.exceptions.ElementClickInterceptedException: Message: Element <span class="taLnk ulBlueLinks"> is not clickable at point (318.3000030517578,661.7999877929688) because another element <div class="loadingWhiteBox"> obscures it

...表示所需的元素不可点击,因为其他一些元素将其遮盖了。


有多种方法可以解决此问题,其中几种方法如下:

  • 当您打算调用click()时,需要使{{1}的WebDriverWait WebDriverWait与{{1}以下WebDriverWait中的

    • 使用element_to_be_clickable()

      CSS_SELECTOR
    • 使用WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.taLnk.ulBlueLinks"))).click()

      XPATH
  • 如果错误 ...另一个元素将其掩盖... 仍然存在,那么您首先需要与WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='taLnk ulBlueLinks']"))).click() 结合使用 WebDriverWait 阻塞元素的expected_conditions如下:

    • 使用invisibility_of_element()

      CSS_SELECTOR
    • 使用WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.CSS_SELECTOR, "div.loadingWhiteBox"))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.taLnk.ulBlueLinks"))).click()

      XPATH
  • 如果问题仍然存在,则可以使用Locator Strategies方法,如下所示:

    • 使用WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.XPATH, "//div[@class='loadingWhiteBox']"))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='taLnk ulBlueLinks']"))).click()

      CSS_SELECTOR
    • 使用WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.CSS_SELECTOR, "div.loadingWhiteBox"))) driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.taLnk.ulBlueLinks"))))

      XPATH

注意

您必须添加以下导入:

WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.XPATH, "//div[@class='loadingWhiteBox']")))
driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='taLnk ulBlueLinks']"))))

答案 1 :(得分:1)

出现错误是因为屏幕上出现另一个具有相同类或相同xpath / css的元素。

尝试给出一些等待方法,直到元素出现如Thread.sleep(),wait()。

答案 2 :(得分:1)

您可以等到元素消失,

    WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("loadingWhiteBox")));

答案 3 :(得分:1)

出现此错误时,我通常会尝试其他方法。 代替:

df = pd.DataFrame([['1','aa','ccc','rere','thth','my desc 1','','my feature2 1'], ['2','aa','ccc','rprp','','my desc 3','my feature1 1',''], ['3','aa','ccc','blbl','thth','my desc 5','my feature1 2','my feature2 2'], ['4','bb','coco','rere','','my desc 8','','my feature2 3'], ['5','bb','coco','baba','mpmp','my desc 11','my feature1 3','']], columns=['foo', 'bar','name_input','value_input','bulb','desc','feature1', 'feature2'])

尝试一下:

df= df.dropna(subset=['feature1', 'feature2'])
df.dropna(thresh=5, axis=0, inplace=True)
df= df[df.feature2.notnull()]
df= df[pd.notnull(df[['feature1', 'feature2']])]

即使存在覆盖,这也会单击找到的webElement。

如果这不起作用,那么请确保您尝试单击正确的“可单击” Web元素,并检查CSS选择器未指向其他WebElement。 “可点击”是指一个webElement,当您单击它时会执行一个操作(例如,打开一个新页面)。 Web驱动程序会单击它,您可能会认为它实际上没有执行单击操作,但实际上是在错误的webElement上执行了它。

答案 4 :(得分:1)

硒化物

WebElement element = selenide_element.toWebElement();
WebDriverRunner.driver().executeJavaScript("arguments[0].click();", element);

答案 5 :(得分:0)

您可以尝试以下2种方法点击元素。

element = driver.find_element_by_css('div[class*="loadingWhiteBox"]')
driver.execute_script("arguments[0].click();", element)

element = driver.find_element_by_css('div[class*="loadingWhiteBox"]')
webdriver.ActionChains(driver).move_to_element(element ).click(element ).perform()
希望这会奏效。

答案 6 :(得分:0)

我遇到了同样的问题,我只是用了这个: 榆木= driver.find_elements_by_css_selector('div [class * =“ loadingWhiteBox”]') elm.click()