Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Selenium中使用索引切换到窗口_Java_Selenium_Automation_Katalon Studio - Fatal编程技术网

Java 如何在Selenium中使用索引切换到窗口

Java 如何在Selenium中使用索引切换到窗口,java,selenium,automation,katalon-studio,Java,Selenium,Automation,Katalon Studio,由于selenium没有提供切换到windows多窗口的方法,但我想使用定制方法使用索引切换到不同的窗口。但下面的代码并没有按照预期工作。请建议以下方法的最佳实施 public void switchToWindowIndex(int index) { Set<String> windows = driver.getWindowHandles(); int totalWin = windows.size(); String winTitle = nul

由于selenium没有提供切换到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());
}

提前感谢。

您可以这样做:

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
}
这里发生了一些变化:

添加了针对windows.size的索引检查,以确保索引在windows的范围内 将集合更改为迭代器以使迭代变得简单 引入startIndex来跟踪迭代器指向的窗口句柄 使用if/else与startIndex和index进行比较,以确定是否应该1。切换到窗口句柄迭代器指向或2。通过调用hasNext和index++转到下一个窗口句柄。
您可以这样做:

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
}
这里发生了一些变化:

添加了针对windows.size的索引检查,以确保索引在windows的范围内 将集合更改为迭代器以使迭代变得简单 引入startIndex来跟踪迭代器指向的窗口句柄 使用if/else与startIndex和index进行比较,以确定是否应该1。切换到窗口句柄迭代器指向或2。通过调用hasNext和index++转到下一个窗口句柄。
如果必须切换到基于索引的窗口,则无需迭代所有窗口句柄。你可以这样做:

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());
}
切换到所需窗口

driver.switchTo().window(reqWindow);

如果必须切换到基于索引的窗口,则无需迭代所有窗口句柄。你可以这样做:

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());
}
切换到所需窗口

driver.switchTo().window(reqWindow);
在使用时,不应使用索引在窗口句柄之间切换,因为,尽管看起来窗口句柄的排序方式与最旧窗口的排序方式相同,但最新窗口的排序方式与最旧窗口的排序方式相同。但事实并非如此:它完全是随机的

在一次讨论中,Simon明确提到:

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

因此,要在窗口句柄之间切换,必须使用以下任一选项:

一组,您可以在中找到详细的讨论 一个迭代器,您可以在 在使用时,不应使用索引在窗口句柄之间切换,因为,尽管看起来窗口句柄的排序方式与最旧窗口的排序方式相同,但最新窗口的排序方式与最旧窗口的排序方式相同。但事实并非如此:它完全是随机的

在一次讨论中,Simon明确提到:

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

因此,要在窗口句柄之间切换,必须使用以下任一选项:

一组,您可以在中找到详细的讨论 一个迭代器,您可以在
请记住,阵列的顺序将根据浏览器的不同而有所不同。无法保证最近打开的选项卡窗口将是最后一个索引或第一个索引。你必须自己追踪把手。记录当前的,并比较getWindowHandles以查看哪个是新的…请记住,数组的顺序将根据浏览器的不同而不同。无法保证最近打开的选项卡窗口将是最后一个索引或第一个索引。你必须自己追踪把手。记录当前,并比较getWindowHandles以查看哪个是新的。。。