Происходит запуск 4 браузеров но действия происходят только в 2
Что бы использовать один тест для двух браузеров написал отдельную переменную которая хранит массив браузеров
using NUnit.Framework;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium;
namespace InputAndClickInBrowsers
{
[TestFixture]
public class TestsWithMultipleBrowsers
{
Код в теле класса.
static IWebDriver[] DriversForCase =
{
ChromeInitialization.Instanse,
FireFoxInitialization.Instanse
};
далее передал этот пассив в тест
[TestCaseSource(nameof(DriversForCase))]
public void GoToBbcCom_ReturnedSearchFieldStatus(IWebDriver _driver)
{
_driver.Manage().Window.Maximize();
_driver.Navigate().GoToUrl("https://www.bbc.com/");
var textForSearch = "this";
//Close pop-up window
_driver.FindElement(By.XPath("//button[@class='sign_in-exit']")).Click();
//Find string for search
var bbcSearchInput = _driver.FindElement(By.CssSelector("[placeholder='Search']"));
if (bbcSearchInput.Displayed && bbcSearchInput.Enabled)
{
bbcSearchInput.Click();
}
//Writing some text to search
bbcSearchInput.SendKeys(textForSearch);
// Click button for starting Search
_driver.FindElement(By.XPath("//button[@id='orb-search-button']")).Click();
var textInCurrentSearchLine = _driver.FindElement(By.XPath("//input")).GetAttribute("value");
var firstUrl = _driver.Url;
//Click first link
_driver.FindElement(By.XPath("//a[@class='css-vh7bxp-PromoLink e1f5wbog6'][1]")).Click();
var urlOfNewPage = _driver.Url;
Assert.IsTrue(textForSearch == textInCurrentSearchLine);
Assert.AreEqual(urlOfNewPage, _driver.Url);
}
и все как бы работает не нужно писать лишние тесты для других браузеров по необходимости можно просто изменить массив. Но вопрос в следующем при начале выполнения кода или на этапе сборки открываются 2 браузера но в дальнейшем не используются. И потом при выполнении теста открывается еще 2 браузера и в них уже выполняются шаги теста. В чем проблема почему так выходит. И как можно исправить это в коде.
реализация ChromeInitialization и ChromeInitialization одинаковы поэтому закину код одного из данных классов.
using System;
using System.Collections.Generic;
using System.Text;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium;
namespace InputAndClickInBrowsers
{
public class ChromeInitialization
{
//- Инициализация браузера — применить паттерн синглтон для инициализации браузера
private static ChromeInitialization _classObject;
private static ChromeDriver _chrome;
private ChromeInitialization() { }
public static ChromeDriver Instanse
{
get
{
if (_classObject == null)
{
_classObject = new ChromeInitialization();
_chrome = new ChromeDriver();
}
return _chrome;
}
}
}
}
Ответы (2 шт):
Ну вроде вот так, открываются только два. Может конечно не так удобно тестировать, как хочет автор. Но вроде на браузерах сценарий идёт асинхронно сразу на 2-х и ничего не открывается лишнего. Почему это происходит, не разбирался.
public class Test
{
static IWebDriver[] _driversForCase;
public async Task RunTest()
{
var test = new Test();
await test.TestDrivers();
}
public async Task TestDrivers()
{
foreach (IWebDriver webDriver in GetWebDrivers())
{
await Task.Run(() => GoToBbcCom_ReturnedSearchFieldStatus(webDriver));
}
}
protected IWebDriver[] GetWebDrivers()
{
if (_driversForCase == null)
_driversForCase = new IWebDriver[] { new ChromeDriver(), new OperaDriver() };
return _driversForCase;
}
protected void GoToBbcCom_ReturnedSearchFieldStatus(IWebDriver _driver)
{
//_driver.Manage().Window.Maximize();
_driver.Navigate().GoToUrl("https://www.bbc.com/");
var textForSearch = "this";
//Close pop-up window
_driver.FindElement(By.XPath("//button[@class='sign_in-exit']")).Click();
//Find string for search
var bbcSearchInput = _driver.FindElement(By.CssSelector("[placeholder='Search']"));
if (bbcSearchInput.Displayed && bbcSearchInput.Enabled)
{
bbcSearchInput.Click();
}
//Writing some text to search
bbcSearchInput.SendKeys(textForSearch);
// Click button for starting Search
_driver.FindElement(By.XPath("//button[@id='orb-search-button']")).Click();
var textInCurrentSearchLine = _driver.FindElement(By.XPath("//input")).GetAttribute("value");
var firstUrl = _driver.Url;
//Click first link
_driver.FindElement(By.XPath("//a[@class='css-vh7bxp-PromoLink e1f5wbog6'][1]")).Click();
var urlOfNewPage = _driver.Url;
}
}
И вызвать это
Test t = new Test();
t.TestDrivers();
Thread.Sleep(30000);// Можно любое число поставить;)
В коде который вы выслали у вас два раза инициализируется браузер
public class ChromeInitialization
{
private static ChromeDriver _classObject;
private ChromeInitialization() { }
public static ChromeDriver Instanse
{
get
{
if (_classObject == null)
_classObject = new ChromeDriver();
return _classObject;
}
}
}
Вот так попробуйте.
В общем исходя из всех советов реализовал по другому классы по инициализации драйвера. Вот так получилось насколько я понимаю паттерн Singleton остался соблюден так как проверял HashCode у разных объектов класса он одинаковый. Может быть кому то в дальнейшем поможет.
public class ChromeInitialization
{
//- Инициализация браузера — прменить паттерн синглтон для инициализации браузера
private static ChromeDriver _classObject;
private ChromeInitialization() { }
public static ChromeDriver Instanse
{
get
{
if (_classObject == null)
_classObject = new ChromeDriver();
return _classObject;
}
}
}