如何连接到已经打开的浏览器
本文关键字:浏览器 何连接 连接 | 更新日期: 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