org.openqa.selenium.ElementClickInterceptedException:在无头模式下使用 Selenium 和 Java 元素单击拦截错误

新手上路,请多包涵

我有一个正在使用 java 和 selenium 进行的项目。在 UI 模式下测试工作正常。但是在无头模式下我得到这个错误

org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <label _ngcontent-yrc-c26="" formcontrolname="reportingDealPermission" nz-checkbox="" class="ant-checkbox-wrapper ng-untouched ng-pristine ng-valid" ng-reflect-name="reportingDealPermission">...</label> is not clickable at point (161, 562). Other element would receive the click: <div _ngcontent-yrc-c26="" class="footer">...</div>

我该如何解决这个问题(在 UI 模式下工作)。这是我的代码

WebDriver driver = getWebDriver();
        WebElement element;
        Thread.sleep(60000);
        element = driver.findElement(By.xpath("//label[@formcontrolname='reportingDealPermission']"));
        element.click();

为什么在硒中没有移动到元素并打破所有层的操作。这是用户界面。这是在 UI 模式下工作,在 headless 模式下不工作,休眠了 6 分钟但没有解决,所以这不是时间问题

在此处输入图像描述

原文由 Bastian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

这个错误信息…

 org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <label _ngcontent-yrc-c26="" formcontrolname="reportingDealPermission" nz-checkbox="" class="ant-checkbox-wrapper ng-untouched ng-pristine ng-valid" ng-reflect-name="reportingDealPermission">...</label> is not clickable at point (161, 562). Other element would receive the click: <div _ngcontent-yrc-c26="" class="footer">...</div>

…意味着对所需元素的 点击 被其他元素拦截。


单击一个元素

理想情况下,在调用 click() 任何元素时,您需要为 elementToBeClickable() 引入 WebDriverWait 并且您可以使用以下任一 定位器策略

  • cssSelector :
   new WebDriverWait(getWebDriver(), 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("label[formcontrolname=reportingDealPermission][ng-reflect-name=reportingDealPermission]"))).click();

  • xpath
   new WebDriverWait(getWebDriver(), 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//label[@formcontrolname='reportingDealPermission' and @ng-reflect-name='reportingDealPermission']"))).click();


更新

在更改为 无头 后,如果它仍然不起作用并且仍然出现异常,那么还有一些其他措施需要考虑如下:

  • Headless 模式下的 Chrome 浏览器 不会以最大化模式打开。因此,您必须使用以下任一命令/参数来最大化无头浏览器 视口

    • 添加参数 start-maximized
     ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    options.addArguments("start-maximized");
    WebDriver driver = new ChromeDriver(options);
    
    
    
    • 添加参数 --window-size
     ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    options.addArguments("--window-size=1400,600");
    WebDriver driver = new ChromeDriver(options);
    
    
    
    • 使用 setSize()
     ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    WebDriver driver = new ChromeDriver(options);
    driver.manage().window().setSize(new Dimension(1440, 900));
    
    
    

您可以在 Not able to maximize Chrome Window in headless mode 中找到详细的讨论

  • 此外,您还可以在尝试 click() 之前使用 ExpectedConditions invisibilityOfElementLocated 等待 _拦截元素不可见_,如下所示:

    • cssSelector
     new WebDriverWait(getWebDriver(), 10).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("div.footer")));
    new WebDriverWait(getWebDriver(), 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("label[formcontrolname=reportingDealPermission][ng-reflect-name=reportingDealPermission]"))).click();
    
    
    
    • xpath :
     new WebDriverWait(getWebDriver(), 10).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@class='footer']")));
    new WebDriverWait(getWebDriver(), 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//label[@formcontrolname='reportingDealPermission' and @ng-reflect-name='reportingDealPermission']"))).click();
    
    
    

参考

您可以在以下位置找到几个相关的相关讨论:

原文由 undetected Selenium 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试添加显式等待

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//label[@formcontrolname='reportingDealPermission']"))).click();

如果这不起作用,请尝试使用 JS Executor

 WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//label[@formcontrolname='reportingDealPermission']")));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);

原文由 Wilfred Clement 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题