只有在新窗口中打开并确认页面是否正确加载时才切换到新窗口

时间:2014-02-21 19:21:42

标签: selenium-webdriver

我正在尝试点击下拉列表中的所有链接。某些链接将打开一个新的浏览器窗口,其中某些链接将加载到同一页面中。

所以,我想只在新窗口打开时切换到新窗口,还需要确认新页面是否正确加载。  我已经有代码切换窗口。但即使没有打开新窗口,它也试图切换新窗口。

有人可以帮助我。

以下是相关的HTML:

<html>
    <div class="column span-8">
        <div class="search-container align-center">
            <div class="search">
                <div class="search-dropdown" onclick="showHideUtilMenu(event, 'SearchMenu');">
                    <span id="searchoptionValue">Consumer</span>
                    <span id="dropdownarrow"</span>
                    <span id="searchurlValue" style="display: none;">http://</span>
                    <div id="SearchMenu" class="utility-menu combobox visible">
                        <ul class="menu-list">
                            <li class="menu-link">
                                <li class="menu-link divider">
                                    <a onclick="getSearchOption('Consumer','http://');">Consumer</a>
                                ...

这是我到目前为止使用的代码:

List<WebElement> list = driver.findElements(By.xpath("//*[@class='search-dropdown']/div[1]/ul/li"));
for (WebElement option : list)
{
    String strLabel = option.getText();
    if(strlabel.equalsIgnoreCase(value1) && country.equals("US"))
    {
        option.findElement(By.linkText(strLabel)).click();
        CommonFunctions.waitForPageLoad();
        CommonFunctions.switchWindow();
    }
}

2 个答案:

答案 0 :(得分:0)

我希望您需要类似下面的方法

class CommonFunctions {
   /**
   * It will wait for an element until it loads completely
   */
  public static void waitForPageToLoad() {
        int i=0;
    while(isElementPresent(By.id("<specifySomeLocator>")))
    {
        Thread.sleep(100);
        if(++i>500)
        {
            break;
        }
    }
  }

  /**
   * It will Switch the control to new window if exist.
   */
  public static boolean switchToWindow(String mainWindowHandle) {
     Set<String> windowhandles=driver.getWindowhandles();
     if(windowhandles.size()>1) {
        windowhandles.remove(mainWindowHandle);
        driver.switchTo().window((String)windowhandles.toArray()[0]);
        return true;
     } else {
        return false;
     }
  }

}

您尝试实现类似下面的代码

List<WebElement> list = driver.findElements(By.xpath("//*[@class='search-dropdown']/div[1]/ul/li"));
for (int i=0;i<list.size();i++)
{
    String strLabel = driver.findElements(By.xpath("//*[@class='search-dropdown']/div[1]/ul/li")).get(i).getText();
    if(strlabel.equalsIgnoreCase(value1) && country.equals("US"))
    {
        String mainWindowHandle=driver.getWindowHandle();
        option.findElement(By.linkText(strLabel)).click();
        CommonFunctions.waitForPageToLoad();
        if(CommonFunctions.switchToWindow(mainWindowHandle)){
           //do your operation in new window
           //close new window using ==> driver.close();
           //switch back to main window ==> driver.switchTo().window(mainWindowHandle);
        } else {
           //do your operations in main window itself
        }
    }
}

仅供参考:如果您迭代下面的WebElements列表,如果在使用第一个元素执行其他操作时页面重新加载,则会尝试访问该列表中的第二个元素时抛出StaleElementReferenceException

for (WebElement option : list)
{
    String strLabel = option.getText();
    //do some operations
}

对于isElementPresent方法实施,请点击here

答案 1 :(得分:0)

这是一般性建议,而非直接回答您的问题。

您可以使用以下任一选项从当前网页导航到另一个网页:

driver.get(...);
driver.navigate().to(...);
driver.switchTo().frame(...);
driver.switchTo().window(...);

但是,一旦这样做,您从上一个网页的DOM获得的任何元素都可能变得“陈旧”。

为了避免这种情况,建议您首先获取要转到的所有网址(字符串),然后再导航到 中的每一个

以您问题中的代码为例,您可以按如下方式进行更改:

List<String> strLabels = new ArrayList<String>();
List<WebElement> list = driver.findElements(By.xpath("//*[@class='search-dropdown']/div[1]/ul/li"));
for (WebElement option : list)
{
    String strLabel = option.getText();
    if (strlabel.equalsIgnoreCase(value1) && country.equals("US"))
        strLabels.add(strLabel);
}
for (String strLabel : strLabels)
{
    driver.findElement(By.linkText(strLabel)).click();
    CommonFunctions.waitForPageLoad();
    CommonFunctions.switchWindow();
}