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

Bas*_*ian 4 java selenium xpath css-selectors webdriverwait

我有一个项目,我正在使用 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此处输入图片说明

Wil*_*ent 11

尝试添加显式等待

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

如果这不起作用,请尝试使用 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);
Run Code Online (Sandbox Code Playgroud)


Deb*_*anB 7

这个错误信息...

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>
Run Code Online (Sandbox Code Playgroud)

...意味着对所需元素的点击被其他一些元素拦截了。


单击元素

理想情况下,在调用click()的任何元素,你需要引起WebDriverWaitelementToBeClickable(),你可以使用以下的定位策略

  • cssSelector

    new WebDriverWait(getWebDriver(), 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("label[formcontrolname=reportingDealPermission][ng-reflect-name=reportingDealPermission]"))).click();
    
    Run Code Online (Sandbox Code Playgroud)
  • xpath

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

更新

如果它仍然无法正常工作并且仍然出现异常,则更改为无头后,仍有一些其他措施需要考虑,如下所示:

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

    • 添加参数 start-maximized

      ChromeOptions options = new ChromeOptions();
      options.addArguments("--headless");
      options.addArguments("start-maximized");
      WebDriver driver = new ChromeDriver(options);
      
      Run Code Online (Sandbox Code Playgroud)
    • 添加参数 --window-size

      ChromeOptions options = new ChromeOptions();
      options.addArguments("--headless");
      options.addArguments("--window-size=1400,600");
      WebDriver driver = new ChromeDriver(options);
      
      Run Code Online (Sandbox Code Playgroud)
    • 使用 setSize()

      ChromeOptions options = new ChromeOptions();
      options.addArguments("--headless");
      WebDriver driver = new ChromeDriver(options);
      driver.manage().window().setSize(new Dimension(1440, 900));
      
      Run Code Online (Sandbox Code Playgroud)

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

  • 此外,您还可以在尝试以下操作之前使用ExpectedConditions 等待拦截元素不可见invisibilityOfElementLocatedclick()

    • 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();
      
      Run Code Online (Sandbox Code Playgroud)
    • 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();
      
      Run Code Online (Sandbox Code Playgroud)

参考

您可以在以下位置找到一些相关的讨论:


小智 6

上述答案都不适合我。尝试使用操作类,如下所示:

WebElement element = driver.findElement(By.xpath("//div[@class='footer']"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

14325 次

最近记录:

5 年,5 月 前