Uruchamianie testów Selenium w wielu przeglądarkach jeden po drugim z C# NUnit
Szukam zalecanego / najładniejszego sposobu na wykonanie testów Selenium w kilku przeglądarkach jedna po drugiej. Strona, którą testuję, nie jest duża, więc nie potrzebuję jeszcze równoległego rozwiązania.
Mam zwykłe metody konfiguracji testów z [SetUp]
, [TearDown]
, i [Test]
. Konfiguracja, oczywiście, tworzy nowy obiekt ISelenium
z dowolną przeglądarką, z którą chcę przetestować.
Chcę więc programowo powiedzieć: ten test będzie uruchamiany kolejno na Chrome, IE i Firefoksie. Jak mam to zrobić?
EDIT:
To może trochę pomóc. Używamy CruiseControl.NET aby rozpocząć testy NUnit po pomyślnym zbudowaniu. Czy jest jakiś sposób, aby przekazać parametr do pliku wykonywalnego NUnit, a następnie użyć tego parametru w teście? W ten sposób możemy uruchomić NUnit kilka razy z różnymi parametrami przeglądarki.8 answers
NUnit 2.5 + obsługuje teraz ogólne urządzenia testowe, które sprawiają, że testowanie w wielu przeglądarkach jest bardzo proste. http://www.nunit.org/index.php?p=testFixture&r=2.5
Uruchomienie poniższego przykładu spowoduje uruchomienie GoogleTest dwa razy, raz w Firefoksie i raz w IE.
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using System.Threading;
namespace SeleniumTests
{
[TestFixture(typeof(FirefoxDriver))]
[TestFixture(typeof(InternetExplorerDriver))]
public class TestWithMultipleBrowsers<TWebDriver> where TWebDriver : IWebDriver, new()
{
private IWebDriver driver;
[SetUp]
public void CreateDriver () {
this.driver = new TWebDriver();
}
[Test]
public void GoogleTest() {
driver.Navigate().GoToUrl("http://www.google.com/");
IWebElement query = driver.FindElement(By.Name("q"));
query.SendKeys("Bread" + Keys.Enter);
Thread.Sleep(2000);
Assert.AreEqual("bread - Google Search", driver.Title);
driver.Quit();
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-21 20:20:14
Jest to powtarzające się pytanie i rozwiązuje się je na kilka sposobów:
Metoda Factory produkuje Twój obiekt ISelenium - masz klasę pomocniczą ze statyczną metodą getSelenium. Ta metoda odczytuje w jakimś zewnętrznym config, który ma właściwość, która definiuje przeglądarkę jako ciąg znaków. W getSelenium następnie skonfigurować przeglądarkę odpowiednio. oto przydatny post na temat korzystania z plików konfiguracyjnych z NUnit http://blog.coryfoy.com/2005/08/nunit-app-config-files-its-all-about-the-nunit-file/
Inni z powodzeniem wstrzykują przeglądarkę za pośrednictwem kontenera IoC. Bardzo mi się to podoba, ponieważ TestNG działa naprawdę dobrze z Guice w Java land, ale nie jestem pewien, jak łatwo jest mieszać NUnit i Ninject, MEF, itp...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-18 18:19:44
To w zasadzie tylko rozwinięcie odpowiedzi alanninga (paź 21 '11 o 20: 20). Mój przypadek był podobny, tyle że nie chciałem uruchamiać z bez parametru konstruktora (i tym samym używać domyślnej ścieżki do sterowników wykonywalnych). Miałem osobny folder zawierający sterowniki, z którymi chciałem przetestować, i wydaje się to dobrze działać:
[TestFixture(typeof(ChromeDriver))]
[TestFixture(typeof(InternetExplorerDriver))]
public class BrowserTests<TWebDriver> where TWebDriver : IWebDriver, new()
{
private IWebDriver _webDriver;
[SetUp]
public void SetUp()
{
string driversPath = Environment.CurrentDirectory + @"\..\..\..\WebDrivers\";
_webDriver = Activator.CreateInstance(typeof (TWebDriver), new object[] { driversPath }) as IWebDriver;
}
[TearDown]
public void TearDown()
{
_webDriver.Dispose(); // Actively dispose it, doesn't seem to do so itself
}
[Test]
public void Tests()
{
//TestCode
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-02 14:47:17
Używam listy sterowników IWeb do wykonywania testów na wszystkich przeglądarkach, linia po linii:
[ClassInitialize]
public static void ClassInitialize(TestContext context) {
drivers = new List<IWebDriver>();
firefoxDriver = new FirefoxDriver();
chromeDriver = new ChromeDriver(path);
ieDriver = new InternetExplorerDriver(path);
drivers.Add(firefoxDriver);
drivers.Add(chromeDriver);
drivers.Add(ieDriver);
baseURL = "http://localhost:4444/";
}
[ClassCleanup]
public static void ClassCleanup() {
drivers.ForEach(x => x.Quit());
}
..and then am able to write tests like this:
[TestMethod]
public void LinkClick() {
WaitForElementByLinkText("Link");
drivers.ForEach(x => x.FindElement(By.LinkText("Link")).Click());
AssertIsAllTrue(x => x.PageSource.Contains("test link"));
}
..gdzie piszę własne metody WaitForElementByLinkText i AssertIsAllTrue do wykonania operacji dla każdego sterownika, a gdzie coś się nie powiedzie, do wypisania komunikatu pomagającego mi zidentyfikować, które przeglądarki mogły się nie udać:
public void WaitForElementByLinkText(string linkText) {
List<string> failedBrowsers = new List<string>();
foreach (IWebDriver driver in drivers) {
try {
WebDriverWait wait = new WebDriverWait(clock, driver, TimeSpan.FromSeconds(5), TimeSpan.FromMilliseconds(250));
wait.Until((d) => { return d.FindElement(By.LinkText(linkText)).Displayed; });
} catch (TimeoutException) {
failedBrowsers.Add(driver.GetType().Name + " Link text: " + linkText);
}
}
Assert.IsTrue(failedBrowsers.Count == 0, "Failed browsers: " + string.Join(", ", failedBrowsers));
}
IEDriver jest boleśnie wolny, ale będzie miał 3 główne przeglądarki uruchamiające testy "obok siebie"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 10:22:12
Ok, jednym z rozwiązań jest testowanie wrapperów, które ustawiają obiekt ISelenium w różnych przeglądarkach. Następnie przechodzą ten obiekt do wszystkich innych testów, które używają go zamiast zakładania nowego samodzielnie, jak to zrobili wcześniej.
Wadą jest to, że kończę z jednym dużym testem dla każdej przeglądarki. To też nie jest najlepsze rozwiązanie. Wciąż szukam...
EDIT:
Spędziłem nad tym więcej czasu. Rozwiązanie, które wymyśliłem, to mieć w rozwiązaniu plik tekstowy, który określa przeglądarkę używaną do testowania. NUnit pobiera ustawienie podczas tworzenia instancji obiektu Selenium.Używam CruiseControl.NET uruchamianie automatycznych kompilacji i testów. I zamiast po prostu uruchomić test raz, skonfigurowałem go, aby uruchomić je dwa razy. Ale przed każdym testem uruchamiam polecenie z linii poleceń, które zmienia przeglądarkę w pliku tekstowym konfiguracji.
<exec>
<executable>cmd</executable>
<buildArgs>/C echo firefox C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe > F:\...\selenium_browser.txt</buildArgs>
</exec>
<exec>
<executable>F:\...\NUnit 2.5.7\bin\net-2.0\nunit-console.exe</executable>
<baseDirectory>F:\...\bin\Debug</baseDirectory>
<buildArgs>F:\...\...nunit /xml:"F:\CCXmlLog\Project\nunit-results.xml" /noshadow</buildArgs>
<successExitCodes>0</successExitCodes>
<buildTimeoutSeconds>1200</buildTimeoutSeconds>
</exec>
<exec>
<executable>cmd</executable>
<buildArgs>/C echo googlechrome C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe > F:\...\selenium_browser.txt</buildArgs>
</exec>
<exec>
<executable>F:\...\NUnit 2.5.7\bin\net-2.0\nunit-console.exe</executable>
<baseDirectory>F:\...\bin\Debug</baseDirectory>
<buildArgs>F:\...\...nunit /xml:"F:\CCXmlLog\Project\nunit-results.xml" /noshadow</buildArgs>
<successExitCodes>0</successExitCodes>
<buildTimeoutSeconds>1200</buildTimeoutSeconds>
</exec>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-15 09:32:30
To pomogło mi rozwiązać podobny problem Jak uruchomić zestaw testów nUnit z dwoma różnymi ustawieniami?
Wystarczy ustawić różne przeglądarki w metodzie setup:]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:35
Zastanawiałem się nad tym samym problemem i w końcu znalazłem rozwiązanie
Więc po zainstalowaniu pluginu możesz kontrolować w jakiej przeglądarce ma być testowana.
Przykład funkcji:
@Browser:IE
@Browser:Chrome
Scenario Outline: Add Two Numbers
Given I navigated to /
And I have entered <SummandOne> into summandOne calculator
And I have entered <SummandTwo> into summandTwo calculator
When I press add
Then the result should be <Result> on the screen
Scenarios:
| SummandOne | SummandTwo | Result |
| 50 | 70 | 120 |
| 1 | 10 | 11 |
Realizacja
[Given(@"I have entered '(.*)' into the commentbox")]
public void GivenIHaveEnteredIntoTheCommentbox(string p0)
{
Browser.Current.FindElement(By.Id("comments")).SendKeys(p0);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-11 08:31:40
Tam musi być lepszym sposobem, ale możesz użyć szablonów T4 do wygenerowania zduplikowanych klas testowych dla każdej przeglądarki - zasadniczo automatyzując kopiowanie i wklejanie testów dla każdej przeglądarki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 12:41:04