我的应用程序是Angular JS,我们正在使用Highcharts。我试图点击弹出窗口上的关闭按钮,我有正确的xpath,无论是相对的还是绝对的,都能找到正确的元素。
当我手动检查它时,但当我用Java从Selenium运行时,它没有点击它。它也没有抛出任何错误。我也试过用Javascript,它也没有点击,但是当我从控制台手动执行JavaScript时,它又工作了。
Selenium版本:3.141.59。
Button.Button.Selenium版本:3.141.59
Console:
HTML Snippet :
<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中没有点击。这不是页面加载的问题,因为我已经尝试过多次明确的等待,但运气不佳。由于某些原因,该元素不可见intractable。
确保你的定位器是唯一的。它可以确保使用chrome控制台也如下面所示。
这可能是同步问题。例如,当你的模型即将在页面上弹出时,Selenium会同时进行点击,所以在这种情况下,点击会被执行而不会出现任何错误。在这种情况下,你可以引入显式等待来确保元素已经准备好执行动作。
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("button.btn.btnclose")));
element.click();
或者为了调试的目的,你可以使用一些硬编码的等待。Thread.sleep
脚本中,以确保是否是时间问题。请注意,不建议使用硬编码等待。请参考下面的代码。
Thread.sleep(5000);
driver.findElement(By.cssSelector("button.btn.btnclose")).click();
另一种Javascript方法来执行点击。
WebElement element = driver.findElement(By.cssSelector("button.btn.btnclose"));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].click();",element);
另一种执行点击的方法是 Actions
阶层
WebElement element = driver.findElement(By.cssSelector("button.btn.btnclose"));
Actions action = new Actions(driver);
action.moveToElement(element).click().perform();
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']"))));