如何使用Selenium WebDriver和Java切换到另一个选项卡

Sam*_*mmi 7 java selenium-webdriver

我打开google.com,然后点击"GMail"超链接,在同一浏览器上打开一个新标签.

现在我想切换到使用Selenium WebDriver打开GMail的新选项卡.

代码段是:

  WebDriver wd = new ChromeDriver();
  wd.get("https://www.google.co.in/?gws_rd=ssl");       
  wd.findElement(By.linkText("Gmail")).sendKeys(Keys.CONTROL,Keys.RETURN);
Run Code Online (Sandbox Code Playgroud)

现在我想转到我打开GMail链接的选项卡.我已经搜索了N个解决方案,但没有一个有效.

例如

解决方案1:

String Tab1 = wd.getWindowHandle(); 
ArrayList<String> availableWindows = new ArrayList<String>(wd.getWindowHandles()); 
if (!availableWindows.isEmpty()) { 
wd.switchTo().window(availableWindows.get(1)); 
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
Run Code Online (Sandbox Code Playgroud)

请建议.我坚持这个.

pca*_*ins 10

在我看来,driver.getWindowHandles()不适用于标签...你总是会使用CURRENT标签的句柄返回一个项目数组... [删除旧答案,因为这似乎现在已修复]

更新(2016年6月16日):当前版本的Selenium(服务器独立2.53.0)似乎采取了不同的行动.现在我正在使用这样的东西来打开/切换驱动程序到新选项卡:

更新(2016年11月16日):Selenium 3.0.1似乎又改变了一些东西?我现在必须使用javascript打开一个新标签.这似乎只适用于Chrome ... Firefox打开一个新窗口.我将看看是否可以使用geckodriver的设置(功能/配置文件?)更改该行为.

// Actions actions = new Actions(driver); 
// actions.keyDown(Keys.CONTROL).sendKeys("t").keyUp(Keys.CONTROL).build().perform();

((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()); 
Run Code Online (Sandbox Code Playgroud)

getWindowHandles()方法现在返回一个Set.到目前为止,这只在Chrome中进行了测试,因为Firefox 47目前在使用firefoxdriver时遇到了一些严重的问题......并且使用geckodriver时,Actions根本无法正常工作.[更新6/11/2016]:Firefox通过geckodriver现在返回一个Set]

你也可以做这样的事情..把它投射到ArrayList:

  //  set tab_index to the number of window/tab you want.  0 is the first tab 

       ArrayList<String> tabs_windows = new ArrayList<String> (driver.getWindowHandles());
    driver.switchTo().window(tabs_windows.get(tab_index));
Run Code Online (Sandbox Code Playgroud)

更新:为了解决geckodriver错误,我已经切换到使用element.sendkeys ...这样的东西似乎在Marionette和Chrome中工作..(Update2):由于Selenium 3.0.1中的更改​​而更新为javascript:

// 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()); 
Run Code Online (Sandbox Code Playgroud)

更新(2016年11月16日):使用Ctrl-W关闭的旧方法似乎也被破坏了...使用这个:

((JavascriptExecutor)driver).executeScript("close();");
Run Code Online (Sandbox Code Playgroud)


TDH*_*DHM 5

我们手动切换到下一个标签的方式是按 - CTRL + Page Down我们可以像使用Selenium一样 -

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL, Keys.PAGE_DOWN);
Run Code Online (Sandbox Code Playgroud)


Sta*_*n E 1

您有一个可能的正确解决方案(Sol2),但问题是您无法切换到新选项卡,直到它无法完全加载。

所以,解决方案: 1)坏的一个:放入一个等待计时器,只需睡眠(2000)一段时间,然后

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
Run Code Online (Sandbox Code Playgroud)

2)好一个!

使用原生硒的东西。首先获取所有打开的可用选项卡:

driver.getWindowHandle();
Run Code Online (Sandbox Code Playgroud)

然后切换到另一个选项卡:

driver.switchTo().window(myWindowHandle );
Run Code Online (Sandbox Code Playgroud)