为什么我不能切换到SeleniumWebDriver打开的第三个窗口?我可以切换到第二个窗口并执行步骤,但不能执行第三个

axkjgtzd  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(289)

下面是我的代码:
//点击打开第二个窗口。页面是页面对象引用,方法被编写为单击按钮

public enterDetails(String fname)
{
firstPage.clickAddAdditionalDetail();
String parentWindow=driver.getWindowHandle();
String childWin1="";
String childWin2="";
Set<String> windows=driver.getWindowHandles();
Iterator<String> iterator=windows.iterator();
childWin1=iterator.next();
driver.switchTo.window(childWin1);
firstPage.clickOneTimeDetail();// able to click this on second window, this click opens third window
Thread.sleep(3000);
childWin1=driver.getWindowHandle();
windows=driver.getWindowHandles();
childWin2=iterator.next();
driver.switchTo.window(childWin2);
// the third window is opened but driver control is not getting passed i think. even when i print all window ids it is printing same id for all parent and child
addDetailPage.enterFirstName(String fname);
}
ufj5ltwl

ufj5ltwl1#

问题
问题一:
一个集合的迭代器,即使它是hashset,但它不是有序的。next()从迭代器对象随机返回元素,直到迭代器大小变为零。因此,它不应该用于开关窗口逻辑,因为您不会总是得到您想要的元素。
仅当您希望以任何顺序遍历所有窗口时才使用它。
问题二
在每个元素输出之后,迭代器从内存中删除元素并减小迭代器的大小。
因此,如果您有一个大小为1的集合,并且尝试调用iterator.next()两次,它将抛出element not found,因为first next()的大小为0。对于second next(),您试图从一个大小为零的迭代器中获取元素,因为该元素的大小会逐渐减小
在你的代码里
你真的在做下面的逻辑。

Set < String > hash_Set = new HashSet < String > ();

hash_Set.add("Geeks");

Iterator a = hash_Set.iterator();

System.out.println(a.next());

hash_Set
    = new HashSet < String > ();

hash_Set.add("1");
hash_Set.add("2");

System.out.println(a.next());

如果运行此代码,您将得到一个错误,说明第二个a.next()没有这样的元素。
这是因为在创建迭代器时,哈希集只有一个元素。这将创建大小为1的迭代器。在first.next()上,它删除一个元素并使大小为零。
即使将哈希集更新为两个元素,迭代器也不会重新初始化。因此,当调用a.next()时,它试图从大小为“0”的迭代器中查找某个符号。
溶液
用途:

Set<String> handlesSet = driver.getWindowHandles();
    Object[] handles = handlesSet.toArray();        
    childWin1=handles[handles.length-1];

同时确保您拨打:

handlesSet = driver.getWindowHandles();
    handles = handlesSet.toArray();     
    childWin2=handles[handles.length-1];

每次打开一个新窗口以便重新初始化数组时。

相关问题