【问题标题】:Selenium ChromeDriver switch tabsSelenium ChromeDriver 切换选项卡
【发布时间】:2012-05-11 10:56:17
【问题描述】:

当我单击测试中的链接时,它会打开一个新选项卡。 我希望 ChromeDriver 然后专注于该选项卡。我已尝试使用以下代码让 ChromeDriver 使用 ctrl+tab 快捷方式更改 taba:

Actions builder = new Actions(driver);
builder.KeyDown(Keys.Control).KeyDown(Keys.Tab).KeyUp(Keys.Tab).KeyUp(Keys.Control);//switch tabs
IAction switchTabs = builder.Build();
switchTabs.Perform();

但这会引发以下异常:

ekmLiveChat.tests.UITests.EndToEndTest.EndToEnd:
System.ArgumentException : key must be a modifier key (Keys.Shift, Keys.Control, or Keys.Alt)
Parameter name: key

有没有办法使用 ChromeDriver 切换标签页?

【问题讨论】:

  • 这里只是猜测:新标签是一个新窗口,也就是可以在driver.SwitchTo().Window(handle)中找到。然后,当然,你必须使用一些条件才能找到它。

标签: c# selenium selenium-chromedriver


【解决方案1】:

正如我在您的帖子的评论中提到的,我不确定 Chrome 驱动程序处理标签的方式是否与处理窗口的方式相同。

当打开新窗口时,此代码在 Firefox 中有效,因此希望它也适用于您的情况:

public void SwitchToWindow(Expression<Func<IWebDriver, bool>> predicateExp)
{
    var predicate = predicateExp.Compile();
    foreach (var handle in driver.WindowHandles)
    {
        driver.SwitchTo().Window(handle);
        if (predicate(driver))
        {
            return;
        }
    }

    throw new ArgumentException(string.Format("Unable to find window with condition: '{0}'", predicateExp.Body));
}

SwitchToWindow(driver => driver.Title == "Title of your new tab");

(我希望我对这个答案的代码的编辑没有引入任何错误......)

请确保在 Chrome 有机会打开新标签之前,您没有开始寻找新标签 :)

【讨论】:

  • 不需要Compile() Expression&lt;Func&gt; - 直接使用Func
  • @McX Expression 的目的是提供一个好的错误信息。
【解决方案2】:

这对我有用:

var popup = driver.WindowHandles[1]; // handler for the new tab
Assert.IsTrue(!string.IsNullOrEmpty(popup)); // tab was opened
Assert.AreEqual(driver.SwitchTo().Window(popup).Url, "http://blah"); // url is OK  
driver.SwitchTo().Window(driver.WindowHandles[1]).Close(); // close the tab
driver.SwitchTo().Window(driver.WindowHandles[0]); // get back to the main window

【讨论】:

    【解决方案3】:

    在我的代码上,我单击一个按钮并打开一个选项卡(因此它已经在新选项卡上,我无需执行任何操作即可转到该新选项卡)并运行它,以便它识别新选项卡并正常工作:

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

    【讨论】:

      【解决方案4】:

      经过长时间的斗争,我能够使用 chrome 驱动程序来解决这个问题。警报消息不可见,但会将选项卡置于最前面并接受立即关闭它。

      //Rotate Tabs
      seleniumDriver.SwitchTo().Window(seleniumDriver.WindowHandles[currentUrlIndex]);
      IJavaScriptExecutor jscript = seleniumDriver as IJavaScriptExecutor;
      jscript.ExecuteScript("alert('Focus')");
      seleniumDriver.SwitchTo().Alert().Accept();
      

      【讨论】:

        【解决方案5】:

        在 C# 中,我使用以下行在两个选项卡之间切换。

        IJavaScriptExecutor js = (IJavaScriptExecutor)driver;   
        js.ExecuteScript("window.open();");   
        IList<string> tabs = new List<string>(driver.WindowHandles);    
        driver.SwitchTo().Window(tabs[1]);
        driver.Navigate().GoToUrl("http://www.google.com");
        

        【讨论】:

          猜你喜欢
          • 2018-12-15
          • 1970-01-01
          • 2017-04-20
          • 2012-09-25
          • 2015-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-27
          相关资源
          最近更新 更多