Я пытаюсь управлять двумя окнами браузера с помощью селена, используя c # и один хроматический драйвер. Причина в том, что мне нужно обмениваться деталями сеанса через окна браузера.
Код, который я пробовал и с которым не удалось, приведен ниже;
var options = new ChromeOptions();
options.AddArguments("chrome.switches", "--disable-extensions --disable-extensions-file-access-check --disable-extensions-http-throttling --disable-infobars --enable-automation ");
options.AddUserProfilePreference("credentials_enable_service", false);
options.AddUserProfilePreference("profile.password_manager_enabled", false);
options.PageLoadStrategy = PageLoadStrategy.Default;
ChromeDriverService service = ChromeDriverService.CreateDefaultService();
service.HideCommandPromptWindow = true;
var Driver = new ChromeDriver(service, options);
//THIS WILL OPEN A NEW WINDOW. BUT BECAUSE IT IS A NEW DRIVER DOES NOT WORK FOR SHARING SESSION DETAILS.
//var TestDriver = new ChromeDriver(service, options);
//TestDriver.Manage().Window.Maximize();
//THIS JUST OPENS UP A NEW TAB. NOT A NEW WINDOW (IT WOULD SEEM MOST DOCUMENTATION SUGGESTS THAT IT SHOULD)
IJavaScriptExecutor jscript = Driver as IJavaScriptExecutor;
jscript.ExecuteScript("window.open();", "google.com.au");
//TRY USING THE SEND KEYS TECHNIQUE. NOTHING HAPPENS
var test = Driver.FindElement(By.TagName("html"));
test.SendKeys(Keys.Control + "n");
test.SendKeys(Keys.Control + "t");
//TRY AGAIN USING THE SEND KEYS TECHNIQUE USING A DIFFERENT TAG. NOTHING HAPPENS
var blah = Driver.FindElements(By.TagName("body"));
blah[0].SendKeys(Keys.Control + "t");
//TRY USING ACTIONS. NOTHING HAPPENS
Actions action = new Actions(Driver);
action.SendKeys(OpenQA.Selenium.Keys.Control + "n");
action.Build().Perform();
Я могу прибегнуть к AutoIt, чтобы открыть браузер, если потребуется, но еще одна зависимость - это не то, что мне нужно. Документация повсюду в Интернете, по-видимому, подсказывает, что все варианты, которые я пробовал выше, должны работать ... Я подозреваю, что это может быть проблема с хроматическим драйвером.
Буду очень признателен за любые идеи о том, как достичь моей цели
UPDATE.
Ответ Арнона ниже приведёт меня к решению. Если вы находитесь в подобной ситуации, лучше всего открыть консоль браузера (из инструментов разработчика) и экспериментировать с javascript, пока не получите то, что вы хотите. Тогда просто выполните это. В конце концов выполнение следующего кода сработало для меня.
IJavaScriptExecutor jscript = Driver as IJavaScriptExecutor;
jscript.ExecuteScript("window.open('https://www.bing.com.au','_blank','toolbar = 0, location = 0, menubar = 0')");
Другой альтернативой было использование Autoit, с которым я тоже работал, гораздо проще, чем при разборе javascript. Но наименьшая зависимость лучше:)
UPDATE2.
Дополнительные сложности возникают при попытке управления окном как независимым окном браузера. Я полагаю, что любое новое окно, созданное из родительского окна, имеет тот же идентификатор процесса (по крайней мере, мое тестирование указало на это), и в целом интенсивно и целенаправленно рассматривается как вкладка в драйвере selinium. Поэтому я прихожу к выводу, что некоторые вещи просто невозможны (например, перемещение дочернего окна браузера на экране).