如何连接已经打开的浏览器?

时间:2011-10-14 10:08:50

标签: c# selenium webdriver selenium-webdriver

我非常感谢有关如何使用Selenium Webdriver通过C#连接到已经打开的浏览器的指南。

这个问题占我脚本开发时间的30%左右!

5 个答案:

答案 0 :(得分:1)

请参阅Selenium Issue 18。这是一个非常受欢迎的功能请求,遗憾的是没有实现。评论提示现在有一些解决方法,我没有尝试过,但你可能会发现一些有用的东西。

答案 1 :(得分:1)

您可以在[TestFixtureSetUp]和[TestFixtureTearDown]中指定启动和关闭浏览器,并从[SetUp]和[TearDown]中删除它。 [TestFixture]中的所有测试都将在同一浏览器中运行。因此,如果你有10个类,每个类包含5个测试,而不是50个浏览器的开放和关闭,那么只有10个。

    public IWebDriver driver { get; private set; };

    [TestFixtureSetUp]
    public void TestFixtureSetup()
    {
        driver = new FirefoxDriver();
        driver.Navigate().GoToUrl("http://www.google.com/");
    }

    [TestFixtureTearDown]
    public void TestFixtureTearDown()
    {
         driver.Quit();
    }

如果要打开和关闭浏览器一次,可以从基类继承[TestFixtureSetUp]和[TestFixtureTearDown]方法,如果你有一个在其他人之前执行的测试类(A_test)和一个最后执行的测试类( Z_test)你可以设置和取消设置一些标志,告诉我们是否应该启动浏览器:

namespace Tests
{
[TestFixture]
public abstract class Test
{
    private static bool _flagSetUp;
    private static bool _flagTearDown;
    public IWebDriver driver { get; private set; };

    protected Test()
    {
    }

    public static void SetFlag(bool flagSetUp, bool flagTearDown)
    {
        _flagSetUp = flagSetUp;
        _flagTearDown = flagTearDown;
    }

    [TestFixtureSetUp]
    public void TestFixtureSetup()
    {
        if(_flagSetUp)
        {
            driver = new FirefoxDriver();
            driver.Navigate().GoToUrl("http://www.google.com/");
            _flagSetUp = false;
        }
    }

    [TestFixtureTearDown]
    public void TestFixtureTearDown()
    {
        if(_flagTearDown)
        {
            driver.Quit();
        }
    }
}

namespace Tests
{
[TestFixture(new object[] { true, false })]
public class A_Test : Test
{
    public A_Test(bool flagSetUp, bool flagTearDown)
    {
        SetFlag(flagSetUp, flagTearDown);
    }

    [Test]
    public void Test1()
    {
       ...
    }
}

namespace Tests
{
[TestFixture(new object[] { false, true })]
public class Z_Test : Test
{
    public A_Test(bool flagSetUp, bool flagTearDown)
    {
        SetFlag(flagSetUp, flagTearDown);
    }

    [Test]
    public void Test2()
    {
       ...
    }
}

最后的解决方法看起来不是很好的解决方案。 Althouth第一个解决方法也不保证100%测试隔离(顺便说一下,不要忘记将driver.Navigate().GoToUrl("http://www.google.com/");写为每个测试的第一步)。因此,最好的解决方案可能是并行执行和每次测试的安装,拆解方法。

答案 2 :(得分:0)

由于时间是您的主要问题,因此本机不受支持。为什么采用替代方法。开发/实施基本连接和导航到主页用例。然后为更复杂的用例扩展该类。或者制作测试用例控制器,然后使用工厂实例化您的详细测试,将webdriver实例传递给测试用例。

答案 3 :(得分:0)

您可以并行运行测试,但是当您准备好运行所有测试时,这只是一个好主意。下面是您在开发和运行新编译的代码时可以使用的想法。

将WebDriver {browser}实例对象序列化为文件(或者如果您愿意,可以在Windows服务的内存中),然后在每次启动WebDriver时将该文件检索(反序列化)到对象中。虽然WebDriver源代码需要一些按摩。

当我有空的时候,我会在这里更新我的答案。我希望Stack Overflow允许我粘贴尽可能多的代码更改。另外,我仍然应该赞扬Erik的回答和评论。虽然我的想法始于(使WebDriver更快)。

.NET: Serializing object to a file from a 3rd party assembly (to make Selenium WebDriver faster)

==========

简单逻辑:

  • 如果序列化对象文件不存在==>正常打开浏览器实例,并创建文件

  • 如果序列化对象文件存在==>将文件反序列化为对象==>将浏览器实例设置为等于反序列化对象(当然是正确投放)

==========

另一个要求是您在使用[TearDown]属性修饰的方法中添加条件,以便在脚本(测试)完成时您的浏览器不会关闭。第一次,打开它需要时间。但是一旦浏览器窗口打开,你就可以了。

[TearDown]
public void TeardownTest()
{
    try
    {
        if (Config.CLOSE_BROWSER_AFTER_TEST_CASE)
        {
            driver.Quit();
        }
    }
    catch (Exception)
    {
        // Ignore errors if unable to close the browser
    }
    Assert.AreEqual("", verificationErrors.ToString());
}

答案 4 :(得分:0)

您可以使用以下代码示例来完成此任务

IWebDriver WebDriver = null;


try
{
  System.Uri uri = new System.Uri("http://localhost:7055/hub");
  WebDriver = new RemoteWebDriver(uri, DesiredCapabilities.Firefox());
  Console.WriteLine("Executed on remote driver");
}
catch (Exception)
{
  WebDriver = new FirefoxDriver();
  Console.WriteLine("Executed on New FireFox driver");
}

如果使用Firefox Web驱动程序打开firefox浏览器,则可以使用Remote WebDriver来使用该浏览器实例。 所以首先我尝试初始化远程Web驱动程序,如果没有运行实例,则try block将失败,Catch块将打开Firefox驱动程序。 例如,您的脚本在特定位置失败,浏览器保持打开状态。 现在再次运行该初始化代码,try块将通过此时间,远程Web驱动程序将使用现有的已打开浏览器。 (不会打开新的浏览器窗口。)

将此初始化放入Test Startup方法中 这段代码节省了我足够的时间。 我还写了一篇博文。 你可以在这里阅读它。 http://www.binaryclips.com/2016/03/selenium-web-driver-in-c-how-to.html