Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何连接到已打开的浏览器?_C#_Selenium_Webdriver_Selenium Webdriver - Fatal编程技术网

C# 如何连接到已打开的浏览器?

C# 如何连接到已打开的浏览器?,c#,selenium,webdriver,selenium-webdriver,C#,Selenium,Webdriver,Selenium Webdriver,如果能提供一份关于如何通过C#使用Selenium Webdriver连接到已经打开的浏览器的指南,我将不胜感激 这个问题占用了我大约30%的脚本开发时间 请参阅。这是一个非常流行的特性请求,但遗憾的是尚未实现。这些评论提出了一些解决方法,我还没有尝试过,但您可能会发现一些有用的方法。因为时间是您的首要问题,而且本机不支持。为什么要采取另一种方法呢。开发/实施基本连接并导航到主页用例。然后针对更复杂的用例扩展该类。或者,制作测试用例控制器,然后使用工厂实例化您的详细测试,将webdriver实例

如果能提供一份关于如何通过C#使用Selenium Webdriver连接到已经打开的浏览器的指南,我将不胜感激


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

请参阅。这是一个非常流行的特性请求,但遗憾的是尚未实现。这些评论提出了一些解决方法,我还没有尝试过,但您可能会发现一些有用的方法。

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

您可以在[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_测试),另一个测试类在最后执行(Z_测试),则可以设置和取消设置一些标志,这些标志将告诉我们是否应该启动浏览器:

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().gotour(“http://www.google.com/”;
作为每个测试的第一步)。因此,最好的解决方案可能是并行执行和设置,以及每个测试的拆卸方法。

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

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

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

==========

简单逻辑:

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

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

==========

另一个要求是在方法中加入一个条件,该条件用[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浏览器,则可以使用远程web驱动程序使用该浏览器实例。 所以首先我尝试初始化一个远程Web驱动程序,如果没有实例在运行,那么try块将失败,Catch块将打开Firefox驱动程序。 例如,现在脚本在特定位置失败,浏览器保持打开状态。 现在再次运行该初始化代码,try块将在这次通过,远程web驱动程序将使用现有打开的浏览器。(不会打开新的浏览器窗口)

将此初始化放在测试启动方法中
这段代码节省了我大量的时间。 我也写了一篇关于它的博客文章。 你可以在这里读。

我认为这是不可能的。为什么不创建一个测试套件并使用同一个selenium实例呢?我该怎么做?测试停止后,如何连接到现有浏览器?是否找到解决方案?如果您启动了测试,但没有退出浏览器,如果您跟踪Selenium SessionId和要连接到浏览器的端口,则可能会重新连接到该浏览器。然后,您必须扩展RemoteWebDriver,以允许您传入自己的SessionId,并将url指向跟踪的端口。注意:只有当您使用Selenium启动浏览器时,这才可能起作用。Java中有一个可以让您很好地了解解决方法是如何完成的,然后你可以用C语言实现它,这正是我需要帮助的:)下面我发布的答案显示了如何使用C语言连接到Selenium WebDriver中已经打开的浏览器,有人能检查它是否工作吗?我现在不是在研究Selenium。简单地说,你的解决方案不是使用Selenium Firefox驱动程序,而是使用独立服务器。即使我真的不喜欢运行Java应用程序,我也不得不承认独立服务器并没有什么麻烦。我在开发脚本时使用这种方法。当我执行它们的时候就不会了。它节省了调试等方面的时间。每次使用这种方法修复代码后,我不必一次又一次地重新打开浏览器。此外,在C#中,我们不必打开独立的服务器来使用远程webDriver。如果您使用firefox驱动程序打开浏览器,远程webDriver可以连接到此浏览器。嗯,很有趣,我不知道该功能。你需要提供这样的论点吗?或者远程设备只是连接到最后一个实例?它突出连接到最后一个实例。您只需提供此URL“”,而不是序列化整个对象,您只需保存会话id并重用会话id即可连接到已打开的实例。请看这篇文章