Mehrere Methoden in einer Klasse testen

Avalon

Bekanntes Mitglied
Hallo, ich teste den Login auf eine Website.Dafür habe ich eine Klasse mit vier Methoden (Passwort, Benutzername richtig/PW falsch, Benutzer richtig/umgekehrt und beides falsch. Alles mit dem Chromium Webdriver, Junit5 in Eclipse.

Java:
public class LoginTest {

@Before
//...

@After
//...

@Test1
//..

@Test2
//..

}

Wenn ich in Eclipse jede Methode einzeln teste, funktioniert das auch. Aber wenn ich die ganze Klasse mit allen Methoden testen will, funktioniert nur der Erste Test, die anderen schlagen fehl. Hat jemand eine Ahnung, woran das liegen könnte. Jeden Test in eine eigene Klasse auslagen, hat auch nicht funktioniert. Einer geht durch, die anderen schlagen fehl. Im Netz hab ich nichts gefunden, womit ich was anfangen kamnn.
 
Beste Antwort
Java:
        System.setProperty("webdriver.chrome.driver","/project/src/test/resources/ChromeDriver/chromedriver.exe");
Das löschen, dann dürfte es klappen. Der Befehl, muss wenn vor chromeDriver.start() - und vermutlich ist der Pfad falsch, so dass der zweite Test dann den Chromedriver nicht mehr findet.
Java:
public class LoginTest {
    
    private WebDriver driver;
    private Map<String, Object> vars;
    JavascriptExecutor js;

    @Before
    public void setUp() {
//        ChromeOptions options = new ChromeOptions();
//        options.addArguments("--headless");
        driver = new ChromeDriver();
        js = (JavascriptExecutor) driver;
        vars = new HashMap<String, Object>();
    }

    @After
    public void tearDown() {
        driver.quit();
    }

    @Test
    public void TestLogin() {
        System.setProperty("webdriver.chrome.driver","/project/src/test/resources/ChromeDriver/chromedriver.exe");
        driver.get("https://www.testpage.com/KontoLogin.jsp");
        driver.manage().window().setSize(new Dimension(1054, 812));
        js.executeScript("window.scrollTo(0,0)");
        driver.findElement(By.id("username")).click();
        driver.findElement(By.id("username")).sendKeys("username");
        driver.findElement(By.id("password")).sendKeys("pw");
        driver.findElement(By.cssSelector("a:nth-child(8) > img")).click();
        driver.findElement(By.cssSelector("span")).click();
                
        WebElement foo = driver.findElement(By.partialLinkText("Datenschutz"));
        
        assertEquals("Datenschutz", foo.getText());
        
    }
    
    @Test
    public void TestLoginPasswortFalsch() {
        System.setProperty("webdriver.chrome.driver","/project/src/test/resources/ChromeDriver/chromedriver.exe");
        driver.get("https://www.testpage.com/KontoLogin.jsp");
        driver.manage().window().setSize(new Dimension(1054, 812));
        js.executeScript("window.scrollTo(0,0)");
        driver.findElement(By.id("username")).click();
        driver.findElement(By.id("username")).sendKeys("username");
        driver.findElement(By.id("password")).sendKeys("pw");
        driver.findElement(By.cssSelector("a:nth-child(8) > img")).click();
        driver.findElement(By.cssSelector("span")).click();
                        
        boolean foo = driver.getPageSource().contains("Datenschutz");

        assertFalse(foo);   
    }
 
Also doch nen Token. Und was funktioniert jetzt nicht wie es funktionieren sollte?

Btw das ist ein Integrationstest den du da machst.
 
Und was funktioniert jetzt nicht wie es funktionieren sollte?
Wenn ich jede Methode einzeln Teste (rechtsklick auf Methodenname, run as, junit) funktioniert es (für jede Methode). Ein Chromefenster poppt auf, Daten werden in die Felder übertragen, es wird geprüft, das Fenster schließt sich wieder und alles passt. Mach ich das gleiche mit der Klasse (so das alle Methodentests hintereinander ablaufen, läuft nur die erste Methode durch. Die restlichen schlagen fehl.
 
Java:
        System.setProperty("webdriver.chrome.driver","/project/src/test/resources/ChromeDriver/chromedriver.exe");
Das löschen, dann dürfte es klappen. Der Befehl, muss wenn vor chromeDriver.start() - und vermutlich ist der Pfad falsch, so dass der zweite Test dann den Chromedriver nicht mehr findet.
 
Beste Antwort
Kann es sein, dass der ChromeDriver so dicht beieinander immer die gleiche Umgebung nutzt? Der neue ChromeDriver wird zwar erstellt, aber er hat die Session immer noch.

Ich würde da mal driver.manage().deleteAllCookies() nach der Erstellung der ChromeDriver Instanz aufrufen.

sprich: nach der Anmeldung bist du angemeldet. Die fehlgeschlagene Anmeldung kannst du dann nicht mehr testen ...

Das aber nur als Idee, ich habe da keine Praxis Erfahrungen mit.

Edit: das von Limdul hört sich deutlich sinnvoller an ... das von mir wird eher nicht das Problem sein ...
 
Java:
        System.setProperty("webdriver.chrome.driver","/project/src/test/resources/ChromeDriver/chromedriver.exe");
Das löschen, dann dürfte es klappen. Der Befehl, muss wenn vor chromeDriver.start() - und vermutlich ist der Pfad falsch, so dass der zweite Test dann den Chromedriver nicht mehr findet.
Das löschen der Zeile war die Lösung. Der Treiber wird in Path der Windows Umgebungsvariablen gesucht. Also für Windows funktioniert das so. Ich denke mal die Angabe des Pfades in
Java:
System.setProperty
, wird dann für Linux nötig sein.

Danke
 
Dann aber mit dem richtigen Pfad - da das eine System-Property ist, muss dort der absolute Pfad rein. Wenn du den richtigen einträgst, dürfte es auch klappen - aber dann halt wirklich mit Laufwerk & kompletter Pfad.
 
Muss der Pfad auch absolut sein, wenn ich die chromedriver.exe einem Ordner des Projektes habe? Ich hab generell das Problem, wie ich alle benötigten Dateien in das Projekt direkt reinbekomme (z.B. beim Export in eine ZIP Datei). Jedes mal wenn ich das Projekt zu Hause in mein Eclipse importiere, muss ich mir diverse Dateien aus dem Netz nachladen, weil sie nicht auf meinem Rechner sind. Z.B die chromdriver.exe.
 
Zuletzt bearbeitet:
Vermutlich. Es ist eine System-Property. Also erwartet der ChromeDriver vermutlich den absoluten Pfad. So wie er da steht, ist er auf jeden Fall falsch - weil er mit / anfängt und damit entweder absolut ist oder eine Resource bezeichnet - dann ist er aber auch falsch. Dann müsste er /ChromeDriver/chromedriver.exe heißen. Evtl. würde er ohne / am Anfang gehen, aber im Zweifelsfall da mal in die Doku schauen.

Edit: Aus der Doku würde ich sagen - Absoluter Pfad.
 
Vermutlich. Es ist eine System-Property. Also erwartet der ChromeDriver vermutlich den absoluten Pfad. So wie er da steht, ist er auf jeden Fall falsch - weil er mit / anfängt und damit entweder absolut ist oder eine Resource bezeichnet - dann ist er aber auch falsch. Dann müsste er /ChromeDriver/chromedriver.exe heißen. Evtl. würde er ohne / am Anfang gehen, aber im Zweifelsfall da mal in die Doku schauen.

Edit: Aus der Doku würde ich sagen - Absoluter Pfad.

Im Beispiel haben die einen relativen Pfad angegeben


Java:
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.*;
import org.junit.Test;

public class GettingStarted {
  @Test
  public void testGoogleSearch() throws InterruptedException {
    // Optional. If not specified, WebDriver searches the PATH for chromedriver.
    System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

    WebDriver driver = new ChromeDriver();
    driver.get("http://www.google.com/");
    Thread.sleep(5000);  // Let the user actually see something!
    WebElement searchBox = driver.findElement(By.name("q"));
    searchBox.sendKeys("ChromeDriver");
    searchBox.submit();
    Thread.sleep(5000);  // Let the user actually see something!
    driver.quit();
  }
}
 
Wo ist das ein relativer Pfad? Der Pfad fängt mit einem / an und ist damit ein typischer absoluter Pfad unter Unix und Unix artigen Systemen.
 
Der Pfad ist absolut - der fängt mit / an und kennzeichnet in der Regel absolute Pfade und da ist nirgendwo Projekt-Relativ erwähnt. Außerdem ist das nur ein Beispiel.
 
Laufwerksbuchstaben gibts nur unter Windows 🙂
Da stamme ich her. Windows 3.1 war mein erstes. :-D Linux hatte ich zu Zeiten, in denen man alle Partitionen noch selber anlegen musste, um es zu installieren. Danach immer mal wieder probiert und doch wieder bei Windows gelandet. Aber die Gründe bei Windows zu bleiben, werden immer weniger. Ich glaub es ist eigentlich nur noch Faulheit zu wechseln. :-D
 

Zurück
Oben