2012-05-11 12 views
12

Quando faccio clic su un collegamento nel mio test, si apre una nuova scheda. Desidero che ChromeDriver quindi si concentri su quella scheda. Ho provato il seguente codice per ottenere ChromeDriver cambiare Tabas utilizzando il Ctrl + Tab scorciatoia:Selenium ChromeDriver interruttori schede

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(); 

Ma questo getta la seguente eccezione:

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

C'è un modo per cambiare scheda utilizzando ChromeDriver ?

+1

Solo indovinando qui: la nuova scheda è una nuova finestra, cioè, è possibile trovarla in driver.SwitchTo(). Window (handle). Quindi, ovviamente, devi usare qualche condizione per trovarlo. –

risposta

14

Come accennato nel mio commento sul post, non sono sicuro che il driver Chrome gestisca le schede nello stesso modo in cui gestisce le finestre.

Questo codice funziona in Firefox quando si aprono nuove finestre, quindi speriamo che funziona nel vostro caso così:

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"); 

(spero le mie modifiche al codice per questa risposta non ha introdotto errori .. .)

Basta fare in modo di non iniziare a cercare la nuova scheda prima di Chrome ha avuto la possibilità di aprirlo :)

+0

Grazie mille, funziona come un fascino –

13

Questo è ciò che ha funzionato per me:

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

Dopo una lunga battaglia con questo sono stato in grado di farlo funzionare con driver Chrome. Il messaggio di avviso non è visibile ma riporta la scheda in primo piano e accetta lo chiude immediatamente.

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

In C# ho usato le linee sottostanti per passare da una scheda all'altra.

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"); 
Problemi correlati