Запуск тестов Selenium в нескольких браузерах один за другим с С# NUnit
Я ищу рекомендуемый/самый лучший способ, чтобы тесты Selenium выполнялись в нескольких браузерах один за другим. Веб-сайт, который я тестирую, невелик, поэтому мне еще не требуется параллельное решение.
У меня есть обычные методы настройки теста с [SetUp]
, [TearDown]
и [Test]
. Конечно, SetUp создает экземпляр нового объекта ISelenium
с любым браузером, с которым я хочу протестировать.
Итак, что я хочу сделать, это программно сказать: этот тест будет запускаться в браузерах Chrome, IE и Firefox. Как это сделать?
EDIT:
Это может немного помочь. Мы используем CruiseControl.NET для запуска тестов NUnit после успешной сборки. Есть ли способ передать параметр в исполняемый файл NUnit, а затем использовать этот параметр в тесте? Таким образом, мы могли бы запускать NUnit несколько раз с разными параметрами браузера.
Ответы
Ответ 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>
Ответ 6
Это помогло мне решить аналогичную проблему
Как запустить набор тестов nUnit с двумя разными настройками?
Просто установите различные браузеры в методе настройки:]
Ответ 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 для создания повторяющихся тестовых классов для каждого браузера - по существу, автоматизацию копирования и - отладка тестов для каждого браузера.