Запускать тесты Selenium в нескольких браузерах один за другим из C # NUnit - PullRequest
30 голосов
/ 17 февраля 2011

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

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

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

РЕДАКТИРОВАТЬ:

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

Ответы [ 8 ]

50 голосов
/ 22 октября 2011

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();
        }
    }
}
5 голосов
/ 02 октября 2013

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

5 голосов
/ 18 февраля 2011

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

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

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

3 голосов
/ 19 июля 2012

Я использую список драйверов 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 основных браузера, выполняющих тесты «бок о бок»

1 голос
/ 11 марта 2014

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

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

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

@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);
}

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

1 голос
/ 22 июня 2011

Это помогло мне решить подобную проблему Как запустить набор тестов nUnit с двумя разными настройками?

Просто установите разные браузеры в методе установки:]

1 голос
/ 18 февраля 2011

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

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

РЕДАКТИРОВАТЬ:

Потратил еще немного времени на это.Решение, которое я придумал, состоит в том, чтобы иметь текстовый файл в решении, в котором указан браузер, который будет использоваться для тестирования.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>
0 голосов
/ 17 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...