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

本文关键字:浏览器 何连接 连接 | 更新日期: 2023-09-27 18:11:19

我真的很感激如何通过c#使用Selenium Webdriver连接到已经打开的浏览器的指南。

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

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

参考《Selenium》第18期。这是一个非常受欢迎的特性请求,遗憾的是尚未实现。评论建议了一些变通方法,我还没有尝试过,但你可能会发现一些有用的

你可以在[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()
    {
       ...
    }
}

最后一个变通方法看起来不是一个好的解决方案。尽管第一个解决方案也不能保证100%的测试隔离(顺便说一句,不要忘记将driver.Navigate().GoToUrl("http://www.google.com/");作为每个测试的第一步)。因此,最好的解决方案可能是并行执行和Setup, Teardown方法为每个测试。

由于时间是您的主要问题,而本机不支持此功能。为什么要采用另一种方法呢?开发/实施基本连接;导航到主页用例。然后为更复杂的用例扩展这个类。或者让Test case controller,然后使用一个工厂来实例化你的详细测试,将webdriver实例传递到测试用例中。

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

序列化你的WebDriver {browser}实例对象到一个文件(或者在内存中的Windows服务,如果你喜欢),然后检索(反序列化)该文件到一个对象,每次你启动WebDriver。不过,这需要对WebDriver源代码进行一些修改。

当我有时间的时候,我会在这里更新我的答案。我希望Stack Overflow将允许我粘贴尽可能多的代码更改。另外,我还是应该感谢埃里克的回答和评论。虽然这是我的想法开始(使WebDriver更快)。

。. NET:从第三方程序集序列化对象到文件(使Selenium WebDriver更快)

==========

简单逻辑:

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

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

==========

另一个要求是你在你的方法中加入一个条件,用[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());
}

您可以使用下面的代码示例来实现此任务

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块将失败,Catch块将打开Firefox驱动程序。现在,例如,您的脚本在特定位置失败,浏览器保持打开状态。现在再次运行初始化代码,try块将通过这次和远程web驱动程序将使用现有的打开的浏览器。(不会打开新的浏览器窗口)。

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