如何在使用java with selenium>的网页中出现警报时收到通知

时间:2016-08-25 12:20:31

标签: java selenium

我正在尝试自动化一个网站,但突然出现的警报框与一些反馈有关,我需要关闭该警报,然后只有我可以进入该网站的新级别。 问题是我无法在该网站的特定时间找到警报框。它随机出现。 如何解决我的问题。

4 个答案:

答案 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();
                }

            }

            }