Вопрос по c# – Вкладки переключателя Selenium ChromeDriver

13

Когда я нажимаю на ссылку в моем тесте, она открывает новую вкладку. Я хочу, чтобы ChromeDriver сосредоточился на этой вкладке. Я попробовал следующий код, чтобы заставить ChromeDriver изменять табы с помощью сочетания клавиш ctrl + tab:

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

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

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

Is there a way to switch tabs using ChromeDriver?

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

Ваш Ответ

5   ответов
0

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

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

В моем коде я нажимаю кнопку и открываю вкладку (так что она уже есть на новой вкладке, мне не нужно что-то делать, чтобы перейти на эту новую вкладку) и запускаю ее, чтобы она распознала новую вкладку и работала:

driver.SwitchTo().Window(driver.WindowHandles.Last());
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");
15

Вот что сработало для меня:

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
18

Как упоминалось в моем комментарии к вашему сообщению, я не уверен, что драйвер 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 сможет ее открыть :)

Error: User Rate Limit Exceeded Lisa Young
Error: User Rate Limit ExceededCompile()Error: User Rate Limit ExceededExpression<Func>Error: User Rate Limit ExceededFuncError: User Rate Limit Exceeded

Похожие вопросы