【问题标题】:org.openqa.selenium.ElementClickInterceptedException: element click intercepted error using Selenium and Java in headless modeorg.openqa.selenium.ElementClickInterceptedException:在无头模式下使用 Selenium 和 Java 的元素单击拦截错误
【发布时间】:2020-09-27 07:50:14
【问题描述】:

我有一个正在使用 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 模式下工作,而不是在无头模式下工作,睡眠 6 分钟并没有解决,所以这不是时间问题

【问题讨论】:

    标签: java selenium xpath css-selectors webdriverwait


    【解决方案1】:

    以上答案都不适合我。尝试使用动作类如下:

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

    【讨论】:

      【解决方案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).
      

      另一个元素收到点击:

      答案是使用 javascript 执行器显式等待。这种组合对我有用:

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

      【讨论】:

        【解决方案3】:

        此错误消息...

        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 被其他元素拦截。


        点击一个元素

        理想情况下,在任何元素上调用click() 时,您需要为elementToBeClickable() 诱导WebDriverWait,您可以使用以下Locator Strategies 之一:

        • 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 browser in Headless mode 不会以最大化模式打开。所以你必须使用以下任一命令/参数来最大化无头浏览器Viewport

          • 添加参数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找到详细讨论

        • 此外,您还可以使用ExpectedConditions invisibilityOfElementLocated 等待intercept 元素不可见,然后再尝试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();
            

        参考

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

        【讨论】:

        • 我知道并且我使用它,但是在更改为无头后它不起作用并且等待可点击后仍然出现异常,只有 java 脚本有效
        • @Bastian 查看答案更新并告诉我状态。
        • 它解决了,我使用 options.addArguments("start-maximized");和 options.addArguments("--window-size=1920,1080");我没有使用 driver.manage().window().setSize(new Dimension(1920, 1080));第三个是做什么的?因为我不使用它 - @DebanjanB
        • @Bastian driver.manage().window().setSize(new Dimension(1920, 1080)); 只是另一种设置浏览器客户端的方式Viewport
        • 我遇到了同样的问题,并且我使用的元素有元素 id,所以我尝试使用不起作用的元素 id,然后我使用了 xpath,然后就可以了
        【解决方案4】:

        尝试添加显式等待

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

        【讨论】:

          猜你喜欢
          • 2022-12-16
          • 2021-10-14
          • 2022-12-07
          • 1970-01-01
          • 1970-01-01
          • 2021-05-16
          • 1970-01-01
          • 1970-01-01
          • 2021-09-04
          相关资源
          最近更新 更多