如何使用SeleniumWebDriver和Java切换到另一个选项卡
我打开google.com,然后点击“GMail”超链接,在同一浏览器上打开一个新标签 现在我想切换到这个新的标签页,其中GMail是使用SeleniumWebDriver打开的 代码片段是:如何使用SeleniumWebDriver和Java切换到另一个选项卡,java,selenium-webdriver,Java,Selenium Webdriver,我打开google.com,然后点击“GMail”超链接,在同一浏览器上打开一个新标签 现在我想切换到这个新的标签页,其中GMail是使用SeleniumWebDriver打开的 代码片段是: WebDriver wd = new ChromeDriver(); wd.get("https://www.google.co.in/?gws_rd=ssl"); wd.findElement(By.linkText("Gmail")).sendKeys(Keys.CONTRO
WebDriver wd = new ChromeDriver();
wd.get("https://www.google.co.in/?gws_rd=ssl");
wd.findElement(By.linkText("Gmail")).sendKeys(Keys.CONTROL,Keys.RETURN);
现在我想转到打开GMail链接的标签页。我用谷歌搜索了N个解决方案,但没有一个有效
例如
解决方案1:
String Tab1 = wd.getWindowHandle();
ArrayList<String> availableWindows = new ArrayList<String>(wd.getWindowHandles());
if (!availableWindows.isEmpty()) {
wd.switchTo().window(availableWindows.get(1));
}
请建议。我被这个问题困住了。您可能有一个正确的解决方案(Sol2),但问题是您无法切换到新选项卡,直到它无法完全加载 因此,解决方案: 1) 坏的一个:设置一个等待计时器,只需睡眠(2000)一段时间,然后
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
2) 好的
使用天然硒的东西。首先,打开所有可用的选项卡,方法是:
driver.getWindowHandle();
然后切换到另一个选项卡:
driver.switchTo().window(myWindowHandle );
窗口句柄对于索引号不是很安全,因为它们可能非常无序。我建议你找到一个列表,做一个循环,寻找想要的
public void TabHandles() {
driver.get("https://www.google.co.in/?gws_rd=ssl");
String currentWindowHandle = driver.getWindowHandle();
driver.findElement(By.linkText("Gmail")).sendKeys(Keys.CONTROL, Keys.RETURN);
//Get the list of all window handles
ArrayList<String> windowHandles = new ArrayList<String>(driver.getWindowHandles());
for (String window:windowHandles){
//if it contains the current window we want to eliminate that from switchTo();
if (!window.equals(currentWindowHandle){
//Now switchTo new Tab.
driver.switchTo().window(window);
//Do whatever you want to do here.
//Close the newly opened tab
driver.close();
}
}
}
public void TabHandles(){
驱动程序。获取(“https://www.google.co.in/?gws_rd=ssl");
字符串currentWindowHandle=driver.getWindowHandle();
driver.findElement(By.linkText(“Gmail”)).sendKeys(Keys.CONTROL,Keys.RETURN);
//获取所有窗口句柄的列表
ArrayList windowHandles=新的ArrayList(driver.getWindowHandles());
用于(字符串窗口:windowHandles){
//如果它包含当前窗口,我们希望从switchTo()中消除该窗口;
如果(!window.equals)(currentWindowHandle){
//现在切换到新选项卡。
驱动程序.切换到().窗口(窗口);
//在这里你想做什么就做什么。
//关闭新打开的选项卡
driver.close();
}
}
}
我们手动切换到下一个选项卡的方式是按-CTRL+Page Down
我们可以使用Selenium-like-
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL, Keys.PAGE_DOWN);
在我看来,driver.getWindowHandles()不适用于选项卡…您将始终使用当前选项卡的句柄返回一个单项目数组…[删除了旧答案,因为现在似乎已修复] 更新(2016年6月16日):当前版本的Selenium(server standalone 2.53.0)的行为似乎有所不同。现在我使用类似的方法打开/切换驱动程序到新选项卡: 更新(2016年11月16日):Selenium 3.0.1似乎又改变了一些事情?我现在必须使用javascript打开一个新选项卡。这似乎只在Chrome中起作用……Firefox打开了一个新窗口。我要看看是否可以使用geckodriver的设置(功能/配置文件?)来改变这种行为
我建议初始化第二个驱动程序来完成该选项卡的工作,或者在第一个驱动程序中打开第二个选项卡,让该选项卡拥有自己的逻辑集来完成所需的工作 下面的代码应该让您很好地了解如何使用Selenium 2.53.1和Chrome 51.0操作不同的驱动程序/浏览器/窗口以及每个驱动程序中的多个选项卡
// INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS)
driver1 = new ChromeDriver();
driver2 = new ChromeDriver();
// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
// SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
Thread.sleep(100);
// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());
// REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)
// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
// SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
Thread.sleep(100);
// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs2 = new ArrayList<String> (driver1.getWindowHandles());
// NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
driver1.switchTo().window(tabs1.get(ii));
// LOGIC FOR THAT DRIVER'S CURRENT TAB
}
// PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
drvier2.switchTo().window(tabs2.get(ii));
// LOGIC FOR THAT DRIVER'S CURRENT TAB
}
//初始化两个驱动程序(它们代表单独的CHROME窗口)
driver1=新的ChromeDriver();
driver2=新的ChromeDriver();
//循环打开任意多个选项卡
对于(int i=0;i 对于(intii=0;ii下面是使用Robot类的Java实现,我已经切换了多(7)次选项卡
我希望这会有帮助
导入:
导入java.awt.Robot
导入java.awt.event.KeyEvent
导入java.util.ArrayList
导入org.openqa.selenium.WebDriver
导入org.openqa.selenium.chrome.ChromeDriver
主要方法
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "/Path/To/chromedriver/" + "chromedriver.exe");
WebDriver driver = new ChromeDriver();
// go to URL1
driver.navigate().to("http://www.facebook.com");
try {
// Open New Tab by simulating Ctrl+t
Robot r = new Robot();
r.keyPress(KeyEvent.VK_CONTROL);
r.keyPress(KeyEvent.VK_T);
r.keyRelease(KeyEvent.VK_CONTROL);
r.keyRelease(KeyEvent.VK_T);
Thread.sleep(1000);
// Create Array List to keep Tab information
ArrayList<String> tabs2 = new ArrayList<String>(driver.getWindowHandles());
// Navigate to New Tab
driver.switchTo().window(tabs2.get(1));
// go to URL2
driver.navigate().to("http://www.google.com");
// Navigate to Tab 0
driver.switchTo().window(tabs2.get(0));
Thread.sleep(2000);
// Navigate to Tab 1
driver.switchTo().window(tabs2.get(1));
Thread.sleep(2000);
// Navigate to Tab 0
driver.switchTo().window(tabs2.get(0));
Thread.sleep(2000);
// Navigate to Tab 1
driver.switchTo().window(tabs2.get(1));
Thread.sleep(2000);
// Navigate to Tab 1
driver.switchTo().window(tabs2.get(0));
driver.close();
Thread.sleep(2000);
// Navigate to Tab 1
driver.switchTo().window(tabs2.get(1));
driver.close();
} catch (Exception e) {
}
}
publicstaticvoidmain(字符串[]args){
System.setProperty(“webdriver.chrome.driver”,“/Path/To/chromedriver/”+“chromedriver.exe”);
WebDriver驱动程序=新的ChromeDriver();
//转到URL1
驱动程序。导航()。到(“http://www.facebook.com");
试一试{
//通过模拟Ctrl+t打开新选项卡
机器人r=新机器人();
r、 按键(KeyEvent.VK_控件);
r、 按键(KeyEvent.VK_T);
r、 keyRelease(KeyEvent.VK_控件);
r、 密钥释放(KeyEvent.VK_T);
睡眠(1000);
//创建数组列表以保留选项卡信息
ArrayList tabs2=新的ArrayList(driver.getWindowHandles());
//导航到新选项卡
driver.switchTo().window(tabs2.get(1));
//转到URL2
驱动程序。导航()。到(“http://www.google.com");
//导航到选项卡0
driver.switchTo().window(tabs2.get(0));
《睡眠》(2000年);
//导航到选项卡1
driver.switchTo().window(tabs2.get(1));
《睡眠》(2000年);
//导航到选项卡0
driver.switchTo().window(tabs2.get(0));
《睡眠》(2000年);
//导航到选项卡1
driver.switchTo().window(tabs2.get(1));
《睡眠》(2000年);
//导航到选项卡1
driver.switchTo().window(tabs2.get(0));
driver.close();
《睡眠》(2000年);
//导航到选项卡1
driver.switchTo().window(tabs2.get(1));
driver.close();
}捕获(例外e){
}
}
您可以提供选项卡名称参数并尝试以下操作:
public boolean switchToTab(String tabName){
log.debug("Switch to {} tab",tabName);
ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
ArrayList<String> tabList = new ArrayList<>();
for (int i =0;i<tab.size();i++){
tabList.add(i,driver.switchTo().window(tab.get(i)).getTitle());
driver.switchTo().window(tab.get(0));
if(tabList.get(i).equals(tabName)){
driver.switchTo().window(tab.get(i));
return true;
}
}
return false;
}
public boolean switchToTab(字符串tabName){
// driver.findElement(By.cssSelector("body")).sendKeys(Keys.chord(Keys.CONTROL, "t"));
((JavascriptExecutor)driver).executeScript("window.open('about:blank', '_blank');");
Set<String> tab_handles = driver.getWindowHandles();
int number_of_tabs = tab_handles.size();
int new_tab_index = number_of_tabs-1;
driver.switchTo().window(tab_handles.toArray()[new_tab_index].toString());
((JavascriptExecutor)driver).executeScript("close();");
// INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS)
driver1 = new ChromeDriver();
driver2 = new ChromeDriver();
// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
// SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
Thread.sleep(100);
// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());
// REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)
// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
// SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
Thread.sleep(100);
// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs2 = new ArrayList<String> (driver1.getWindowHandles());
// NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
driver1.switchTo().window(tabs1.get(ii));
// LOGIC FOR THAT DRIVER'S CURRENT TAB
}
// PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
drvier2.switchTo().window(tabs2.get(ii));
// LOGIC FOR THAT DRIVER'S CURRENT TAB
}
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "/Path/To/chromedriver/" + "chromedriver.exe");
WebDriver driver = new ChromeDriver();
// go to URL1
driver.navigate().to("http://www.facebook.com");
try {
// Open New Tab by simulating Ctrl+t
Robot r = new Robot();
r.keyPress(KeyEvent.VK_CONTROL);
r.keyPress(KeyEvent.VK_T);
r.keyRelease(KeyEvent.VK_CONTROL);
r.keyRelease(KeyEvent.VK_T);
Thread.sleep(1000);
// Create Array List to keep Tab information
ArrayList<String> tabs2 = new ArrayList<String>(driver.getWindowHandles());
// Navigate to New Tab
driver.switchTo().window(tabs2.get(1));
// go to URL2
driver.navigate().to("http://www.google.com");
// Navigate to Tab 0
driver.switchTo().window(tabs2.get(0));
Thread.sleep(2000);
// Navigate to Tab 1
driver.switchTo().window(tabs2.get(1));
Thread.sleep(2000);
// Navigate to Tab 0
driver.switchTo().window(tabs2.get(0));
Thread.sleep(2000);
// Navigate to Tab 1
driver.switchTo().window(tabs2.get(1));
Thread.sleep(2000);
// Navigate to Tab 1
driver.switchTo().window(tabs2.get(0));
driver.close();
Thread.sleep(2000);
// Navigate to Tab 1
driver.switchTo().window(tabs2.get(1));
driver.close();
} catch (Exception e) {
}
}
public boolean switchToTab(String tabName){
log.debug("Switch to {} tab",tabName);
ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
ArrayList<String> tabList = new ArrayList<>();
for (int i =0;i<tab.size();i++){
tabList.add(i,driver.switchTo().window(tab.get(i)).getTitle());
driver.switchTo().window(tab.get(0));
if(tabList.get(i).equals(tabName)){
driver.switchTo().window(tab.get(i));
return true;
}
}
return false;
}
import java.util.ArrayList;
ArrayList<String> tabs2 = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs2.get(1)); //Tab number
//Can change it for next tab like that or previous:
driver.switchTo().window(tabs2.get(1));
driver.close();
driver.switchTo().window(tabs2.get(0));