Selenium chrome webDriver-关注最新的OpenNew选项卡java
我在尝试关注我用selenium web驱动程序打开的最新选项卡时遇到了问题 以某种神秘的方式,当我尝试在两个选项卡之间切换时,它会起作用, 但是当我尝试用4个标签来做这件事时,它总是把注意力集中在第3个标签上 以下是获取WebDriver元素的函数的代码:Selenium chrome webDriver-关注最新的OpenNew选项卡java,java,selenium-webdriver,selenium-chromedriver,Java,Selenium Webdriver,Selenium Chromedriver,我在尝试关注我用selenium web驱动程序打开的最新选项卡时遇到了问题 以某种神秘的方式,当我尝试在两个选项卡之间切换时,它会起作用, 但是当我尝试用4个标签来做这件事时,它总是把注意力集中在第3个标签上 以下是获取WebDriver元素的函数的代码: ArrayList tabs = new ArrayList(driver.getWindowHandles()); System.out.println(tabs); System.out.println(tabs.get
ArrayList tabs = new ArrayList(driver.getWindowHandles());
System.out.println(tabs);
System.out.println(tabs.get(tabs.size() -1));
driver.switchTo().window((String) tabs.get(tabs.size() - 1));
这是我打印标签时的输出:
[CDwindow-(43C81B1D7B7C666BFBFB339971ADEE0F), CDwindow-(CDD5D45D021E698DD005BC2AD6201714), CDwindow-(33FB208B51A8DD5F7DB947C7B0BAB9DD), CDwindow-(4B50A8C4074BEDB41152003DED37FB32)]
CDwindow-(4B50A8C4074BEDB41152003DED37FB32)
如您所见,第一行是ArrayList中的所有行。
第二行只是我想关注的最后一个选项卡
我在这里遗漏了什么吗?我看不到问题所在
选项卡
包含句柄列表(这些句柄可能与您在浏览器中看到它们的顺序相同,也可能不相同)。
tabs.size()
返回4(4个选项卡)。所以tabs.get(tabs.size()-1))
是tabs.get(4-1)
或tabs.get(3)
由于java是0索引的,tabs.get(3)
是最后一个选项卡。从上面的输出来看是正确的CDwindow-(4B50A8C4074BEDB411152003DED37FB32)
到第三个标签的位置;CDwindow-(33FB208B51A8DD5F7DB947C7B0BAB9DD)
我发现,如果将窗口映射到一个名称,则更容易跟踪:
public static Map<String, String> tabs = new HashMap<String, String>();
但当您想要切换时,可以使用:
driver.switchTo().window(tabs.get("Admin"));
然后消除所有的混乱。所以,经过一点调试后,我刚刚写了一个if语句,它将在我想要的页面上停止
Set<String> handles = driver.getWindowHandles();
String currentHandle = driver.getWindowHandle();
for (String handle : handles) {
if (!handle.equals(currentHandle)) {
driver.switchTo().window(handle);
if(whatImLookingFor)
break;
}
}
Set handles=driver.getWindowHandles();
字符串currentHandle=driver.getWindowHandle();
for(字符串句柄:句柄){
如果(!handle.equals(currentHandle)){
driver.switchTo().窗口(手柄);
如果(正在寻找什么)
打破
}
}
这个问题对我来说已经解决了,但我认为,为了将来的需要,有必要尝试理解这一点……问题的顺序必须与他们进入的顺序相同,不是吗?但这不是问题所在,因为我也尝试了这个函数:Set handles=driver.getWindowHandles();字符串currentHandle=driver.getWindowHandle();对于(字符串句柄:句柄){if(!handle.equals(currentHandle)){driver.switchTo().window(句柄);}@MivaScott@Pikolo,我发现getWindowHandles()在顺序上是不确定的。换句话说,您不能保证列表、集合等的顺序与您在屏幕上看到的顺序相同。因此,您不能相信浏览器中的第三个选项卡是列表中的第三个选项卡。我认为这在你的第二个例子中引起了混乱。如果您只有两个窗口,那么这段代码非常好,因为它将始终选择您当前未查看的选项卡。但如果有3个或更多,它是无用的。你必须给每个标签贴上标签,以确保你切换到了正确的标签。你只是在所有标签之间循环,直到找到一个有效的标签。这有许多缺点。1) 如果多个页面可以实现if(),该怎么办?2) 如果
whatimlookingfoor
不存在,for循环只会转到下一个语句,就好像它已经找到了一样(break会让您脱离循环,就像完成所有迭代而不中断一样),因此您不知道是否找到了它,并且仍然会出错。3) 你在浪费时间,搜索每一页,而不是一开始就去正确的一页。
Set<String> handles = driver.getWindowHandles();
String currentHandle = driver.getWindowHandle();
for (String handle : handles) {
if (!handle.equals(currentHandle)) {
driver.switchTo().window(handle);
if(whatImLookingFor)
break;
}
}