2016-04-21 3 views
0

Я много читал об этой проблеме, но я не могу найти ответ для своего дела.Как реализовать метод выхода из другого класса?

У меня есть класс с методом Селена

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(); 
} 

... остальным кодом.

Я сделал интерфейс для этого класса

public interface Tools { 
public Narzedzia getNarzedzia(); 
} 

«Narzedzia» является классом с группой методов, которые я использую, как инструменты для Aplication.

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; 
     } 
     } 

... остальное код

Когда я запускаю тестовый метод остальное од в "Narzedzia" работает нормально, но выход из системы ошибка броска: java.lang.NullPointerException

+1

Где находится NPE? Это ваш WebDriver? Не удается вызвать вызванный вами метод setUp. – Maze

+0

NPE вбрасывание линии getNarzedzia(). Logout(); Теперь я буду отмечать эту строку. Alse Я думаю, что драйвер в методе выхода пуст, но у меня нет идеи, как я могу решить эту проблему. –

+0

Если вы вызываете 'getNarzedzia(). Logout();' возвращается новый объект (также новый WebDriver, который не инициализирован). Исправьте меня, если я ошибаюсь, но я думаю, что вы хотите реализовать какой-то шаблон Singleton, но он не должен доставлять новый объект. Пожалуйста, взгляните на Singleton. – Maze

ответ

0

Я решил проблему.

Сделано конструктор с параметром в классе "Narzedzia"

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

И вызывать конструктор как это в PrzesylkiPrzygorowane

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

Тест выполняется и выход из системы не выбрасывает NPE.

+1

Помните, что это не Синглтон. Вы создаете новый объект для каждого вызова 'getNarzedzia()'. Это не очень эффективно, и если ваш класс получает больше полей, а только WebDriver, вы должны изменить свой конструктор. Возможно, это не лучшее решение. – Maze

+0

Я буду помнить совет yout, и я постараюсь улучшить код, когда мое умение будет выше :) –

0

С помощью Google вы должны найти много советов по внедрению Singleton в Java. Это должно быть что-то вроде этого:

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; 
    } 
} 

Источник: Design Pattern - Singleton Pattern (мой первый результат поиска с Google "одноплодной шаблон в Java)

В основном Конструктор должен быть частным и ваш метод получения должен возвращать которое удерживает объект. На сайтах учебников есть несколько вариантов. Некоторые из них являются потокобезопасными. Выберите то, что вам нужно.

Смежные вопросы