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)
这个错误信息...
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()的任何元素,你需要引起WebDriverWait的elementToBeClickable(),你可以使用以下的定位策略:
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 次 |
| 最近记录: |