【问题标题】:How to switch between windows in selenium?如何在硒中的窗口之间切换?
【发布时间】:2018-07-05 11:26:37
【问题描述】:

我正在开发一个仅适用于 IE 的应用程序。登录应用程序后,会打开一个新窗口,即主页。现在我的问题是我无法通过 IE 驱动程序找到主页中的任何元素。 不确定浏览器是否在前一个窗口中寻找元素。

我的方法:

public void awb_enquiry() throws Exception {

    String handles= driver.getWindowHandle();
    System.out.println(handles);
    driver.switchTo().window(handles);
    driver.findElement(By.xpath("//*[text()='Select']")).click();
}

【问题讨论】:

  • 我尝试了所有可能的方法来定位当前页面中的元素,但没有运气。我尝试检查先前元素中的元素以进行定位,但这也没有发生。我已经尝试了下面提到的所有事情:
  • 1. Waits(Implicit, Explicit) 2. try/catch 处理异常 3. 单独定位元素的唯一 xpath 4. 使用 finElement 断言大小 5. windowHandle(), windowHandles() 6. Action Class 7. 试图获取 URL / 页面标题 8. 用于从一个窗口导航到另一个窗口的迭代器 9. 使用 IsDisplayed(),检查 Element Present

标签: selenium internet-explorer selenium-webdriver webdriver iedriverserver


【解决方案1】:

我也遇到过类似的问题,无法获取定位器,但定位器确实存在。在这里我建议可行的解决方案,只需尝试使用 JavaScript 定位 Web 元素。

获取定位器的替代方法,如果 driver.findElement 不起作用,请使用以下 java 脚本

public WebElement getIsConvertedCheckBoxElement() {
JavascriptExecutor js = getDriver();
String script = "return document.getElementById('conversion');";
return (WebElement) js.executeScript(script);
}

【讨论】:

    【解决方案2】:

    正如@JimEvans 在他的 cmets 中提到的,需要注意的是,

    虽然用于存储句柄列表的数据类型可以按插入排序,但 WebDriver 实现迭代窗口句柄以插入它们的顺序不需要稳定。顺序是任意的。

    所以,我们必须诱导 WebDriverWait,然后在每次打开新标签/窗口时收集 窗口句柄,最后遍历 窗口句柄 和switchTo().window(newly_opened) 如下例所示:

    • 示例代码:

      System.setProperty("webdriver.ie.driver", "C:\\Utility\\BrowserDrivers\\IEDriverServer.exe");
      WebDriver driver =  new InternetExplorerDriver();
      driver.get("http://www.google.com");
      String first_tab = driver.getWindowHandle();
      System.out.println("Working on Google");
      ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');");
      WebDriverWait wait = new WebDriverWait(driver,5);
      wait.until(ExpectedConditions.numberOfWindowsToBe(2));
      Set<String> s1 = driver.getWindowHandles();
      Iterator<String> i1 = s1.iterator();
      while(i1.hasNext())
      {
          String next_tab = i1.next();
          if (!first_tab.equalsIgnoreCase(next_tab))
          {
          driver.switchTo().window(next_tab);
      
          System.out.println("Working on Facebook");
          }
      }
      
    • 控制台输出:

      Working on Google
      Working on Facebook
      

    【讨论】:

      【解决方案3】:
      String beforeLogin = driver.getWindowHandle();
      /*
      *  Perform Login
      */ 
      ArrayList<String> windows = new ArrayList<String>(driver.getWindowHandles()); 
      // Now switch to 2nd window 
      driver.switchTo.window(windows.get(1)); 
      driver.findElement(By.xpath("//*[text()='Select']")).click();
      

      【讨论】:

      • 这个答案不正确。 getWindowHandles 方法不会以任何顺序返回句柄。从集合中获取索引为 1 的句柄不保证是新打开的窗口。
      • 嗨 Shiva,感谢您的回答。但仍然出现错误:
      • java.lang.IndexOutOfBoundsException:索引:1,大小:1 在 java.util.ArrayList.rangeCheck(ArrayList.java:657) 在 java.util.ArrayList.get(ArrayList.java:433) ) 在 stepdefinitions.AppLogin.awb_enquiry(AppLogin.java:58) at ✽。然后用户查询 AWB 状态(cmsweb_001_login.feature:6)
      • @Navas 所以要么新窗口没有打开,要么在新窗口打开后需要休眠时间。如果您确定窗口已打开,则在窗口打开后放置 thread.sleep(2000) 并尝试切换到该窗口。
      • @JimEvans - 根据问题,登录后只有两个窗口。所以我相信我的语法会像过去 4 年在我的应用程序中为我工作的那样工作。
      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2016-03-24
      • 2021-02-13
      • 1970-01-01
      • 2017-07-11
      相关资源
      最近更新 更多