61

我正在尝试抓取页面,但有时我无法单击链接/按钮。

当网页加载时,“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"]')

但是,即使该元素未处于活动状态,它也会存在。

4

6 回答 6

99

您可以尝试以下 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()

希望这会奏效。

于 2018-02-07T15:49:06.963 回答
25

此错误消息...

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()时,您需要将WebDriverWaitWebDriverWait WebDriverWait结合使用element_to_be_clickable(),您可以使用以下任一Locator Strategies

    • 使用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_conditionsfor 结合起来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

      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()
      
  • 如果问题仍然存在,您可以使用以下execute_script()方法:

    • 使用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']"))))
      

笔记

您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait       
from selenium.webdriver.common.by import By       
from selenium.webdriver.support import expected_conditions as EC
于 2020-03-14T21:04:33.253 回答
11

你可以等到元素消失,

WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("loadingWhiteBox")));
于 2019-03-25T12:27:45.073 回答
1

对于硒化物

WebElement element = selenide_element.toWebElement();
WebDriverRunner.driver().executeJavaScript("arguments[0].click();", element);
于 2021-02-25T13:32:28.313 回答
0

当我收到此错误时,我通常会尝试不同的方法。代替:

driver.findElement(By.cssSelector("div[class*="loadingWhiteBox"]")).click();

尝试这个:

WebElement webElement = driver.findElement(By.cssSelector("div[class*="loadingWhiteBox"]"));
((JavascriptExecutor) driver).executeScript("arguments[0].click();", webElement);

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

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

于 2020-01-31T14:58:08.457 回答
0

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

于 2020-10-25T01:24:48.993 回答