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

Запуск тестов Selenium в нескольких браузерах один за другим с С# NUnit

Я ищу рекомендуемый/самый лучший способ, чтобы тесты Selenium выполнялись в нескольких браузерах один за другим. Веб-сайт, который я тестирую, невелик, поэтому мне еще не требуется параллельное решение.

У меня есть обычные методы настройки теста с [SetUp], [TearDown] и [Test]. Конечно, SetUp создает экземпляр нового объекта ISelenium с любым браузером, с которым я хочу протестировать.

Итак, что я хочу сделать, это программно сказать: этот тест будет запускаться в браузерах Chrome, IE и Firefox. Как это сделать?

EDIT:

Это может немного помочь. Мы используем CruiseControl.NET для запуска тестов NUnit после успешной сборки. Есть ли способ передать параметр в исполняемый файл NUnit, а затем использовать этот параметр в тесте? Таким образом, мы могли бы запускать NUnit несколько раз с разными параметрами браузера.

4b9b3361

Ответ 1

NUnit 2.5+ теперь поддерживает Generic Test Fixtures, которые делают тестирование в нескольких браузерах очень простым. http://www.nunit.org/index.php?p=testFixture&r=2.5

Запуск следующего примера будет выполнять GoogleTest дважды, один раз в Firefox и один раз в 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();
        }
    }
}

Ответ 2

Это повторяющийся вопрос и решается несколькими способами:

  • Factory метод создает ваш объект ISelenium. У вас есть вспомогательный класс со статическим методом getSelenium. Этот метод читает в некоторой внешней конфигурации, которая имеет свойство, которое определяет браузер, который вы хотите как строку. В вашем getSelenium вы затем соответствующим образом настроите браузер. здесь удобная запись об использовании конфигурационных файлов с NUnit http://blog.coryfoy.com/2005/08/nunit-app-config-files-its-all-about-the-nunit-file/

  • У других есть успех с введением браузера через контейнер IoC. Мне это очень нравится, потому что TestNG отлично работает с Guice на Java, но я не уверен, насколько легко смешивать NUnit и Ninject, MEF и т.д.

Ответ 3

Это в основном просто расширение ответа на аланинг (21 октября 2011 года в 20:20). Мой случай был похож, просто я не хотел запускаться с безпараметровым конструктором (и, таким образом, использовать путь по умолчанию к исполняемым файлам драйвера). У меня была отдельная папка с драйверами, которые я хотел протестировать, и это, похоже, хорошо работает:

[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
    }
}

}

Ответ 4

Я использую список драйверов IWeb для выполнения тестов во всех браузерах, строка за строкой:

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

.. где я пишу свои собственные методы WaitForElementByLinkText и AssertIsAllTrue для выполнения операции для каждого драйвера и где что-то не удается, выводить сообщение, помогающее мне определить, какие браузеры могут быть сбой:

 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 мучительно медленный, но у него будут 3 основных браузера, которые запускают тесты "бок о бок"

Ответ 5

Хорошо, одно решение - иметь тесты оболочки, которые устанавливают объект ISelenium с разными браузерами. Затем они передают этот объект ко всем другим тестам, которые используют его вместо того, чтобы создавать новый, как это было ранее.

Недостатком является то, что я заканчиваю одним большим тестом для каждого браузера. Не лучшее решение. Еще глядя...

EDIT:

Потратил еще немного времени на это. Решение, которое я придумал, - это иметь текстовый файл в решении, который указывает браузер, который будет использоваться для тестирования. NUnit выбирает параметр при создании объекта Selenium.

Я использую CruiseControl.NET для запуска автоматических сборок и тестов. И вместо того, чтобы просто запустить тест один раз, я настроил его для запуска их дважды. Но перед каждым тестом я запускаю команду командной строки, которая меняет браузер в текстовом файле конфигурации.

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

Ответ 7

Мне было интересно узнать о той же проблеме и, наконец, я получил решение

Поэтому, когда вы устанавливаете плагин, вы можете контролировать, в каком браузере должен быть протестирован сценарий.

Пример функции:

@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 |

Реализация

[Given(@"I have entered '(.*)' into the commentbox")]
public void GivenIHaveEnteredIntoTheCommentbox(string p0)
{
            Browser.Current.FindElement(By.Id("comments")).SendKeys(p0);
}

Дополнительная информация

Ответ 8

Должен быть лучший способ, но вы можете использовать T4 templates для создания повторяющихся тестовых классов для каждого браузера - по существу, автоматизацию копирования и - отладка тестов для каждого браузера.