如何让Selenium仅使用一个驱动程序硒(使用C#和chromedriver)来操作两个浏览器窗口?

时间:2018-09-10 12:13:30

标签: c# selenium selenium-chromedriver

我正在尝试使用c#和单个chromedriver通过selenium控制两个浏览器窗口。原因是我需要在浏览器窗口之间共享会话详细信息。

我尝试过并失败的代码如下;

    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来打开浏览器,但是我不再需要其他依赖项。网上各处的文档似乎暗示着我上面尝试过的所有选项都不应该起作用……我怀疑这可能是某种形式的chromedriver问题。

任何有关实现我的目标的想法将不胜感激

更新。
下面的Arnons答案将我引向解决方案。如果遇到类似情况,最好的办法就是打开浏览器控制台(通过开发人员工具)并尝试使用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。 试图将窗口作为独立的浏览器窗口进行控制会带来更多的复杂性。我相信从父窗口创建的任何新窗口都具有相同的进程ID(至少在我的测试中如此表示),并且所有内容和目的都被视为selinium驱动程序中的选项卡。因此,我得出结论,某些事情是不可能的(例如,将子浏览器窗口重新放置在屏幕上)。

3 个答案:

答案 0 :(得分:1)

我应该更好地阅读这个问题,这是我的解决方案。最终使用它来选择单击按钮后弹出的窗口,但是应该可以在窗口之间切换。

printf("0")

答案 1 :(得分:1)

您第一次使用ExecuteJavaScript的尝试非常接近,但是要使其打开新窗口而不是新标签,您应该添加以下参数:`“ _blank”,“ toolbar = 0,location = 0,menubar = 0“。 有关更多详细信息,请参见this question

答案 2 :(得分:0)

您需要明确告知Selenium您希望与哪个标签进行交互;在这种情况下,应该是哪个标签;

driver.SwitchTo().Window(driver.WindowHandles.Last());