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.
Author: Edgar, 2011-02-17

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();
        }
    }
}
 50
Author: alanning,
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:

  1. 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/

  2. 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...

 5
Author: pnewhook,
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
    }
}

}

 5
Author: Arve Systad,
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"

 3
Author: DevDave,
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>
 1
Author: Edgar,
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:]

 1
Author: slawek,
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);
}

Więcej informacji

 1
Author: Volodymyr Bilyachat,
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.

 0
Author: Massif,
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