【问题标题】:How to connect to an already open browser?如何连接到已经打开的浏览器?
【发布时间】:2011-12-07 15:27:56
【问题描述】:

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

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

【问题讨论】:

  • 我不认为这是可能的
  • 为什么不创建一个测试套件并使用相同的 selenium 实例?
  • 我该怎么做?测试停止后,如何连接现有浏览器?
  • 找到解决方案了吗?
  • 如果您开始测试然后没有退出浏览器,如果您跟踪 Selenium SessionId 和连接到浏览器的端口,您可能会重新连接到它。然后,您必须扩展 RemoteWebDriver 以允许您传入自己的 SessionId 并将 url 指向您跟踪的端口。注意:这只有在您使用 Selenium 启动浏览器时才可能起作用。

标签: c# selenium webdriver selenium-webdriver


【解决方案1】:

请参阅Selenium Issue 18。这是一个非常流行的功能请求,遗憾的是尚未实现。 cmets 目前建议了一些解决方法,我还没有尝试过,但您可能会发现一些有用的方法。

【讨论】:

  • Java 中有一个可以让您很好地了解解决方法是如何完成的,然后您可以在 C# 中实现它
  • 这正是我需要帮助的 :)
  • 我发布的以下答案显示了如何使用 C# 连接到 Selenium WebDriver 中已打开的浏览器
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以在 [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 方法。

    【讨论】:

    • 有人可以检查它是否有效吗?我目前不在 Selenium 上工作
    【解决方案4】:

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

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

    当我有时间时,我会在这里更新我的答案。我希望 Stack Overflow 允许我粘贴尽可能多的代码更改。另外,我仍然应该感谢 Erik 的回答和 cmets。虽然这是我的想法(让 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());
    }
    

    【讨论】:

    • 而不是序列化整个对象,您可以只保存会话 ID 并重新使用会话 ID 来连接到已打开的实例。请看这篇文章。 binaryclips.com/2015/08/25/…
    【解决方案5】:

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

    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 驱动程序将使用现有打开的浏览器。 (不会打开新的浏览器窗口)。

    将此初始化放在您的测试启动方法中
    这段代码节省了我大量的时间。 我还写了一篇关于它的博客文章。 你可以在这里阅读它。 http://www.binaryclips.com/2016/03/selenium-web-driver-in-c-how-to.html

    【讨论】:

    • 简而言之,您的解决方案是不使用 Selenim Firefox 驱动程序,而是使用独立服务器。即使我真的不喜欢运行 Java 应用程序,我也不得不承认独立服务器很少有令人头疼的问题。
    • 我在开发脚本时使用这种方法。不是当我执行它们时。它节省了调试等时间。每次用这种方法修复我的代码后,我不必一次又一次地重新打开浏览器
    • 另外,在 C# 中,我们不必打开独立服务器来使用远程 webDriver。如果你用firefox驱动打开了浏览器,远程webDriver可以附加到这个浏览器上。
    • 嗯很有趣,不知道那个功能。你需要提供任何论据吗?还是遥控器只是连接到最后一个实例?
    • 它连接到最后一个实例。您只需提供此网址“localhost:7055/hub
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2018-05-31
    相关资源
    最近更新 更多