Selenium ChromeDriver 切换标签页

17

当我在我的测试中点击链接时,会打开一个新标签页。 我希望ChromeDriver聚焦于该标签页。我尝试了以下代码,使用ctrl + tab快捷键来使ChromeDriver切换标签:

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切换选项卡?


1
只是猜测:新标签页是一个新窗口,也就是说,您可以在driver.SwitchTo().Window(handle)中找到它。然后,当然,您必须使用某些条件来找到它。 - Torbjörn Kalin
5个回答

20

这是对我有效的方法:

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

19

如我在您的帖子中所述,我不确定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有机会打开新标签之前,不要开始查找新标签 :)


不需要对 Expression<Func> 进行 Compile() - 直接使用 Func 即可。 - McX
@McX Expression 的目的是提供良好的错误信息。 - Torbjörn Kalin

9

当我点击一个按钮时,会打开一个新的选项卡(因此它已经在新选项卡上,我不需要做任何事情去到达那个新选项卡),并运行以下代码,以识别新选项卡并继续工作:

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

1

经过长时间的努力,我终于能够使用chrome driver使其正常工作。虽然警告信息不可见,但它会将标签带到前台,并立即关闭。

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

0
在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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接