Je cherche le moyen recommandé/le plus agréable de faire exécuter des tests de sélénium dans plusieurs navigateurs l'une après l'autre. Le site Web que je teste n'est pas grand, alors je n'ai pas encore besoin d'une solution parallèle.
J'ai les méthodes d'installation de test habituelles avec [SetUp]
, [TearDown]
, et [Test]
. Bien sûr, la configuration instancite d'un nouvel objet ISelenium
avec tout navigateur que je veux tester.
Donc, ce que je veux faire est de dire par programme: ce test sera exécuté sur Chrome, c'est-à-dire et Firefox en séquence. Comment je fais ça?
ÉDITER:
Cela pourrait aider un peu. Nous utilisons Cruisecontrol.net pour lancer les tests de Nunit après une construction réussie. Y a-t-il un moyen de transmettre un paramètre à l'exécutable Nunit, puis utilisez ce paramètre dans le test? De cette façon, nous pourrions avoir une nunit à plusieurs reprises avec différents paramètres de navigateur.
Nunit 2.5+ prend désormais en charge les appareils de test génériques qui effectuent des tests dans plusieurs navigateurs très simples. http://www.nunit.org/index.php?p=testfixture&r=2.5
L'exécution de l'exemple suivant exécutera deux fois la googletest deux fois, une fois dans Firefox et une fois dans 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();
}
}
}
C'est une question récurrente et est résolu quelques façons:
La méthode d'usine produit votre objet Iselenium - vous avez une classe d'assistance avec une méthode Static Geselenium. Cette méthode se lit sous une configuration externe, qui contient une propriété qui définit le navigateur que vous souhaitez comme une chaîne. Dans votre getelenium, vous configurez ensuite le navigateur en conséquence. Voici un article pratique sur l'utilisation de fichiers de configuration avec Nunit http://blog.coryfoy.com/2005/08/nunit-app-config-files-its-all-About-the-nunit-file/ Englisons
D'autres ont du succès avec l'injection du navigateur via un conteneur IOC. J'aime vraiment ça parce que Testong fonctionne très bien avec Guice in Java Land, mais je ne suis pas sûr de la facilité de mélanger Nunit et Ninject, mef, etc ...
Ceci est essentiellement juste une expansion de la réponse d'Alanning (21 octobre à 20h20). Mon cas était similaire, juste que je ne voulais pas courir avec le constructeur sans paramètre (et utilisez ainsi le chemin d'accès par défaut sur les exécutables du pilote). J'ai eu un dossier séparé contenant les pilotes que je voulais tester contre, et cela semble bien fonctionner:
[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
}
}
}
J'utilise une liste de pilotes iWeb pour effectuer des tests sur tous les navigateurs, ligne par ligne:
[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"));
}
..Où j'écris mes propres méthodes WaitforElementyLinkText et AssertisAltTrue pour effectuer l'opération pour chaque pilote, et où quelque chose échoue, pour sortir un message qui m'aider à identifier quel (s) navigateur peut-il avoir échoué:
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));
}
L'IEDRIVER est douloureusement lent mais cela aura 3 des principaux navigateurs en cours d'exécution des tests "côte à côte"
Cela m'a aidé à résoudre des problèmes similaires Comment exécuter un ensemble de tests de Nunit avec deux configurations différentes?
Il suffit de définir différents navigateurs dans la méthode de configuration:]
OK, une solution consiste à avoir des tests d'emballage qui configurent l'objet Iselenium avec différents navigateurs. Ensuite, ils transmettent cet objet à tous les autres tests qui l'utilisent au lieu de mettre en place un nouveau comme ils l'ont fait auparavant.
L'inconvénient est que je me retrouve avec un gros test pour chaque navigateur. Pas la meilleure solution non plus. Toujours à la recherche...
ÉDITER:
Passé plus de temps à ce sujet. La solution que j'ai proposée est d'avoir un fichier texte dans la solution qui spécifie le navigateur à utiliser pour les tests. Nunit reprend le paramètre lors de l'instanciation d'un objet sélénium.
J'utilise Cruisecontrol.net pour exécuter des constructions et des tests automatiques. Et au lieu de simplement exécuter le test une fois, je l'ai configuré pour les exécuter deux fois. Mais avant chaque test, je gère une commande de ligne de commande qui modifie le navigateur dans le fichier texte de configuration.
<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>
Je m'interrogeais sur le même problème et finalement i obtenu une solution
Ainsi, lorsque vous installez le plug-in, vous pouvez alors contrôler le navigateur que le scénario doit être testé.
Exemple de caractéristique:
@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 |
Mise en œuvre
[Given(@"I have entered '(.*)' into the commentbox")]
public void GivenIHaveEnteredIntoTheCommentbox(string p0)
{
Browser.Current.FindElement(By.Id("comments")).SendKeys(p0);
}
Là doit être un meilleur moyen, mais vous pouvez utiliser Modèles T4 pour générer des classes de test en double pour chaque navigateur - essentiellement automatisé un Copier et coller des tests pour chaque navigateur.