Как переключать вкладки в Chrome в Selenium C #?

Я использую:

  • Хром 55.0.2
  • Selenium WebDriver 3.0.1 с ChromeDriver
  • C # 4.6.1 (VS2015 Community Edition)

Я пишу код автоматизации, который открывает Chrome, открывает вкладку и переходит к URL-адресу главной страницы. На этой главной странице содержится информация, которую я анализирую для создания URL-адреса вторичной страницы. Моя проблема в том, что я не могу написать код, который переключится обратно на вкладку главной страницы после загрузки дополнительной страницы, а также не могу написать код, который никогда не покидает главную страницу. Я объясню два варианта, которые я преследую:

Вариант №1 - ведите себя как ctrl-click

После того, как я сгенерирую этот URL-адрес вторичной страницы, я хотел бы открыть другую вкладку, чтобы Chrome перешел к URL-адресу, но не покидал вкладку главной страницы в Chrome. Это похоже на ctrl-click в ссылке.

Вариант 2 - вести себя как ctrl-1 (вернуться на вкладку 1 в Chrome)

Я также был бы удовлетворен решением, в котором после навигации и загрузки URL-адреса вторичной страницы на новой вкладке Chrome автоматизация затем переключится обратно на вкладку главной страницы в Chrome. Это похоже на ввод ctrl-1 на клавиатуре, когда Chrome находится в фокусе.

Вариант №3 - что-то еще?

Я также был бы удовлетворен любым другим решением, которое выполняет то, что я ищу (без введения какого-либо нового технологического уровня).

Некоторая справочная информация - навигация

Сначала я попробовал следующий подход, но он не справился с моим требованием, потому что он открывает сгенерированный URL-адрес на той же вкладке Chrome, что и на главной странице:

Session.Driver.Navigate().GoToUrl(generatedUrl);

Я не обнаружил "прямой" команды C # \ Chrome \ WebDriver для открытия URL-адреса на новой вкладке в Chrome - она ​​всегда будет использовать текущую вкладку.

Мне удалось найти код с помощью javascript, который открывает URL-адрес в новой вкладке. Выглядит это так:

// open a new tab and navigate to generated url:
IJavaScriptExecutor jscript = Session.Driver as IJavaScriptExecutor;
jscript.ExecuteScript(string.Format("window.open('{0}', '_blank');", generatedUrl));

И после выполнения javascript открывается вторичная страница, которая является активной вкладкой в ​​Chrome. Вот мои попытки вернуться на вкладку главной страницы в Chrome:

Мои попытки

Я, конечно, пробовал много способов переключать вкладки и т. Д. Вот они, все безуспешно:

Попытка №1: SwitchTo ()

Я могу получить доступ к каждому дескриптору окна с помощью Session.Driver.WindowHandles. Когда я отлаживаю следующую команду, я вижу, что дескриптор первого окна действительно является главной страницей; однако команда ничего не делает. Никаких изменений вкладки. Chrome сохраняет фокус на вторичной странице \ вкладке. Также нет сообщения об ошибке. Из того, что я читал в Интернете, эта команда должна была переключать вкладки.

Session.Driver.SwitchTo().Window(Session.Driver.WindowHandles.First());

Попытка №2: отправить ключи - действие

Такой подход был бы действительно замечательным, если бы он работал. Опять же, следующий код не оказывает никакого влияния, и Chrome сохраняет фокус на вторичной странице \ вкладке. Также нет сообщения об ошибке.

    Actions action = new Actions(Session.Driver);
    action.SendKeys(Keys.Control + "1").Build().Perform();

В качестве последней попытки я сейчас ищу команду JavaScript, которую я могу использовать с IJavaScriptExecutor для переключения вкладок - пока безуспешно.


person sapbucket    schedule 06.01.2017    source источник
comment
Реплицировал ваш сценарий. Не уверен, почему SwitchTo() не сработал в вашем случае. Но у меня это сработало. ((IJavaScriptExecutor)driver).ExecuteScript("window.open('_blank', 'tab2');"); driver.SwitchTo().Window("tab2");.   -  person Gokul    schedule 14.02.2017


Ответы (1)


В качестве последней попытки я сейчас ищу команду javascript, которую я могу использовать с IJavaScriptExecutor для переключения вкладок - пока безуспешно.

Я предлагаю вам трюк с использованием JavaScript для переключения между вкладками. Это не идеальное решение, но вы можете использовать его в качестве альтернативного решения. Вы должны попробовать как: -

//Firstly try to switch window as you're doing 
Session.Driver.SwitchTo().Window(Session.Driver.WindowHandles.First());

//Now execute a script which would popup the alert box on current window
IJavaScriptExecutor jscript = Session.Driver as IJavaScriptExecutor;
jscript.ExecuteScript("alert('Switch tab')");

//Now you can see alert would focused on desired tab
//Now you can accept this alert and do further steps on this tab
IAlert alert = Session.Driver.SwitchTo().Alert();
alert.Accept();

Примечание. Если вы получаете исключение предупреждения при попытке принять предупреждение и не можете его найти, вам следует подождать, пока не откроется триггер JavaScript и окно предупреждения.

person Saurabh Gaur    schedule 06.01.2017
comment
Это сработало ... не элегантно, но определенно сработало. Спасибо. - person sapbucket; 07.01.2017