Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
Selenium chrome webDriver-关注最新的OpenNew选项卡java_Java_Selenium Webdriver_Selenium Chromedriver - Fatal编程技术网

Selenium chrome webDriver-关注最新的OpenNew选项卡java

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

我在尝试关注我用selenium web驱动程序打开的最新选项卡时遇到了问题

以某种神秘的方式,当我尝试在两个选项卡之间切换时,它会起作用, 但是当我尝试用4个标签来做这件事时,它总是把注意力集中在第3个标签上

以下是获取WebDriver元素的函数的代码:

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;
     }
   }