Java 如何在Selenium中使用索引切换到窗口
由于selenium没有提供切换到windows多窗口的方法,但我想使用定制方法使用索引切换到不同的窗口。但下面的代码并没有按照预期工作。请建议以下方法的最佳实施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
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以查看哪个是新的。。。