Я был бы очень признателен за руководство по подключению к уже открытому браузеру с помощью Selenium Webdriver через С#.
Эта проблема ест около 30% моего времени разработки script!
Я был бы очень признателен за руководство по подключению к уже открытому браузеру с помощью Selenium Webdriver через С#.
Эта проблема ест около 30% моего времени разработки script!
Обратитесь к Selenium Issue 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()
{
...
}
}
Последнее обходное решение выглядит нехорошим решением. Первое обходное решение Althouth также не гарантирует 100% изоляции тестов (кстати, не забудьте написать driver.Navigate().GoToUrl("http://www.google.com/");
как первый шаг для каждого теста). Поэтому, вероятно, лучшим решением будет параллельное выполнение и настройка, методы Teardown для каждого теста.
Так как время является вашей основной проблемой, и это не поддерживается. Зачем применять альтернативный подход. Разработайте/выполните базовое подключение и перейдите к варианту использования домашней страницы. Затем расширьте этот класс для вашего более сложного варианта использования. В качестве альтернативы создайте тестовый контроллер, затем используйте factory для создания ваших подробных тестов, передав экземпляр webdriver в тестовый файл.
Вы можете запускать свои тесты параллельно, но это хорошая идея, когда вы готовы запускать все свои тесты. Ниже приведена идея, которую вы можете использовать во время разработки и запуска нового скомпилированного кода.
Сериализуйте свой экземпляр объекта 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());
}
вы можете использовать пример кода ниже для достижения этой задачи
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