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