2016-04-21 7 views
0

Ich lese viel über dieses Problem, aber ich kann keine Antwort für meinen Fall finden.Wie implementieren Sie Methodenabmeldung von einer anderen Klasse?

Ich habe Klasse mit Selen Methode

public class PrzesylkiPrzygotowane implements Tools{ 
private WebDriver driver; 
private StringBuffer verificationErrors = new StringBuffer(); 

//Override 
public Narzedzia getNarzedzia() { 
    return new Narzedzia(); 
    } 

public void setUp() throws Exception { 
    StartEN start = new StartEN(GetParams.getUser(), 
      GetParams.getPassword()); 
    this.driver = start.getDriver(); 
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
} 

@Test 
public void testPrzesylkiPrzygotowane() throws Exception { 
setUp(); 
driver.findElement(By.cssSelector("a[href*='?action=GetZbior&arg1=220170'")).click(); 
driver.findElement(By.cssSelector("button.widgetButton")).click(); 
driver.findElement(By.id("nazwa")).clear(); 
Thread.sleep(1000); 
driver.findElement(By.id("nazwa")).sendKeys("Mar"); 
driver.findElement(By.xpath("//body[@id='Body']/div[4]/ul/li/strong[3]")).click(); 
driver.findElement(By.id("submit_button")).click(); 
Thread.sleep(1000); 
//NPE throw here  
getNarzedzia().logout(); 
} 

... Code Ruhe.

I-Schnittstelle für diese Klasse

public interface Tools { 
public Narzedzia getNarzedzia(); 
} 

„Narzedzia“ ist eine Klasse mit einer Gruppe von Verfahren hergestellt, die ich wie Werkzeuge für aplication verwenden.

public class Narzedzia{ 

public WebDriver driver; 
boolean acceptNextAlert = true; 

public void logout() throws InterruptedException{ 
     //Ustawienia driv = new Ustawienia(); 
     driver.findElement(By.linkText("Wyloguj")).click(); 
     Thread.sleep(1000); 
     assertTrue(closeAlertAndGetItsText(driver).matches("^Czy na pewno chcesz wyjść z Elektronicznego Nadawcy[\\s\\S] Sprawdź czy wszystkie dane zostały przekazane do placówki\\.$")); 
     driver.close(); 
    } 
    public String closeAlertAndGetItsText(WebDriver driv) { 
     try { 
      Alert alert = driv.switchTo().alert(); 
      String alertText = alert.getText(); 
      if (acceptNextAlert) { 
      alert.accept(); 
      } else { 
      alert.dismiss(); 
      } 
      return alertText; 
     } finally { 
      acceptNextAlert = true; 
     } 
     } 

... rest Code

Wenn ich Test Rest od Methode in "Narzedzia" laufen funktioniert gut, aber abzumelden Wurf Fehler: java.lang.NullPointerException

+1

Wohin wird die NPE geworfen? Ist es dein WebDriver? Die aufgerufene setUp-Methode kann nicht aufgerufen werden. – Maze

+0

NPE in Zeile werfen getNarzedzia(). Logout(); Ich werde diese Linie jetzt markieren. Alse Ich denke, dass Treiber in Logout-Methode leer ist, aber ich habe keine Ahnung, wie ich dieses Problem lösen kann. –

+0

Wenn Sie 'getNarzedzia() .logout() aufrufen, wird ein neues Objekt zurückgegeben (auch ein neuer WebDriver, der nicht initialisiert wird). Korrigiere mich, wenn ich falsch liege, aber ich denke, du möchtest ein Singleton-Muster implementieren, aber es darf kein neues Objekt liefern. Bitte werfen Sie einen Blick auf den Singleton. – Maze

Antwort

0

Ich löste Problem.

Hergestellt Konstruktor mit Parameter in "Narzedzia" Klasse

public Narzedzia (WebDriver wd){ 
    this.driver = wd; 
} 

Und Konstruktor wie diese rufen in PrzesylkiPrzygorowane

public Narzedzia getNarzedzia() { 
     return new Narzedzia(this.driver); 
     } 

-Test durchgeführt wird und Abmelde NPE nicht werfen.

+1

Denken Sie daran, dies ist kein Singleton. Sie erstellen ein neues Objekt bei jedem Aufruf von 'getNarzedzia()'. Es ist nicht sehr effizient und wenn Ihre Klasse mehr Felder als nur einen WebDriver bekommt, müssen Sie Ihren Konstruktor ändern. Könnte nicht die beste Lösung sein. – Maze

+0

Ich werde mich an deinen Rat erinnern, und ich werde versuchen, Code zu verbessern, wenn meine Fähigkeiten höher sein werden :) –

0

Mit Google sollten Sie finde viele Hinweise zur Implementierung eines Singleton in Java. Es sollte wie folgt sein:

public class SingleObject { 

    //create an object of SingleObject 
    private static SingleObject instance = new SingleObject(); 

    //make the constructor private so that this class cannot be 
    //instantiated 
    private SingleObject(){} 

    //Get the only object available 
    public static SingleObject getInstance(){ 
     return instance; 
    } 
} 

Quelle: Design Pattern - Singleton Pattern (mein erstes Suchergebnis mit Google ‚Singletonmuster java‘)

Grundsätzlich ist der Konstruktor hat private und Ihre Getter-Methode zu sein, muss ein zurück Feld, das das Objekt enthält. Es gibt einige Varianten um die Tutorial-Seiten. Einige von ihnen sind Thread-sicher. Wählen Sie, was Sie brauchen.

Verwandte Themen