Как заставить Selenium работать с двумя окнами браузера, используя только один драйвер selenium (используя c # и chromedriver)? - PullRequest
0 голосов
/ 10 сентября 2018

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

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

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

//---- Setup Handles ----
//Create a Handle to come back to window 1
string currentHandle = driver.CurrentWindowHandle;

//Creates a target handle for window 2
string popupWindowHandle = wait.Until<string>((d) =>
{
    string foundHandle = null;

    // Subtract out the list of known handles. In the case of a single
    // popup, the newHandles list will only have one value.
    List<string> newHandles = driver.WindowHandles.Except(originalHandles).ToList();
    if (newHandles.Count > 0)
    {
        foundHandle = newHandles[0];
    }
    return foundHandle;
});

//Now you can use these next 2 lines to continuously swap
//Swaps to window 2
driver.SwitchTo().Window(popupWindowHandle);

// Do stuff here in second window 

//Swap back to window 1
driver.SwitchTo().Window(currentHandle);

// Do stuff here in first window
0 голосов
/ 12 сентября 2018

Ваша первая попытка использования ExecuteJavaScript была очень близкой, но для того, чтобы открыть новое окно вместо новой вкладки, вы должны добавить следующие аргументы: `" _blank "," toolbar = 0, location = 0,menubar = 0 "к нему.См. этот вопрос для более подробной информации.

0 голосов
/ 10 сентября 2018

Вам необходимо явно указать Selenium, с какой вкладкой вы хотите взаимодействовать, что в данном случае будет;

driver.SwitchTo().Window(driver.WindowHandles.Last());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...