java - 我有正确的 XPath,但 selenium 没有在 Highcharts 弹出窗口中单击
问题描述
我的应用程序是 Angular JS,我们正在使用 Highcharts。我正在尝试单击弹出窗口上的关闭按钮,并且我有正确的 xpath,包括相对和绝对路径,可以找到正确的元素。
当我手动检查它时,但是当我使用 Java 从 Selenium 运行并且它没有单击它时。它也不会抛出任何错误。我也尝试过使用 Javascript,但它没有点击,但是当我从控制台手动执行 JavaScript 时,它再次起作用。
硒版本:3.141.59
按钮:
安慰:
HTML 片段:
<button type="button" style="float:right" class="btn btnclose " data-dismiss="modal" aria-hidden="true">
<i class="fa fa-2x fa-times-circle">
</i></button>
代码:
document.getElementsByClassName('btn btnclose ')[1].click()
public static void clickByJS(WebDriver driver){
JavascriptExecutor js = (JavascriptExecutor)driver;
driver.switchTo().activeElement();
js.executeScript("document.getElementsByClassName('btn btnclose ')[1].click()");
}
注意:我也检查了弹出窗口的其他元素,当我在浏览器中手动尝试时,我可以验证 xpath 是否正常工作并找到该元素,但使用 Selenium 时不会单击。这不是页面加载问题,因为我尝试过多次显式等待并且运气不佳。由于某种原因,该元素不可见/难以处理。
解决方案
getElementsByClassName()
getElementsByClassName()
方法返回文档中具有指定类名的所有元素的集合。
所以你不能使用getElementsByClassName()
. 您可以尝试通过单个课程,例如btnclose
. 因此,您的有效代码块将是:
public static void clickByJS(WebDriver driver){
JavascriptExecutor js = (JavascriptExecutor)driver;
driver.switchTo().activeElement();
js.executeScript("document.getElementsByClassName('btnclose')[1].click()");
}
更新
由于getElementsByClassName()
仍然不起作用,我建议您尝试使用久经考验的WebDriverWait,如下所示:
使用cssSelector:
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.btn.btnclose[data-dismiss='modal'] > i.fa.fa-2x.fa-times-circle"))).click();
使用xpath:
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='btn btnclose' and @data-dismiss='modal']/i[@class='fa fa-2x fa-times-circle']"))).click();
此外,您可以使用JavascriptExecutor
WebDriverWait以及如下:
使用cssSelector:
((JavascriptExecutor)driver).executeScript("arguments[0].click();", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.btn.btnclose[data-dismiss='modal'] > i.fa.fa-2x.fa-times-circle"))));
使用xpath:
((JavascriptExecutor)driver).executeScript("arguments[0].click();", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='btn btnclose' and @data-dismiss='modal']/i[@class='fa fa-2x fa-times-circle']"))));
推荐阅读
- java - 如何在 Maven 构建时注入一个属性,该属性稍后在 Java 项目中运行时可以访问?
- ruby-on-rails - 如何创建一个模块/助手来自动选择正确的 ruby 图像或视频标签?
- sql - Wordpress PHP 使用通配符准备 SQL 查询
- http - 颤振中的错误 url_launcher 不起作用
- r - R中带有扩展窗口的滚动回归
- javascript - Express 在主页以外的任何页面上刷新后卸载 css 文件
- python - 避免到处传递会话
- php - Apache 网站可以在程序集中调用 asp.net 函数吗?
- php - Laravel each() 闭包未执行
- angular - 如何使用相同的角度路线在 2 个不同的路由器插座中渲染 2 个不同的组件?