【问题标题】:Selenium switch focus to tab, which opened after clicking linkSelenium 将焦点切换到选项卡,单击链接后打开
【发布时间】:2019-09-02 13:18:10
【问题描述】:

出于自动化目的,我正在创建一个在表格中查找行的脚本。此行是可点击的并打开一个新的选项卡/地址。

使用 selenium,我现在可以找到表格行,单击链接,然后打开新选项卡。问题是我找不到任何方法将焦点切换到新打开的选项卡。我试图获取所有 windowHandle 并查看是否可以切换,但即使在新选项卡打开后,也只有 1 个 windowHandle。

下面是我的代码:

WebElement tableRow=driver.findElement(By.xpath("/html/body/div[1]/table/tbody/tr[2]"));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();", tableRow);

ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
    for(String winHandle : driver.getWindowHandles()){
        driver.switchTo().window(winHandle);
    }

Arraylist 始终包含 1 个单个 windowHandle,而不是 2 个。所以我无法将焦点切换到新选项卡。有没有办法解决这个问题?

【问题讨论】:

    标签: java selenium tabs focus


    【解决方案1】:

    要正确切换到新打开的 Tab,您需要诱导 WebDriverWait 以使 New Tab 呈现,然后通过for()循环,您需要遍历可用的 WindowHandles 并使用 WindowHandle 通过以下代码块调用switchTo().window(),这不是以前的 TAB:

    String first_handle = driver.getWindowHandle();
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("arguments[0].click();", tableRow);
    new WebDriverWait(driver,5).until(ExpectedConditions.numberOfWindowsToBe(2));
    Set<String> allHandles = driver.getWindowHandles();
    for(String winHandle:allHandles)
    {
        if (!first_handle.equalsIgnoreCase(winHandle)
        {
            driver.switchTo().window(winHandle);
        }
    }
    

    【讨论】:

    • @Ryan 很高兴你提出来。在this 讨论中,我已经详细解释了为什么西蒙说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。所以我会尽一切可能避免索引。
    • 我明白了。即使只有 2 个可能的选项卡可供选择,这是否适用?
    • @Ryan 无论有多少个窗口/选项卡 2、3、4 .... 存在,我都希望尽可能通用
    【解决方案2】:

    也许您只需要等到创建第二个窗口?也许 selenium 检查窗口句柄的速度太快了?

    试试WebDriverWait

    例子:

    String currentHandle = driver.getWindowHandle();
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.numberOfWindowsToBe(2));
    
    Set<String> allHandles = driver.getWindowHandles();
    for (String handle : allHandles) {
        if (!handle.equals(currentHandle)) driver.switchTo().window(handle);
    }
    

    如果窗口数量少于或多于 2 个,则会出现TimeoutException

    【讨论】:

    • 是的,这对我有用,等到窗口数变为 2。
    【解决方案3】:
     **Try this code:**
    
       public static void switchToNewWindow(WebDriver driver, WebElement 
       causeOfNewWindow) {
    
        // Get Handles before opening new window
        Set<String> oldHandles = driver.getWindowHandles();
    
        // Click element to open new Window
        causeOfNewWindow.click();
    
        // Get Handles after opening new window
        Set<String> newHandles = driver.getWindowHandles();
    
        for (String handle : newHandles) {
    
            if (!oldHandles.contains(handle)) {
                driver.switchTo().window(handle);
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      相关资源
      最近更新 更多