2012-05-11 8 views
12

Wenn ich auf einen Link in meinem Test klicke, öffnet sich ein neuer Tab. Ich möchte ChromeDriver dann auf diesen Tab konzentrieren. Ich habe den folgenden Code versucht ChromeDriver zu erhalten Tabas zu ändern, um die STRG + Tab Verknüpfung mit:Selenium ChromeDriver Switch Tabs

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

Aber das wirft die folgende Ausnahme:

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

Gibt es eine Möglichkeit Tabs wechseln ChromeDriver mit ?

+1

Nur raten hier: Die neue Registerkarte ist ein neues Fenster, das heißt, Sie finden es in driver.SwitchTo(). Fenster (Handle). Dann müssen Sie natürlich eine Bedingung verwenden, um sie zu finden. –

Antwort

14

Wie in meinem Kommentar zu Ihrem Post erwähnt, bin ich mir nicht sicher, ob der Chrome-Treiber Tabs auf die gleiche Weise wie Windows behandelt.

Dieser Code in Firefox funktioniert, wenn neue Fenster zu öffnen, so dass hoffentlich funktioniert es in Ihrem Fall auch:

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

(ich den Code meine Änderungen hoffen, für diese Antwort Fehler nicht vorstellen .. .)

So stellen Sie sicher, dass Sie nicht für die neuen Registerkarte suchen Sie starten, bevor Chrome die Möglichkeit, es zu öffnen :)

+0

Vielen Dank, funktioniert wie ein Charme –

13

Dies ist, was für mich gearbeitet hatte:

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

Nach einem langen Kampf mit diesem konnte ich das mit Chrome-Treiber arbeiten. Die Warnmeldung ist nicht sichtbar, bringt die Registerkarte jedoch nach vorne und akzeptiert, schließt sie sofort.

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

In C# habe ich die folgenden Zeilen verwendet, um zwischen den beiden Registerkarte zu wechseln.

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