2012-05-11 6 views
12

Когда я нажимаю ссылку в своем тесте, открывается новая вкладка. Я хочу, чтобы ChromeDriver сосредоточился на этой вкладке. Я попытался следующий код, чтобы получить ChromeDriver изменить TABAs с помощью Ctrl + Tab ярлык: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(); 

Но это бросает следующее исключение:

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

Есть ли способ для переключения вкладок с помощью ChromeDriver ?

+1

Просто угадай здесь: новая вкладка - это новое окно, то есть вы можете найти ее в драйвере.SwitchTo(). Window (handle). Тогда, конечно, вы должны использовать какое-то условие, чтобы его найти. –

ответ

14

Как упоминалось в моем комментарии к вашему сообщению, я не уверен, что драйвер Chrome обрабатывает вкладки так же, как обрабатывает окна.

Этот код работает в Firefox при открытии новых окон, так что надеюсь, она работает в вашем случае, а также:

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

(я надеюсь, что мои изменения в код для этого ответа не вводить какие-либо ошибки .. .)

Просто убедитесь, что вы не начать искать новую вкладку, прежде чем Chrome была возможность открыть его :)

+0

Большое вам спасибо, работает как шарм –

13

Это то, что работает для меня:

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

После долгой битвы с этим я смог получить эту работу с хромированным драйвером. Предупреждающее сообщение не отображается, но приносит вкладку вперед и принимает закрытие сразу.

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

В C# Я использовал нижние линии для переключения между двумя вкладками.

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