【问题标题】:Automated tests with Selenium: how to close alert-Windows?使用 Selenium 进行自动化测试:如何关闭警报窗口?
【发布时间】:2017-01-29 13:48:56
【问题描述】:

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

根本问题是页面的刷新次数。当我寻找一个元素时:

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

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

更改 DropDownList 后: sortDropDownlist.selectByValue("alpha");

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

 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");
 }

}

如何等待页面刷新?

谢谢。

【问题讨论】:

  • 控制台输出是什么? “MyThread 停止”打印出来了吗?
  • 关闭警报窗口后(10 秒后),我得到:org.openqa.selenium.TimeoutException: Timed out after 10 seconds waiting for alert to be present ... MyThread 停止
  • 您确定,您正在等待 javascript 警报吗??
  • 实际上我发现了这个 wait.until(ExpectedConditions.alertIsPresent());在这里的一些条目中并使用它。我希望它正在等待 javascript 警报??

标签: multithreading selenium alert


【解决方案1】:

如果您收到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 技术来处理警报。

【讨论】:

  • 根据您的问题,我在问题末尾添加了上面的错误(部分:更多信息),即 org.openqa.selenium.WebDriverException:未知错误:无法从意外警报打开中确定加载状态
  • 你能弄清楚这个警报出现在你执行的哪个部分吗
  • 我刚刚将它添加到上面的问题声明中。谢谢
  • 我的错误,对不起。在该下拉值更改后调用isAlertpresent(driver);。你试过了吗
  • 是的,其实我之前和之后都是这样称呼的。由于它是一个同步功能,它只是偶然地捕捉到警报。不是吗?
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多