提问者:小点点

Selenium按钮单击不会等到JavascriptExecator向下滚动完成。这会导致ElementClickIntercepted错误


我试图点击按钮,这是不可视的屏幕上,所以首先我必须滚动窗口,然后执行点击操作,但滚动完全发生之前使用JavascriptExecator,Selenium试图点击按钮,导致ElementClickInterceptedException

WebElement submitButton = driver.findElement(By.cssSelector(".totalRow button"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", submitButton);
w.until(ExpectedConditions.elementToBeClickable(submitButton));
submitButton.click();

如果我在滚动后使用Thread.睡眠(5000),则不会发生此问题,但我不想使用它。我尝试使用JavascriptExecatorAction类也不起作用。


共2个答案

匿名用户

Selenium正在等待元素可单击,但在尝试单击之前它不知道另一个元素正在阻止单击。这个问题有两种解决方案:

>

  • 您可以使用JS单击来单击submitButton

    WebElement submitButton = driver.findElement(By.cssSelector(".totalRow button"));
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("arguments[0].scrollIntoView(true);", submitButton);
    w.until(ExpectedConditions.elementToBeClickable(submitButton));
    js.executeScript("arguments[0].click();", submitButton);
    

    如果您正在创建UI测试脚本,请不要使用此方法。使用JS单击将允许脚本单击普通用户无法单击的元素。如果您只是在进行网络抓取等,而不是尝试模拟实际用户行为,则此方法很好。

    等待阻止元素不可见。您将知道哪个元素阻止了单击,因为该元素的超文本标记语言将在异常消息中。

    WebElement submitButton = driver.findElement(By.cssSelector(".totalRow button"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", submitButton);
    By blockingElementLocator = ...;
    w.until(ExpectedConditions.invisibilityOfElementLocated(blockingElementLocator));
    w.until(ExpectedConditions.elementToBeClickable(submitButton)).click();
    

  • 匿名用户

    我在您的代码中没有看到任何重大问题。完整的错误堆栈跟踪将帮助我们准确了解哪个元素拦截了点击抛出ElementClickInterceptedException

    但是,一个小的改进是在您尝试scrollIntoView()之前诱导WebDriver等待visibilityOfElementSitent(),如下所示:

    ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".totalRow button"))));
    new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.elementToBeClickable(By.cssSelector(".totalRow button"))).click();