由于硒不提供切换到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());
}
提前感谢。
如果必须基于索引切换到窗口,则无需遍历所有窗口句柄。您可以执行以下操作:
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);
您可以这样简化:
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()
的检查,以确保index
在windows
的范围内Set<string>
更改为Iterator<string>
以使迭代更简单startIndex
来跟踪Iterator
指向的窗口句柄if
/ else
与startIndex
和index
的比较来确定是否应该1。切换到窗口句柄迭代器指向或2。移至下一个窗口通过调用hasNext()
和index++
处理。虽然使用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