如何使用 Java 中的 Selenium WebDriver(又名 Selenium 2)在现有的 Firefox 浏览器中打开一个新选项卡?
34 回答
仅适用于在 Ruby、Python 和 C# 绑定(Selenium 2.33.0)中寻找答案的任何人。
请注意,要发送的实际密钥取决于您的操作系统。例如,Mac 使用CMD+ T,而不是Ctrl+ T。
红宝石
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.get('http://stackoverflow.com/')
body = driver.find_element(:tag_name => 'body')
body.send_keys(:control, 't')
driver.quit
Python
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://stackoverflow.com/")
body = driver.find_element_by_tag_name("body")
body.send_keys(Keys.CONTROL + 't')
driver.close()
C#
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
namespace StackOverflowTests {
class OpenNewTab {
static void Main(string[] args) {
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://stackoverflow.com/");
IWebElement body = driver.FindElement(By.TagName("body"));
body.SendKeys(Keys.Control + 't');
driver.Quit();
}
}
}
下面的代码将在新选项卡中打开链接。
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
下面的代码将打开一个空的新选项卡。
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
做这个:
driver.ExecuteScript("window.open('your URL', '_blank');");
要使用 JavascriptExecutor 打开新选项卡,
((JavascriptExecutor) driver).executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
将根据索引控制选项卡:
driver.switchTo().window(tabs.get(1));
主选项卡上的驱动程序控制:
driver.switchTo().window(tabs.get(0));
您可以使用 Java 和 Selenium WebDriver 使用以下代码:
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
通过使用 JavaScript:
WebDriver driver = new FirefoxDriver(); // Firefox or any other Driver
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");
打开一个新标签后,它需要切换到该标签:
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
在 Chrome 驱动程序中打开一个新窗口。
// The script that will will open a new blank window
// If you want to open a link new tab, replace 'about:blank' with a link
String a = "window.open('about:blank','_blank');";
((JavascriptExecutor)driver).executeScript(a);
在 Firefox 浏览器上试试这个。
/* Open new tab in browser */
public void openNewTab()
{
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(0));
}
这里几乎所有的答案都已过时。
(红宝石示例)
WebDriver 现在支持打开选项卡:
browser = Selenium::WebDriver.for :chrome
new_tab = browser.manage.new_window
将打开一个新标签。开窗其实已经变成了非标案例:
browser.manage.new_window(:window)
选项卡或窗口不会自动聚焦。要切换到它:
browser.switch_to.window new_tab
以下代码将在新窗口中打开链接:
String selectAll = Keys.chord(Keys.SHIFT, Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
要使用 Selenium WebDriver 在现有的 Chrome 浏览器中打开一个新选项卡,您可以使用以下代码:
driver.FindElement(By.CssSelector("body")).SendKeys(Keys.Control + "t");
string newTabInstance = driver.WindowHandles[driver.WindowHandles.Count-1].ToString();
driver.SwitchTo().Window(newTabInstance);
driver.Navigate().GoToUrl(url);
我有一段时间无法在 Google Chrome 中打开新标签页。
甚至driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
没有为我工作。
我发现 Selenium 只关注驱动程序是不够的。窗户也必须在前面有窗户。
我的解决方案是在 Chrome 中调用一个警报,将窗口置于前面,然后执行命令。示例代码:
((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
爪哇
我建议使用JavascriptExecutor
:
- 打开新的空白窗口:
((JavascriptExecutor) driver).executeScript("window.open()");
- 打开具有特定 URL 的新窗口:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");
导入后:
import org.openqa.selenium.JavascriptExecutor;
// To open a new tab in an existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
我们如何打开一个新标签,但更重要的是,我们如何在那个新标签中做事?
Webdriver 不会为每个选项卡添加新的 WindowHandle,并且只控制第一个选项卡。因此,在选择一个新选项卡(Control + Tab Number)后,在驱动程序上设置 .DefaultContent() 以将可见选项卡定义为您要处理的选项卡。
视觉基础
Dim driver = New WebDriver("Firefox", BaseUrl)
' Open new tab - send Control T
Dim body As IWebElement = driver.FindElement(By.TagName("body"))
body.SendKeys(Keys.Control + "t")
' Go to a URL in that tab
driver.GoToUrl("YourURL")
' Assuming you have m tabs open, go to tab n by sending Control + n
body.SendKeys(Keys.Control + n.ToString())
' Now set the visible tab as the drivers default content.
driver.SwitchTo().DefaultContent()
我在 Java 和 Firefox 44.0.2 中使用 Selenium 2.52.0。不幸的是,以前的解决方案都不适合我。
问题是如果我调用 driver.getWindowHandles() 我总是得到一个句柄。不知何故,这对我来说很有意义,因为 Firefox 是一个单独的进程,每个选项卡都不是一个单独的进程。但也许我错了。无论如何,我尝试编写自己的解决方案:
// Open a new tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
// URL to open in a new tab
String urlToOpen = "https://url_to_open_in_a_new_tab";
Iterator<String> windowIterator = driver.getWindowHandles()
.iterator();
// I always get handlesSize == 1, regardless how many tabs I have
int handlesSize = driver.getWindowHandles().size();
// I had to grab the original handle
String originalHandle = driver.getWindowHandle();
driver.navigate().to(urlToOpen);
Actions action = new Actions(driver);
// Close the newly opened tab
action.keyDown(Keys.CONTROL).sendKeys("w").perform();
// Switch back to original
action.keyDown(Keys.CONTROL).sendKeys("1").perform();
// And switch back to the original handle. I am not sure why, but
// it just did not work without this, like it has lost the focus
driver.switchTo().window(originalHandle);
我使用Ctrl+T组合打开一个新选项卡,Ctrl+W关闭它,然后切换回我使用的原始选项卡Ctrl+ 1(第一个选项卡)。
我知道我的解决方案并不完美,甚至不是很好,我也想用驱动程序的 switchTo 调用进行切换,但正如我所写的那样,这是不可能的,因为我只有一个句柄。也许这对有同样情况的人会有所帮助。
如何使用 Selenium WebDriver 和 Java for Chrome 打开一个新选项卡:
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
driver = new ChromeDriver(options);
driver.manage().window().maximize();
driver.navigate().to("https://google.com");
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_T);
上面的代码将禁用第一个扩展并使用机器人类,将打开一个新选项卡。
检查此完整示例以了解如何打开多个选项卡并在选项卡之间切换以及最后关闭所有选项卡。
public class Tabs {
WebDriver driver;
Robot rb;
@BeforeTest
public void setup() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\Anuja.AnujaPC\\Downloads\\chromedriver_win32\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get("http://qaautomated.com");
}
@Test
public void openTab() {
// Open tab 2 using CTRL + T keys.
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
// Open URL In 2nd tab.
driver.get("http://www.qaautomated.com/p/contact.html");
// Call switchToTab() method to switch to the first tab
switchToTab();
// Call switchToTab() method to switch to the second tab.
switchToTab();
}
public void switchToTab() {
// Switching between tabs using CTRL + tab keys.
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
// Switch to current selected tab's content.
driver.switchTo().defaultContent();
}
@AfterTest
public void closeTabs() throws AWTException {
// Used Robot class to perform ALT + SPACE + 'c' keypress event.
rb = new Robot();
rb.keyPress(KeyEvent.VK_ALT);
rb.keyPress(KeyEvent.VK_SPACE);
rb.keyPress(KeyEvent.VK_C);
}
}
这个例子是由这个网页给出的。
这行代码将使用 Selenium WebDriver 打开一个新的浏览器选项卡:
((JavascriptExecutor)getDriver()).executeScript("window.open()");
从 selenium >= 4.0 开始,不需要 javascript 或send_keys
解决方法。Selenium 4 提供了一个新的 API newWindow
,它允许您创建一个新窗口(或选项卡)并自动切换到它。由于新窗口或选项卡是在同一个会话中创建的,因此它避免了创建新的 WebDriver 对象。
Python
打开新标签
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.window import WindowTypes
driver.switch_to.new_window(WindowTypes.TAB)
打开新窗口
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.window import WindowTypes
driver.switch_to.new_window(WindowTypes.WINDOW)
爪哇
打开新窗口
driver.get("https://www.google.com/");
// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.WINDOW);
// Opens LambdaTest homepage in the newly opened window
driver.navigate().to("https://www.lambdatest.com/");
打开新标签
driver.get("https://www.google.com/");
// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.TAB);
// Opens LambdaTest homepage in the newly opened tab
driver.navigate().to("https://www.lambdatest.com/")
有 3 种方法可以做到这一点。在下面的示例中,我正在执行以下步骤以在新选项卡中打开 facebook,
- 发射
https://google.com
- 搜索
facebook
文本并获取facebook
URL
facebook
在不同的选项卡中打开。
解决方案#1:使用window handles
.
driver = new ChromeDriver(options);
driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
driver.get(facebookUrl);
解决方案#2:通过创建新driver
实例。不建议这样做,但这也是一种可能的方法。
driver = new ChromeDriver(options);
driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");
/*Create an another instance of driver.*/
driver = new ChromeDriver(options);
driver.get(facebookUrl);
解决方案#3:使用 Selenium 4
driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");
driver.switchTo().newWindow(WindowType.TAB);
driver.navigate().to(facebookUrl);
Actions at=new Actions(wd);
at.moveToElement(we);
at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
使用 Selenium WebDriver 在现有 Firefox 浏览器中打开一个新选项卡
FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t");
Node.js的相同示例:
var webdriver = require('selenium-webdriver');
...
driver = new webdriver.Builder().
withCapabilities(capabilities).
build();
...
driver.findElement(webdriver.By.tagName("body")).sendKeys(webdriver.Key.COMMAND + "t");
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(0));
由于https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465中的错误,即使 webdriver.switchTo 实际上确实切换了选项卡,焦点仍留在第一个选项卡上。
您可以通过在 switchWindow 之后执行 driver.get 来确认这一点,并看到第二个选项卡实际上转到新 URL 而不是原始选项卡。
目前的解决方法是yardening2 建议的。使用 JavaScript 代码打开警报,然后使用 webdriver 接受它。
这段代码对我有用(Selenium 3.8.1、chromedriver 2.34.522940 和 Chrome 63.0):
public void openNewTabInChrome() {
driver.get("http://www.google.com");
WebElement element = driver.findElement(By.linkText("Gmail"));
Actions actionOpenLinkInNewTab = new Actions(driver);
actionOpenLinkInNewTab.moveToElement(element)
.keyDown(Keys.CONTROL) // MacOS: Keys.COMMAND
.keyDown(Keys.SHIFT).click(element)
.keyUp(Keys.CONTROL).keyUp(Keys.SHIFT).perform();
ArrayList<String> tabs = new ArrayList(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
driver.get("http://www.yahoo.com");
//driver.close();
}
问题:如何使用 Selenium WebDriver 和 Java 打开一个新选项卡?
答:单击任何链接后,打开一个新选项卡。
如果我们想处理一个新打开的选项卡,那么我们需要使用 .switchTo().window() 命令来处理选项卡。
切换到特定选项卡,然后执行操作并切换回父选项卡。
package test;
import java.util.ArrayList;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Tab_Handle {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver", "geckodriver_path");
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com");
// Store all currently open tabs in Available_tabs
ArrayList<String> Available_tabs = new ArrayList<String>(driver.getWindowHandles());
// Click on link to open in new tab
driver.findElement(By.id("Url_Link")).click();
// Switch newly open Tab
driver.switchTo().window(Available_tabs.get(1));
// Perform some operation on Newly open tab
// Close newly open tab after performing some operations.
driver.close();
// Switch to old(Parent) tab.
driver.switchTo().window(Available_tabs.get(0));
}
}
Selenium 不支持打开新标签页。它只支持打开新窗口。无论如何,新窗口在功能上等同于新选项卡。
有各种技巧可以解决这个问题,但从长远来看,它们会给你带来其他问题。
如果你想打开新标签,你可以使用这个
((JavascriptExecutor) getDriver()).executeScript("window.open()");
如果你想从新标签打开链接,你可以使用这个
使用 JavascriptExecutor:
public void openFromNewTab(WebElement element){
((JavascriptExecutor)getDriver()).executeScript("window.open('"+element.getAttribute("href")+"','_blank');");
}
与行动:
WebElement element = driver.findElement(By.xpath("your_xpath"));
Actions actions = new Actions(driver);
actions.keyDown(Keys.LEFT_CONTROL)
.click(element)
.keyUp(Keys.LEFT_CONTROL)
.build()
.perform();
使用以下代码段在新选项卡中打开链接:
public void openLinkInNewTab(String link){
String currentHandle = driver().getWindowHandle();
((JavascriptExecutor) driver()).executeScript("window.open()");
//getting all the handles currently available
Set<String> handles = driver().getWindowHandles();
for (String actual : handles) {
if (!actual.equalsIgnoreCase(currentHandle)) {
//switching to the opened tab
driver().switchTo().window(actual);
//opening the URL saved.
driver.get(link);
}
}
}
爪哇,
嗨,您可以尝试使用以下代码在 selenium java 中打开新选项卡。
public static void switchToWindow(WebDriver driver) {
for (String winHandle : driver.getWindowHandles()) {
driver.switchTo().window(winHandle);
}
}
您可以绕过上面评论中描述的 selenium 驱动程序中的 Control-T 键盘快捷键错误,使用这行简单的代码来执行 javascript 打开一个新选项卡,然后您必须将控件切换到那个。
driver.execute_script("window.open();")
这是一个简单的例子:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
time.sleep(0.5)
driver.execute_script("window.open();")
window_after = driver.window_handles[-1]
time.sleep(0.5)
driver.switch_to.window(window_after)
driver.get("https://google.com")
如果您需要在新选项卡中打开特定链接,可以将快捷方式直接发送到该链接,如下所示:
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
driver.findElement(By.xpath("//a[strong[.='English']]")).sendKeys(selectLinkOpeninNewTab);
如果您需要打开一个新选项卡并想选择在该选项卡中立即打开哪个链接,您可以像这样使用JavaScriptExecutor:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.open('https://www.wikipedia.org/', '_blank');");
使用 Selenium WebDriver 处理浏览器窗口:
String winHandleBefore = driver.getWindowHandle();
for(String winHandle : driver.getWindowHandles()) // Switch to new opened window
{
driver.switchTo().window(winHandle);
}
driver.switchTo().window(winHandleBefore); // Move to previously opened window