2012-05-11 25 views
12

Cuando hago clic en un enlace en mi prueba, se abre una pestaña nueva. Quiero que ChromeDriver se concentre en esa pestaña. He probado el siguiente código para obtener ChromeDriver cambiar tabas con el ctrl + tab atajo:Selenium ChromeDriver pestañas de interruptor

Actions builder = new Actions(driver); 
builder.KeyDown(Keys.Control).KeyDown(Keys.Tab).KeyUp(Keys.Tab).KeyUp(Keys.Control);//switch tabs 
IAction switchTabs = builder.Build(); 
switchTabs.Perform(); 

Pero esto plantea la siguiente excepción:

ekmLiveChat.tests.UITests.EndToEndTest.EndToEnd: 
System.ArgumentException : key must be a modifier key (Keys.Shift, Keys.Control, or Keys.Alt) 
Parameter name: key 

¿Hay una manera de cambiar las fichas utilizando ChromeDriver ?

+1

Simplemente adivinando aquí: La nueva pestaña es una nueva ventana, es decir, puede encontrarla en el controlador. Cambiar a(). Ventana (manejar). Entonces, por supuesto, debes usar alguna condición para encontrarlo. –

Respuesta

14

Como mencioné en mi comentario sobre su publicación, no estoy seguro de si el controlador de Chrome maneja las pestañas de la misma manera que maneja las ventanas.

Este código funciona en Firefox al abrir nuevas ventanas, así que espero que trabaja en su caso, así:

public void SwitchToWindow(Expression<Func<IWebDriver, bool>> predicateExp) 
{ 
    var predicate = predicateExp.Compile(); 
    foreach (var handle in driver.WindowHandles) 
    { 
     driver.SwitchTo().Window(handle); 
     if (predicate(driver)) 
     { 
      return; 
     } 
    } 

    throw new ArgumentException(string.Format("Unable to find window with condition: '{0}'", predicateExp.Body)); 
} 

SwitchToWindow(driver => driver.Title == "Title of your new tab"); 

(espero que mis ediciones al código para esta respuesta no se introducirá ningún error .. .)

Sólo asegúrese de que no empiecen a buscar para la nueva pestaña de Chrome antes ha tenido la oportunidad de abrirlo :)

+0

Muchas gracias, funciona como un encanto –

13

Esto es lo que funcionó para mí:

var popup = driver.WindowHandles[1]; // handler for the new tab 
Assert.IsTrue(!string.IsNullOrEmpty(popup)); // tab was opened 
Assert.AreEqual(driver.SwitchTo().Window(popup).Url, "http://blah"); // url is OK 
driver.SwitchTo().Window(driver.WindowHandles[1]).Close(); // close the tab 
driver.SwitchTo().Window(driver.WindowHandles[0]); // get back to the main window 
0

Después de una larga pelea con esto pude hacer que esto funcione con el controlador de cromo. El mensaje de alerta no está visible, pero lleva la pestaña al frente y acepta cerrarla inmediatamente.

//Rotate Tabs 
seleniumDriver.SwitchTo().Window(seleniumDriver.WindowHandles[currentUrlIndex]); 
IJavaScriptExecutor jscript = seleniumDriver as IJavaScriptExecutor; 
jscript.ExecuteScript("alert('Focus')"); 
seleniumDriver.SwitchTo().Alert().Accept(); 
0

En C# He usado las siguientes líneas para alternar entre las dos pestañas.

IJavaScriptExecutor js = (IJavaScriptExecutor)driver; 
js.ExecuteScript("window.open();"); 
IList<string> tabs = new List<string>(driver.WindowHandles);  
driver.SwitchTo().Window(tabs[1]); 
driver.Navigate().GoToUrl("http://www.google.com");