如何使用硒中的索引切换到窗口

问题描述 投票:0回答:3

由于硒不提供切换到Windows(多窗口)的方法,但是我想使用索引来定制方法来切换到不同的窗口。但是下面的代码无法按预期工作。请建议以下方法的最佳实现。

    public void switchToWindowIndex(int index) {
    Set<String> windows = driver.getWindowHandles();
    int totalWin = windows.size();
    String winTitle = null;
    for (int i =0; i<= totalWin; i++) {
        if (i == index) {
            winTitle = windows.toArray()[i].toString();
            return;
        }
        System.out.println(windows.toArray()[i].toString());

    }
    driver.switchTo().window(winTitle);
    logger.info("Switched to " + driver.getTitle());
}

提前感谢。

java selenium automation katalon-studio
3个回答
0
投票

如果必须基于索引切换到窗口,则无需遍历所有窗口句柄。您可以执行以下操作:

public void switchToWindowIndex(int index) {
    Set<String> windowHandles = driver.getWindowHandles();
    List<String> windowStrings = new ArrayList<>(windowHandles);
    String reqWindow = windowStrings.get(index);
    driver.switchTo().window(reqWindow);
    logger.info("Switched to " + driver.getTitle());
}

代码说明:获取窗口句柄

Set<String> windowHandles = driver.getWindowHandles();

将窗口句柄转换为arraylist,以便我们可以基于索引获取字符串

List<String> windowStrings = new ArrayList<>(windowHandles);

基于索引获取窗口句柄字符串

String reqWindow = windowStrings.get(index);

切换到所需窗口

driver.switchTo().window(reqWindow);

0
投票

您可以这样简化:

driver.switchTo().window(driver.getWindowHandles().toArray()[index]);

但是,如果出于某种原因要迭代窗口句柄,则可以采用这种方法:

public void switchToWindowIndex(int index) {

    // get list of window handles - use iterator instead of set
    Iterator<String> windows = driver.getWindowHandles();

    // if index > windows.size()-1 then we will get out of bounds exception
    if (index => windows.size()-1)
    {
        System.out.println("Invalid index passed.");
        return;
    }

    // declare starting index as 0 to begin iteration
    int startIndex = 0;

    while (windows.hasNext())
    {
        // if startIndex == index then iterator is pointing to desired window handle
        if (startIndex == index) {
            driver.switchTo().window(window);
            break; // we are finished now, so break out of loop
        }
        // if we are not pointing to correct window handle then go to next one
        else {
            startIndex++;
            window = windows.next();

        } // end if else

    } // end while
}

这里有些变化:

  • [针对index添加了对windows.size()的检查,以确保indexwindows的范围内
  • Set<string>更改为Iterator<string>以使迭代更简单
  • 引入startIndex来跟踪Iterator指向的窗口句柄
  • 使用if / elsestartIndexindex的比较来确定是否应该1。切换到窗口句柄迭代器指向或2。移至下一个窗口通过调用hasNext()index++处理。

0
投票

虽然使用Selenium,但您不应使用index在[[窗口句柄之间的switchTo(),因为,尽管看起来[在讨论中,西蒙明确提到:

While the datatype used for storing the list of handles may be ordered by insertion, the order in which the WebDriver implementation iterates over the window handles to insert them has no requirement to be stable. The ordering is arbitrary.

因此,要在

窗口句柄

之间切换,您必须使用以下两种方法之一:

A

    Set

,您可以在Selenium switch focus to tab, which opened after clicking link]中找到详细的讨论>
  • 一个迭代器,您可以在Best way to keep track and iterate through tabs and windows using WindowHandles using Selenium中找到详细的讨论”>
  • © www.soinside.com 2019 - 2024. All rights reserved.