【问题标题】:Open link in new tab selenium c#在新选项卡中打开链接 selenium c#
【发布时间】:2015-12-07 16:49:08
【问题描述】:

我正在编写一个程序来运行我网站上列出的视频以进行测试,这里我需要的是在同一浏览器窗口的不同选项卡中运行视频。

列表中有一百个视频网址videoLinks = getVideoUrls(); 现在我需要一次执行 5 个视频。

ChromeDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.withoutabox.com" + videoLink);

如果我采用上述方法,那么对于所有视频,我将不得不创建一个新的 ChromeDriver 对象。我想使用单个 chrome 浏览器对象。

我试过了

IWebElement body = driver.FindElement(By.TagName("body"));
body.SendKeys(Keys.Control + "t");

它只会添加一个新标签,但不会在那里打开链接。 请让我知道我应该如何解决它。我用谷歌搜索但找不到我的解决方案,所以想寻求帮助。

【问题讨论】:

    标签: c# google-chrome selenium-webdriver


    【解决方案1】:

    这是在 selenium c# 中打开新标签的简单解决方案:

    driver.Url = "http://www.gmail.net";
    IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
    js.ExecuteScript("window.open();");
    

    【讨论】:

      【解决方案2】:

      试试这个:

      public void SwitchToTab(object pageId)
      {
          webDriver.SwitchTo().Window(pageId.ToString());
      }
      

      您可以使用 CurrentWindowHandle 来查找当前选项卡。

      webDriver.CurrentWindowHandle;
      

      对于您的场景,我正在使用该代码:

      public IPageAdapter OpenNewTab(string url)
      {
          var windowHandles = webDriver.WindowHandles;
          scriptExecutor.ExecuteScript(string.Format("window.open('{0}', '_blank');", url));
          var newWindowHandles = webDriver.WindowHandles;
          var openedWindowHandle = newWindowHandles.Except(windowHandles).Single();
          webDriver.SwitchTo().Window(openedWindowHandle);
          return new SeleniumPage(webDriver);
      }
      

      更新

      窗口打开创建新的弹出窗口。默认情况下,此选项可以被浏览器设置阻止。手动禁用浏览器中的弹出窗口阻止。

      要检查这一点,请在浏览器中打开 js 控制台并尝试执行命令 window.open('http://facebook.com', '_blank');

      如果新窗口打开成功则一切正常。

      您还可以使用特定设置创建您的 chrome 驱动程序。这是我的代码:

      var chromeDriverService = ChromeDriverService.CreateDefaultService();
      var chromeOptions = new ChromeOptions();
      chromeOptions.AddUserProfilePreference("profile.default_content_settings.popups", 0);
      return new ChromeDriver(chromeDriverService, chromeOptions, TimeSpan.FromSeconds(150));
      

      【讨论】:

      • 这对我不起作用。 var webDriver = new ChromeDriver(); webDriver.Navigate().GoToUrl(url); var windowHandles = webDriver.WindowHandles; ((IJavaScriptExecutor)webDriver).ExecuteScript(string.Format("window.open('{0}', '_blank');", url)); var newWindowHandles = webDriver.WindowHandles; var opensWindowHandle = newWindowHandles.Except(windowHandles).Single(); webDriver.SwitchTo().Window(openedWindowHandle);
      • 抛出异常 System.InvalidOperationException: Sequence contains no elements at var opensWindowHandle = newWindowHandles.Except(windowHandles).Single();
      • 实际上,我是 selenium 的新手,很难理解您共享的代码。 webDriver.WindowHandles 返回在 Web 浏览器上执行的操作?然后有一行执行javascript。此行是否应该使用该网址打开一个新标签?执行 javascript 后,我​​观察到浏览器没有任何变化,你能告诉我什么是 opensWindowHandle 吗?我是新手,所以无法理解。
      • @sohaibjaved 在第一行我们检索所有打开的 chrome 窗口。此集合应包含您当前的 chrome 窗口(如果您之前打开过几个 chrome 选项卡,则为窗口)。然后我们执行应该在新窗口(_blank)中打开我们的 url 的 JS。即使我们在 chrome 浏览器的 url-string 中执行此代码,这是一个 JS 技巧也应该有效。接下来我们再次检索打开的窗口。此集合应包含打开的窗口和在前一行中打开的新窗口。我们排除了这个集合中的旧窗口并将 webDriver 切换到新窗口。并以新窗口返回新页面。
      • 很遗憾听到我的示例不适合您,这是我在生产项目中的真实代码。我希望我的cmets能帮助你自己解决你的问题。祝你好运。
      猜你喜欢
      • 2017-01-19
      • 1970-01-01
      • 2016-03-26
      • 2012-04-25
      • 2017-04-08
      • 2021-12-21
      • 2014-04-24
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多