【问题标题】:Selenium chrome webDriver - get focus on the latest open new tab javaSelenium chrome webDriver - 关注最新打开的新标签 java
【发布时间】:2018-02-06 14:52:12
【问题描述】:

我在尝试使用 selenium Web 驱动程序打开的最新标签时遇到问题。

以某种神秘的方式,当我尝试在 2 个选项卡之间进行切换时,它可以工作, 但是当我尝试使用 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。 第二行只是我想要关注的最后一个标签。

我在这里错过了什么吗??

【问题讨论】:

    标签: java selenium-webdriver selenium-chromedriver


    【解决方案1】:

    我没有看到这个问题。

    tabs 包含一个句柄列表(可能与您在浏览器中看到的顺序不同)。 tabs.size() 返回 4(4 个标签)。所以tabs.get(tabs.size() - 1))tabs.get(4 -1 )tabs.get(3)

    由于 java 是 0 索引的,tabs.get(3) 是最后一个选项卡。并且查看上面的输出是正确的; CDwindow-(4B50A8C4074BEDB41152003DED37FB32).

    第三个标签在哪里; CDwindow-(33FB208B51A8DD5F7DB947C7B0BAB9DD)?

    如果将窗口映射到名称,我发现更容易跟踪:

    public static Map<String, String> tabs = new HashMap<String, String>();
    

    第一个字符串是您自己的描述符,如“Admin”或“Facebook”,第二个字符串是 WindowHandle。您需要逐个添加窗口以跟踪它们。

    tabs.put(handleName, handle);
    

    但是当你想切换时你可以使用:

    driver.switchTo().window(tabs.get("Admin"));
    

    并消除所有混乱。

    【讨论】:

    • 它必须与他们进入的顺序相同,不是吗?但这不是问题,因为我也尝试过这个函数: Set handles = driver.getWindowHandles();字符串 currentHandle = driver.getWindowHandle();对于(字符串句柄:句柄){ if (!handle.equals(currentHandle)) { driver.switchTo().window(handle); } } @MivaScott
    • @Pikolo,我发现 getWindowHandles() 在订购时是不确定的。换句话说,您不能保证您的 List、Set 等的顺序与您在屏幕上看到的顺序相同。因此,您不能相信浏览器中的第三个选项卡在列表中是第三个。我认为这在您的第二个示例中引起了混乱。如果您只有两个窗口,那么该代码非常棒,因为它总是会选择您当前未查看的选项卡。但如果有3个或更多,它是无用的。您必须标记每个标签以确保您切换到正确的标签
    【解决方案2】:

    所以,经过一点调试 - 我刚刚写了一个 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;
         }
       }
    

    问题已为我解决,但我认为值得尝试理解这一点以满足未来的需求......

    【讨论】:

    • 您只是在所有选项卡中循环,直到找到一个有效的选项卡。这有很多缺点。 1) 如果超过一页可以满足 if() 怎么办? 2) 如果whatImLookingFor 不存在,for 循环就像找到它一样转到下一个语句(break 让你脱离循环,就像完成所有迭代而不中断一样)所以你不知道是否无论您是否找到它,仍然会出现错误。 3) 搜索每一页而不是一开始就找到正确的页面是在浪费时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多