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 @Bastiandriver.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 的元素单击拦截错误的主要内容,如果未能解决你的问题,请参考以下文章