Pourquoi mes tests échouent lors de l'exécuter ensemble, mais passer individuellement?
Quand j'écris un test dans Visual Studio, j'ai vérifier qu'il fonctionne par l'épargne, de la construction puis de l'exécution de l'essai dans Nunit (clic droit sur le test, puis exécuter).
Le test fonctionne yay...
j'ai donc passer à la suite...
Maintenant, j'ai écrit un autre test et cela fonctionne comme je l'ai sauvé et l'a testé, comme ci-dessus. Mais, elles ne fonctionnent pas lorsqu'ils sont exécutés ensemble.
Voici mes deux tests qui fonctionnent quand exécuter en tant qu'individus, mais ne parviennent pas quand courir ensemble:
using System;
using NUnit.Framework;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;
namespace Fixtures.Users.Page1
{
[TestFixture]
public class AdminNavigateToPage1 : SeleniumTestBase
{
[Test]
public void AdminNavigateToPage1()
{
NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
NavigateTo<Page1>();
var headerelement = Driver.FindElement(By.ClassName("header"));
Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
}
[Test]
public void AdminNavigateToPage1ViaMenu()
{
NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
Driver.FindElement(By.Id("menuitem1")).Click();
Driver.FindElement(By.Id("submenuitem4")).Click();
var headerelement = Driver.FindElement(By.ClassName("header"));
Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
}
}
}
Lors de la deuxième test échoue parce qu'ils ont été exécutés ensemble
Nunit présente:
Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesviamenu:
OpenQA.Le sélénium.NoSuchElementException : L'élément n'a pas pu être trouvé
Et cette ligne est mise en surbrillance:
var headerelement = Driver.FindElement(By.ClassName("header"));
Personne ne sait pourquoi mon code ne fonctionne pas lorsqu'il est exécuté ensemble, mais passe lorsque vous exécutez seul?
Toute réponse serait grandement apprécié!
- Êtes-vous sûr que les tests ne sont pas l'état de partage? Le navigateur de fermer et ré-ouvrir entre les tests? Le test qui échoue lorsqu'ils sont exécutés ensemble? Faire les DEUX échouent, ou fait une passe, et un échec?
- Le navigateur se ferme en bas de la fenêtre de commande.. ils rouvrir de nouveau, le processus de test suivant... c'est le premier test qui passent alors tous les tests suivants ne parviennent généralement pas et ils ont toujours échouer pour la même raison expliquée ci-dessus.
- N'aide pas votre question, mais découvrez ncrunch.net, il exécute vos tests en arrière-plan. Se débarrasser de l'ensemble "de l'épargne, de la construction puis de l'exécution de l'essai" de tracas.
- C'est ce qui m'arrive tout le temps (mais avec une autre erreur), bien que mine de frapper une base de données et l'exécution de chaque test dans une transaction.. je obtenir non thread-safe exceptions donc, lors de l'exécution par le biais de Visual Studio, le test suivant doit commencer avant que le test précédent a fini (en exécutant la ligne de commande ne semble pas avoir le même problème)
Vous devez vous connecter pour publier un commentaire.
Deux choses que vous pouvez essayer
Introduire un léger retard entre ces deux lignes par Thread.Sommeil
Pilote.FindElement(Par.Id("submenuitem4")).Cliquez sur();
var headerelement = Pilote.FindElement(Par.ClassName("header"));
Une telle situation se produit normalement lorsque les tests unitaires de l'utilisation partagée des ressources/données d'une certaine façon.
regarder dans le TestFixtureSetup, Le programme d'installation, TestFixtureTearDown et Démontage.
Ces attributs vous permettent de configurer le testenvironment une fois, au lieu d'une fois par test.
NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
à un TestFixtureSetup?var headerelement...
ligne est mise en surbrillance, c'est probablement la ligne avant que est en train de lancer une exception. Assurez-vous que submenuitem4 existe. Avez-vous essayé de déboguer? (Clic droit de votre test, choisissez Test Avec -> Débogueur)Sans savoir comment le Sélénium travaille, mon pari est sur
Driver
qui semble être une classe statique si les 2 tests sont le partage de l'état. Un exemple d'un état partagé estDriver.Url
. Parce que les tests sont exécutés en parallèle, il est une condition de concurrence pour définir l'état de cet objet.Cela dit, je n'ai pas de solution pour vous 🙂
Si aucune des réponses ci-dessus a travaillé pour vous, j'ai résolu ce problème en ajoutant
Thread.Sleep(1)
avant l'affirmation dans le test en échec...Ressemble à des tests de synchronisation est oubliée quelque part... s'il vous Plaît noter que mes tests ne sont pas d'ordre de personne à charge, que je n'ai pas tout membre statique ni dépendance externe.
Êtes-vous sûr qu'après l'exécution de l'un des tests de la méthode
est de prendre votre retour à l'endroit où vous devriez être? Il avait l'impression que le manquement est dû à une mauvaise navigation handler (en supposant que l'élément d'en-tête est présent et a trouvé dans les deux tests).
Je pense que vous devez vous assurer, que vous pouvez vous connecter pour le deuxième test, il peut échouer, parce que vous êtes déjà connecté?
-> mettre de l'ouverture de session dans un configurer la méthode ou (car il semble que vous utilisez le même utilisateur pour les deux tests), même jusqu'à la la configuration de la fixture
-> la fermeture de session (si nécessaire) peut être mis dans le démolir la méthode
Si il y a des retards dans les DOM au lieu d'un thread.le sommeil, je recommande d'utiliser webdriver.attendre en combinaison avec des conditions. Le sommeil peut fonctionner à 80% et dans d'autres non. L'attente des sondages jusqu'à ce qu'un délai est atteint ce qui est plus fiable et aussi lisible. Ici un exemple de la façon dont j'ai l'habitude de cette approche: