WebDriver打开新标签

Chr*_*ney 25 java automated-tests webdriver selenium-webdriver

我已经在网上搜索了WebDriver API.我没有看到使用WebDriver/Selenium2.0打开新标签的方法.

有人可以确认我是对的吗?

谢谢,克里斯.PS:我看到的当前替代方案是在同一窗口中加载不同的URL或打开新窗口.

小智 35

使用webdriver完全有一种跨浏览器的方式,那些说你不能太懒的人.首先,您需要使用WebDriver将标记注入并锚定到打开所需选项卡的页面中.这是我的工作方式(注意:驱动程序是WebDriver实例):

/**
 * Executes a script on an element
 * @note Really should only be used when the web driver is sucking at exposing
 * functionality natively
 * @param script The script to execute
 * @param element The target of the script, referenced as arguments[0]
 */
public void trigger(String script, WebElement element) {
    ((JavascriptExecutor)driver).executeScript(script, element);
}

/** Executes a script
 * @note Really should only be used when the web driver is sucking at exposing
 * functionality natively
 * @param script The script to execute
 */
public Object trigger(String script) {
    return ((JavascriptExecutor)driver).executeScript(script);
}

/**
 * Opens a new tab for the given URL
 * @param url The URL to 
 * @throws JavaScriptException If unable to open tab
 */
public void openTab(String url) {
    String script = "var d=document,a=d.createElement('a');a.target='_blank';a.href='%s';a.innerHTML='.';d.body.appendChild(a);return a";
    Object element = trigger(String.format(script, url));
    if (element instanceof WebElement) {
        WebElement anchor = (WebElement) element; anchor.click();
        trigger("var a=arguments[0];a.parentNode.removeChild(a);", anchor);
    } else {
        throw new JavaScriptException(element, "Unable to open tab", 1);
    }       
}
Run Code Online (Sandbox Code Playgroud)

接下来,您需要告诉webdriver将其当前窗口句柄切换到新选项卡.我是这样做的:

/**
 * Switches to the non-current window
 */
public void switchWindow() throws NoSuchWindowException, NoSuchWindowException {
    Set<String> handles = driver.getWindowHandles();
    String current = driver.getWindowHandle();
    handles.remove(current);
    String newTab = handles.iterator().next();
    locator.window(newTab);
}
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您可以使用相同的WebDriver实例与新页面上下文中的元素进行交互.完成该选项卡后,您始终可以使用与上面的switchWindow函数类似的机制返回到默认窗口上下文.我会把它作为练习让你弄明白.

  • 我同意此处提供的代码将通过WebDriver在任何给定的浏览器窗口中打开一个新选项卡.但是,无法保证特定驱动程序能够控制生成的新选项卡. (6认同)
  • @Jonathan Azoff你如何控制当时打开的标签?打开选项卡是可行的,但如果驱动程序无法处理选项卡,将导致无尽的悲伤 (5认同)
  • `switchWindow()`的最后一行中的`locator`是什么? (2认同)
  • 在常规非远程版本的Webdriver中,我相信定位器可能只是driver.switchTo()对吗? (2认同)

Jim*_*ans 30

Selenium WebDriver API目前不支持在浏览器中管理选项卡.

  • Downvoters:这是你将从项目本身得到的答案.仅仅因为它不是你喜欢的答案,并不意味着它是错的或质量差. (19认同)

小智 8

        var windowHandles = webDriver.WindowHandles;
        var script = string.Format("window.open('{0}', '_blank');", url);
        scriptExecutor.ExecuteScript(script);
        var newWindowHandles = webDriver.WindowHandles;
        var openedWindowHandle = newWindowHandles.Except(windowHandles).Single();
        webDriver.SwitchTo().Window(openedWindowHandle);
Run Code Online (Sandbox Code Playgroud)