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

问题描述 投票:0回答:1

我有一个用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();

为什么在selenium中没有移动到元素和打破所有图层的操作.这是UI.这是在UI模式下工作的,而不是在无头模式下工作的,使睡眠6分钟也没有解决,所以这不是时间问题。

enter image description here

selenium selenium-chromedriver selenium-ide
1个回答
1
投票

这个错误信息...

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() 在任何你需要诱导的元素上 WebDriverWait 对于 elementToBeClickable() 您可以使用以下任何一种方式 定位策略:

  • 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();
    

* 更新

改成之后 无头 如果还是不行,还是会出现异常,还有以下几个措施可以考虑。

  • 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));
      

您可以在以下网站找到详细的讨论 无法在无头模式下最大化Chrome窗口。

  • 此外,你还可以等待 隐身拦截元素 使用 预期条件 invisibilityOfElementLocated 在尝试 click() 如下:

    • 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();
      

* 参考资料

你可以在以下几个相关的讨论中找到。


2
投票

尝试添加一个明确的等待

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

如果这样还不行,那就试试使用JS执行器。

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//label[@formcontrolname='reportingDealPermission']"))); 
((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
© www.soinside.com 2019 - 2024. All rights reserved.