Подтвердить что ты не робот

Как подключиться к уже открытому браузеру?

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

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

4b9b3361

Ответ 1

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

Ответ 2

Вы можете указать запуск и закрытие браузера в [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 для каждого теста.

Ответ 3

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

Ответ 4

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

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

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

.NET: Сериализация объекта в файл из сторонней сборки (чтобы ускорить работу Selenium WebDriver)

==========

Простая логика:

  • если серийный файл объекта не существует == > открыть экземпляр браузера как обычно, и создать файл

  • если существует файл сериализованного объекта == > десериализовать файл в объект == > установить экземпляр браузера, равный десериализованному объекту (правильно введенный),

==========

Другое требование заключается в том, что вы добавили условие в свой метод, украшенный атрибутом [TearDown], чтобы ваш браузер не закрывался, когда заканчивается script (тест). В первый раз, это займет время, чтобы открыть его. Но как только окно браузера будет открыто, вам будет хорошо.

[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());
}

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

Поместите эту инициализацию в метод тестового запуска

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