3

比方说

  1. 我有一个window 1. 我已经执行了一个window 1使window 2出现的事件。

  2. 现在我切换到window 2并点击了一个关闭它的按钮window 2

如果我driver.close()在执行导致窗口关闭的事件后使用,有时它会抛出NoSuchWindowException.

如果我不使用driver.close()then 有时 即使只有一个窗口driver.getWindowHandles().size()也会返回,并且我已经等待足够的时间使窗口数变为.21

我刷新driver.getWindowHandles()并检查driver.getWindowHandles().size()成为1,但有时不会。

我的问题是,driver.close()单击导致窗口关闭的按钮后是否需要使用该方法?如何driver.close()正确使用。

编辑:是的,这是一个问题。如果 selenium 没有意识到window2已关闭,它会不断将句柄返回为2. 假设我关闭window2并切换回window1并执行了一个打开的事件window3。现在我想切换到window3. 这是问题,因为 Selenium 仍然认为windows2存在,现在根据 Selenium 有三个窗口。

String window1Handle = driver.getWindowHandle();
//Now I have oepend window3
//According to the Selenium there are 3 windows
// So driver.getWindowHandles().size() returns 3
 for (String window : driver.getWindowHandles() {
        if (!window.equals(window1Handle)) {
                  driver.switchTo().window();

上一行可能会抛出异常,因为驱动程序试图切换到一个已经关闭的窗口”

4

6 回答 6

3

不,您不需要执行 driver.close(),如果有任何东西保持打开状态,当您在测试结束时执行 driver.quit() 时,WebDriver 将清理并确保一切都正确关闭。

Selenium 可以跟踪打开了多少个窗口,如果您看到关闭的窗口的窗口句柄听起来像是一个潜在的错误。请记住,Selenium 可能需要一些时间才能意识到窗口已关闭,您可以尝试使用显式等待来等待窗口句柄的计数回落到 1,您需要添加以下内容预期条件:

  public static ExpectedCondition<Boolean> numberOfWindowsToBe(final int numberOfWindows) {
    return new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        return driver.getWindowHandles().size() == numberOfWindows;
      }
    };
  }

然后你可以通过这样做来使用它:

    WebDriverWait wait = new WebDriverWait(driver, 15, 100);
    wait.until(numberOfWindowsToBe(1));

或者您可以尝试通过执行 driver.close() 并捕获 NoSuchWindowException 来关闭窗口,例如

try{
    driver.close();
} catch(NoSuchWindowException ignored){
    System.out.println("Window already closed");
}

这应该让 Selenium 意识到窗口已经关闭(虽然老实说我不会打扰)。

*编辑*

所以听起来问题是你有多个窗口句柄,你不知道哪个是已经关闭的窗口,哪个是你新打开的窗口。一种解决方法是跟踪地图中的窗口句柄。每次打开新窗口时,都会在地图中存储窗口句柄,如下所示:

Map<String, String> openedWindows = new HashMap<String, String>();
openedWindows.put("Window 1", driver.getWindowHandle());

然后,您将知道哪个窗口句柄与您的窗口相关联,然后您可以在窗口关闭时从地图中删除它们。您将知道哪些仍在报告的句柄实际上已关闭,哪些正在报告错误。

真的,这听起来像是 Selenium 窗口处理中的一个错误,我建议您使用重现问题的最小测试脚本在问题跟踪器上提出问题。当然,上面的另一个选项仍然有效,尝试关闭窗口但捕获异常,看看是否给 Selenium 提供了从窗口句柄列表中删除它所需的踢。

于 2013-08-21T08:49:12.443 回答
0

我知道这有点骇人听闻……但我从未见过像您所描述的那样,所以我认为值得一试。更改此代码:

driver.switchTo().window();

像这样:

try{
   driver.switchTo().window();
   perform action that will throw error
   return; //will return if error wasn't thrown
catch(Error thrown if on bad window){
   //continue in your for loop to switch to the next window;
}
于 2013-08-21T16:30:36.740 回答
0

我遇到了同样的问题。

在我执行弹出第二个窗口的操作之前,我发起了

String window = driver.getWindowHandle();   

后来我单击了填充窗口 2 的链接 1,然后我切换到该窗口

driver.switchTo().window(window name);

我在 Window 2 中执行了我的操作,当我单击 Window 2 中的链接时,我的窗口会自动关闭,如果我使用driver.close()它不会发生,因为 webdriver 会像你说的那样抛出错误

所以我没有尝试关闭第二个窗口,而是尝试切换回窗口 1

driver.switchTo().window(window);

这是因为由于窗口 2 是自动关闭的,并且由于控件没有传递给窗口 1,所以会发生错误。所以没有必要关闭窗口 2。相反,我们可以切换回默认窗口并继续或关闭默认窗口窗户..

于 2013-08-22T12:37:00.897 回答
0

我写了一个对我很有效的方法。

public static boolean letWebDriverRealizeThisWindowHasBeenClosed(WebDriver driver,
            String closedWindowHandle) {
        /**
         * to avoid infinite loop, do write a break when definite time has been passed
         */
        /**
         * Generally, this method returns true given that window is closed
         */

    boolean isWebDriverRealized = false;
    long start = System.currentTimeMillis();
    long end = start + (30 * 1000); //30 seconds
    while (!isWebDriverRealized 
            && System.currentTimeMillis() < end) {
        try {
            driver.switchTo().window(closedWindowHandle);
        } catch (NoSuchWindowException nswe) {
            isWebDriverRealized = true;
        }
    }
    return isWebDriverRealized;
}

如果这个方法返回true,那么就意味着WebDriver已经实现了窗口closed。一旦上述方法返回,就会driver.getWindowHandles.size()返回正确数量的窗口true

于 2013-09-21T14:07:35.640 回答
-1

不,你不需要这样做。因为第二个窗口已经关闭,如果您使用方法driver.close(),它将关闭您的第一个窗口和浏览器本身(因为浏览器窗口中只剩下一个选项卡)。

于 2013-08-14T10:37:08.883 回答
-1

它取决于窗口,

  1. 单击外部窗口内容时关闭某些窗口,在这种情况下不需要driver.close()方法。

  2. 但是对于某些窗口,点击窗口内容之外的窗口,窗口无法关闭(即点击关闭按钮后窗口关闭),此时需要使用该driver.close()方法关闭该窗口。

于 2013-08-14T12:35:19.477 回答