使用Selenium进行自动化测试:如何关闭警报-Windows?

时间:2016-09-21 10:45:51

标签: multithreading selenium alert

在使用selenium的网站上进行自动化测试我遇到了这个问题,在网站的某个地方,当我的测试更改DropDownList的选择时,会抛出一个警告窗口询问"你确定你想离开这个页面"。

根本问题是页面的刷新时间。当我寻找元素时:

Select sortingDropDownlist= new Select(webdriver.findElement(By.id("sortView")));

即使我没有改变任何内容,页面也需要一些时间才能刷新。在这种情况下,thread.sleep(500)将有助于防止警报被激活。

更改DropDownList后:     sortingDropDownlist.selectByValue("阿尔法&#34);

列表后面的onchange-javascript尝试重新加载页面,而我的测试继续到Then-part验证新值。测试卡在那里直到有人手动关闭警报窗口。我收到错误:

 org.openqa.selenium.WebDriverException: unknown error: cannot determine loading status
 from unexpected alert open
  (Session info: chrome=53.0.2785.116)
  (Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Windows NT 6.3 x86_64) (WARNING: The server did not provide any stacktrace information)
 Command duration or timeout: 43 milliseconds
 Build info: version: '2.53.1', revision: 'a36b8b1', time: '2016-06-30 17:37:03'
 System info: host: 'de-adn-bfxqp72', ip: '192.168.99.1', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_91'
 Driver info: org.openqa.selenium.chrome.ChromeDriver
 Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={chromedriverVersion=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4), userDataDir=C:\Users\javadieh\AppData\Local\Temp\scoped_dir11488_27974}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=53.0.2785.116, platform=WIN8_1, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
  Session ID: b6e2d6fec84269128a420809f929916d
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  ...

更改选择后,一个简单但又脏的解决方案是直接再次使用Thread.sleep(500)。但是我使用thread.sleep感觉不好。所以我正在寻找一个好的解决方案。

我也试过这个解决方案:在一个单独的线程中等待出现警告窗口,切换到它并关闭它。 但是......虽然警报窗口在那里我的线程找不到它。这不是时间问题。这是我的主题代码:

public class AlertChecker extends Thread {
  WebDriver webdriver=null;
  WebDriverWait wait;

public AlertChecker(WebDriver webdriver) {
        super();
        this.webdriver = webdriver;
        wait = new WebDriverWait(webdriver, 10);
  }

  public void run(){
    System.out.println("MyThread running");
      try {
           wait.until(ExpectedConditions.alertIsPresent());
           System.out.println("alert found");
           Alert alert = webdriver.switchTo().alert();
            alert.accept();
      } catch (Exception e) {
          //exception handling
        System.out.println(e);
      }
      System.out.println("MyThread stopping");
 }

}

我该如何等待页面刷新?

感谢。

1 个答案:

答案 0 :(得分:0)

如果您获得JavaScript Alert,请使用以下代码。

  public static void isAlertpresent(WebDriver driver)
  {
      try
      {
          Alert window = driver.switchTo().alert();
          String content = window.getText();
          window.accept();
          System.out.println("Alert Appeared & handeled : "+content );
      }
      catch (Exception e)
      {

          System.out.println("No Alert Appeared");

      } 
}

从您怀疑Alert出现的位置调用此方法,

isAlertpresent(driver);

如果不是JavaScript Alert,请尝试使用Window handling技术来处理警报。