Как подключиться к уже открытому браузеру? - PullRequest
12 голосов
/ 14 октября 2011

Я был бы очень признателен за руководство о том, как подключиться к уже открытому браузеру с помощью Selenium Webdriver через C #.

Эта проблема пожирает около 30% времени разработки моего скрипта!

Ответы [ 5 ]

1 голос
/ 29 марта 2012

Вы можете указать запуск и закрытие браузера в [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()
    {
       ...
    }
}

Последний обходной путь выглядит не очень хорошим решением.Althouth первый обходной путь также не гарантирует 100% изоляцию тестов (кстати, не забудьте написать driver.Navigate().GoToUrl("http://www.google.com/"); в качестве первого шага для каждого теста).Поэтому, вероятно, лучшим решением будет параллельное выполнение и установка, методы Teardown для каждого теста.

1 голос
/ 14 октября 2011

См. Selenium Issue 18 . Это очень популярный запрос, который, к сожалению, не был реализован. Комментарии пока предлагают несколько обходных путей, я не пробовал их, но вы можете найти что-то полезное.

0 голосов
/ 16 сентября 2014

Вы можете использовать приведенный ниже пример кода для решения этой задачи

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 открывается с помощью веб-драйвера Firefox, вы можете использовать Remote WebDriver для использования этого экземпляра браузера. Итак, сначала я пытаюсь инициализировать драйвер удаленного веба, если ни один экземпляр не запущен, затем попытка блока завершится неудачно, и блок Catch откроет драйвер Firefox. Теперь, например, ваш скрипт не работает в определенном месте, а браузер остается открытым. Теперь снова запустите этот код инициализации, блок try пройдет на этот раз, и удаленный веб-драйвер будет использовать существующий открытый браузер. (Новое окно браузера не откроется).

Поместите эту инициализацию в ваш метод запуска теста
Этот блок кода экономит мое время. Я также написал сообщение в блоге об этом. Вы можете прочитать это здесь. http://www.binaryclips.com/2016/03/selenium-web-driver-in-c-how-to.html

0 голосов
/ 12 мая 2012

Вы можете запускать свои тесты параллельно, но это хорошая идея, когда вы готовы выполнить все свои тесты. Ниже приведена идея, которую вы можете использовать при разработке и запуске вновь скомпилированного кода.

Сериализует ваш экземпляр объекта WebDriver {browser} в файл (или в память в службе Windows, если вы предпочитаете), а затем извлекаете (десериализуете) этот файл в объект каждый раз, когда вы запускаете WebDriver. Тем не менее, нужно немного помассировать исходный код WebDriver.

Когда у меня будет время, я обновлю свой ответ здесь. Я надеюсь, что переполнение стека позволит мне вставить столько изменений кода, сколько потребовалось. Кроме того, я все еще должен отдать должное Эрику в его ответе и комментариях. Хотя для начала это была моя идея (сделать WebDriver быстрее).

.NET: Сериализация объекта в файл сторонней сборки (для ускорения Selenium 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());
}
0 голосов
/ 01 февраля 2012

Поскольку время - ваша основная проблема, и она не поддерживается изначально.Зачем принимать альтернативный подход.Разработка / внедрение базового варианта подключения и перехода к домашней странице.Затем расширьте этот класс для более сложного варианта использования.Либо создайте контроллер тестового примера, а затем используйте фабрику для создания подробных тестов, передав экземпляр веб-драйвера в тестовый набор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...