我正在尝试自动化一个网站,但突然出现的警报框与一些反馈有关,我需要关闭该警报,然后只有我可以进入该网站的新级别。 问题是我无法在该网站的特定时间找到警报框。它随机出现。 如何解决我的问题。
答案 0 :(得分:3)
我能想到的最快的解决方案是创建一个方法 onAlert(),它将摆脱警报,如
try{
Alert alert = null;
try {
alert = driver.switchTo().alert();
} catch (Exception e) {
Robot robot = new Robot();
robot.keyPress(27);
robot.keyRelease(27);
}
if (alert != null) {
alert.dismiss();
}
}
之后,您只需每次都在代码中调用它。我知道这不是最好的实现,但它会起作用。
答案 1 :(得分:1)
如果要在执行期间阻止不必要的警报外观,则需要使用JavascriptExecutor
覆盖警报功能,如下所示: -
((JavascriptExecutor)driver).executeScript("window.alert = function() { return true; }");
在执行其他操作之前,每次加载新页面时,您应该只运行一次上述代码。它将在功能上覆盖警报并在内部接受它。
已修改: - 正如您所说的HTML
警告窗口而不是JavaScript
警告,上面的代码无效,在这种情况下您应隐藏此内容每次加载新页面时使用JavascriptExecutor
进行一次警报,然后再执行其他操作,如下所示:
//find first alert element
List<WebElement> alert = driver.findElements(..);
if(alert.size() > 0 && alert.get(0).isDisplayed())
{
((JavascriptExecutor)driver).executeScript("arguments[0].style.display = 'none'", alert.get(0));
}
答案 2 :(得分:1)
声明全局变量,例如:
public boolean acceptNextAlert = true;
以下是功能
public String closeAlertAndGetItsText()
{
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
}
catch (NoAlertPresentException ex)
{
ex.printStackTrace();
}
finally
{
acceptNextAlert = true;
}
return StartUrl;
}
}
调用此函数
String c=closeAlertAndGetItsText();
答案 3 :(得分:1)
我找到了基于Saurabh代码的解决方案
List<WebElement> alert = driver.findElements(..);
if(alert.size() > 0 && alert.get(0).isDisplayed())
{
((JavascriptExecutor)driver).executeScript("arguments[0].style.display = 'none'", alert.get(0));
}
我在我的项目中创建了类CloseAlert.java,并在类中创建了一个静态方法closeAlert。 为出现的警告框中的元素创建了两个列表,并在打开新页面时在我的主类中调用此类,并且它现在正常工作。
public class CloseAlert {
static List<WebElement> alert;
static List<WebElement> alert2;
public static void AlertClose(WebDriver driver)
{
alert = driver.findElements(By.xpath("//a[@class='fsrCloseBtn']"));
alert2 = driver.findElements(By.xpath("//div[@class='fsrDeclineButtonContainer']/a"));
if(alert.size() > 0 && alert.get(0).isDisplayed()||alert2.size() > 0 && alert2.get(0).isDisplayed())
{
if(driver.findElement(By.xpath("//div[@class='fsrDeclineButtonContainer']/a")).isDisplayed())
{
System.out.println("Alert found with no thanks button");
driver.findElement(By.xpath("//div[@class='fsrDeclineButtonContainer']/a")).click();
}
else if(driver.findElement(By.xpath("//a[@class='fsrCloseBtn']")).isDisplayed())
{
System.out.println("alert found with Close button" );
driver.findElement(By.xpath("//a[@class='fsrCloseBtn']")).click();
}
}
}