如何在Selenium C#中切换Chrome上的标签?

时间:2017-01-06 21:44:10

标签: javascript c# selenium selenium-webdriver selenium-chromedriver

我正在使用:

  • Chrome 55.0.2
  • 使用ChromeDriver的Selenium WebDriver 3.0.1
  • C#4.6.1(VS2015社区版)

我正在编写自动化代码,用于打开Chrome,打开标签页并导航到主页网址。此主页面包含我解析以生成辅助页面URL的信息。我的问题是我无法编写在加载辅助页面后切换回主页面选项卡的代码,也不能编写永不离开主页面的代码。我将解释我追求的两个选项:

选项#1 - 表现得像ctrl-click

在我生成此辅助页面网址后,我想打开另一个标签页,让Chrome导航到该网址,但不要将主页面标签保留在Chrome中。这类似于链接上的ctrl-click

选项#2 - 表现得像ctrl-1(切换回Chrome中的标签1)

我也会对在新的Chrome标签页中导航并加载辅助页面网址后的解决方案感到满意,然后自动切换回Chrome中的主页面标签。这类似于在Chrome有焦点时在键盘上键入ctrl-1

选项#3 - 其他什么?

我也会对完成我正在寻找的任何其他解决方案感到满意(不引入任何新技术层)。

一些背景信息 - 导航

我首先尝试了以下方法,但它未能满足我的要求,因为它会在相同的 Chrome标签页中打开生成的网址作为主页:

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

我还没有发现“直接”C#\ Chrome \ WebDriver命令在Chrome的新标签页中打开网址 - 它将始终使用当前标签。

我能够使用javascript在新标签页中打开网址找到代码。它看起来像这样:

// 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会将重点放在辅助页面\ tab上。此外,没有错误消息。从我在网上看到的这个命令应该切换标签。

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

尝试#2:发送密钥 - 操作

如果有效,这种方法真的很棒。同样,以下代码没有任何影响,Chrome会将其重点放在辅助页面\ tab上。此外,没有错误消息。

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

作为最后的努力,我目前正在搜索一个JavaScript命令,我可以使用IJavaScriptExecutor切换标签 - 到目前为止没有运气。

1 个答案:

答案 0 :(得分:2)

  

作为最后的努力,我目前正在搜索一个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触发和提醒框打开。