簡體   English   中英

org.openqa.selenium.ElementClickInterceptedException:在無頭模式下使用 Selenium 和 Java 元素點擊攔截錯誤

[英]org.openqa.selenium.ElementClickInterceptedException: element click intercepted error using Selenium and Java in headless mode

我有一個項目,我正在使用 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 模式下工作,在 headless 模式下不工作,休眠了 6 分鍾但沒有解決,所以這不是時間問題

在此處輸入圖像描述

此錯誤消息...

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>

...意味着對所需元素的單擊被其他元素攔截。


單擊一個元素

理想情況下,在您需要為elementToBeClickable()誘導WebDriverWait的任何元素上調用click()時,您可以使用以下任一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 瀏覽器無法以最大化模式打開。 因此,您必須使用以下任一命令/參數來最大化無頭瀏覽器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));

您可以在無頭模式下無法最大化 Chrome Window 中找到詳細討論

  • 此外,您還可以在嘗試click()之前使用ExpectedConditions invisibilityOfElementLocated等待攔截元素不可見,如下所示:

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

參考

您可以在以下位置找到一些相關的相關討論:

嘗試添加顯式等待

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

如果這不起作用,請嘗試使用 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);

對於這個問題:

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

以上答案都不適合我。 嘗試使用動作 class 如下:

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

就我而言,“JavaScript”有效:

WebElement ele = driver.findElement(By.xpath("(//input[@name='btnK'])[2]"));
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].click()", ele);

它取自: http://makeseleniumeasy.com/2020/05/25/elementclickinterceptedexception-element-click-intercepted-not-clickable-at-point-other-element-would-receive-the-click/

WebDriverWait 等待 = new WebDriverWait(driver, 10 ); ---> 已棄用,它給出了一個錯誤。 請改用以下內容:

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

確保為WebDriverWait 和 ExpectedConditions導入相關項目。

就我而言,沒有任何效果。 只有THREAD.SLEEP()方法有效!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM