【问题标题】:switch to new window after clicking on the hyperlink using selenium使用 selenium 单击超链接后切换到新窗口
【发布时间】:2016-09-09 10:18:22
【问题描述】:

任何人都可以帮助我在使用 selenium 进行自动化单击超链接后如何切换到新窗口。我尝试了以下代码,但我的测试用例失败了:

public void openView(){

        final WebElement visa=driver.findElement(By.id("pageContainer"));   
        timeOut(10000);
        final List<WebElement> images=visa.findElements(By.className("nametag"));
        String handlewindow = driver.getWindowHandle();
        for(String winHandle : driver.getWindowHandles()){
            driver.switchTo().window(winHandle);
        }
        images.get(0).findElement(By.className("info")).findElement(By.tagName("a")).click();;

【问题讨论】:

  • 测试用例失败是什么意思?它在哪一行失败了?有什么例外??
  • 这个link 可以帮助你得到答案。
  • 您在下面的评论中说您实际上指的是新标签,而不是新窗口。您介意更新问题吗?
  • @Anita 您能否指出您要执行的步骤。根据您的问题,我可以猜出您的步骤如下: 1. 您在浏览器中打开了一个选项卡? 2.然后从那个选项卡你试图点击一个链接? 3. 然后你尝试创建一个新标签并尝试切换到那个新标签??

标签: java selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

这就是我们正在使用的(Java):

public void switchToLatestPopupWindow()
{
    Iterator<String> handleIterator = this.driver.getWindowHandles().iterator();
    while (handleIterator.hasNext())
    {
        String handle = handleIterator.next();
        if (!handleIterator.hasNext())
        {
            this.driver.switchTo().window(handle);
        }
    }
}

public void resetToMainWindow()
{
    Iterator<String> handleIterator = this.driver.getWindowHandles().iterator();
    String parentHandle = null;
    while (handleIterator.hasNext())
    {
        String handle = handleIterator.next();
        if (parentHandle == null)
        {
            parentHandle = handle;
        } else if (!parentHandle.equals(handle))
        {
            this.driver.switchTo().window(handle);
            this.driver.close();
        }
    }
    this.driver.switchTo().window(parentHandle);
}

【讨论】:

    【解决方案2】:

    假设最后一行代码:

    images.get(0).findElement(By.className("info")).findElement(By.tagName("a")).click()  
    

    打开一个新窗口,您在 click() 之后子窗口打开之前获取父窗口本身的窗口句柄。

    其次,这里是切换到子窗口的代码:

    String handlewindow = driver.getWindowHandles().toArray()[1];
    driver.switchTo().window(handlewindow);
    

    解释是 driver.getWindowHandles() 返回一组所有打开的窗口句柄。将 Set 转换为数组并获取索引 1 处的元素,因为子窗口在 1,父窗口在 0。

    【讨论】:

    • 嗨@ChandrachudNanduri 我试过你说的,但它在同一个标​​签中打开。你能告诉我如何让它在新标签中打开。就像应该为它打开一个单独的标签一样。跨度>
    • 要求不明确......我假设当您单击链接时,它会自动在新窗口中打开,您需要帮助切换到新窗口。我给出的答案就是这样。
    • 不,我不是在另一个选项卡中打开,而是在同一个窗口中打开。
    • 使用从 Stackoverflow 上的另一个线程获取的这段代码...WebElement link = driver.findElement(By.id("&lt;your id&gt;"));Actions newwin = new Actions(driver);newwin.keyDown(Keys.CONTROL).click(link).keyUp(Keys.CONTROL).build().perform();
    • 这没有使用 switchTo() 函数
    【解决方案3】:

    使用从 Stackoverflow 上的另一个线程中提取的这段代码...

    WebElement link = driver.findElement(By.linkText("<your link text>")); 
    Actions newwin = new Actions(driver);
    newwin.keyDown(Keys.CONTROL).click(link).keyUp(Keys.CONTROL)‌​.build().perform();
    

    我检查了这个,它会在新选项卡中打开链接。然后使用此代码切换到新标签...

    String handlewindow = driver.getWindowHandles().toArray()[1];
    driver.switchTo().window(handlewindow);  
    

    【讨论】:

    • 它仍然在同一个标​​签中打开,只是不是单独的:(
    • 我检查了我的 Eclipse 中的代码,它在一个新选项卡中打开了......我不确定你到底发生了什么
    【解决方案4】:

    在for循环中,我们需要检查当前窗口句柄是否不等于循环获取的句柄

    String handlewindow = driver.getWindowHandle();
    for(String winHandle : driver.getWindowHandles()){
        if (! handlewindow.equals (winHandle))
            driver.switchTo().window(winHandle);
    }
    

    【讨论】:

      【解决方案5】:
          Actions ac  = Actions(driverObj);
          String parentHandle = driverObj.getWindowHandle();
          WebElement we = driverObj.findElement(By.xpath("here is your xpath"));
          ac.keyDown(Keys.CONTROL).click(we).keyUp(Keys.CONTROL).build().perform();
          String currentHandle ="";
          Set<String> win  = ts.getDriver().getWindowHandles();   
      
          Iterator<String> it =  win.iterator();
          if(win.size() > 1){
              while(it.hasNext()){
                  String handle = it.next();
                  if (!handle.equalsIgnoreCase(parentHandle)){
                      ts.getDriver().switchTo().window(handle);
                      currentHandle = handle;
                  }
              }
          }
          else{
              System.out.println("Unable to switch");
          }
      

      使用上面的代码,您可以在新标签中打开任何链接..

      【讨论】:

        【解决方案6】:

        要在标签之间切换,您可以使用以下方法:

            public void switchToNextTab() {
                ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
                driver.switchTo().window(tab.get(1));
            }
        
            public void switchToPreviousTab() {
                ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
                driver.switchTo().window(tab.get(0));
            }
        

        【讨论】:

          猜你喜欢
          • 2018-04-15
          • 2011-11-19
          • 2021-07-31
          • 1970-01-01
          • 2015-05-01
          • 2015-10-20
          • 2013-08-10
          • 2013-10-04
          • 1970-01-01
          相关资源
          最近更新 更多