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

Posted

技术标签:

【中文标题】org.openqa.selenium.ElementClickInterceptedException:在无头模式下使用 Selenium 和 Java 的元素单击拦截错误【英文标题】:org.openqa.selenium.ElementClickInterceptedException: element click intercepted error using Selenium and Java in headless mode 【发布时间】: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 分钟并没有解决,所以这不是时间问题

【问题讨论】:

【参考方案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();

参考

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

Selenium Web Driver & Java. Element is not clickable at point (x, y). Other element would receive the click Element MyElement is not clickable at point (x, y)… Other element would receive the 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);

【讨论】:

以上是关于org.openqa.selenium.ElementClickInterceptedException:在无头模式下使用 Selenium 和 Java 的元素单击拦截错误的主要内容,如果未能解决你的问题,请参考以下文章