t.me/atinfo_chat Telegram группа по автоматизации тестирования

Проблема запуска теста с @FindBy

Теги: #<Tag:0x00007f748ab131a8> #<Tag:0x00007f748ab12f50>

Пытаюсь освоить FindBy, но вот как то не получается запустить самый простейший тест (просто кликание на кнопку)

public class IncorrectPassword {
private WebDriver driver;

@FindBy(id = "ember128")
private WebElement searchButtonLogIn;

public IncorrectPassword(WebDriver driver) {
    PageFactory.initElements(driver, this);
    this.driver = driver;
}


public void LogIn() {
    searchButtonLogIn.click();
}

@Test
public void run(){
    IncorrectPassword incorrectPassword = new IncorrectPassword(driver);
    driver.get("http://automated-testing.info/login");
    incorrectPassword.LogIn();
}
}
Exception: Test class should have exactly one public zero-argument constructor

А причем тут @FindBy?
Вы бы на трассу посмотрели и/или у гугла спросили, кто вам “фу-фу-фу” делает.

У вас все вместе тестовый class и page class

делите на 2 .
тестовый class

 public class TestOpen{
    private WebDriver driver;
  @BeforeClass
        public void TestOpen(){    
         IncorrectPassword incorrectPassword = new IncorrectPassword(driver);    
        }
    @Test
    public void run(){        
        driver.get("http://automated-testing.info/login");
        incorrectPassword.LogIn();
        }
    }

структура проєкта надеюсь pom файлом задано стандартно .

Класс реализации

public class IncorrectPassword {
private WebDriver driver;

@FindBy(id = "ember128")
private WebElement searchButtonLogIn;

public IncorrectPassword(WebDriver driver) {
    PageFactory.initElements(driver, this);
    this.driver = driver;
}

public void LogIn() {
    searchButtonLogIn.click();
   }
}

Тестовый класс

public class Start {
private WebDriver driver;
private IncorrectPassword incorrectPassword;

@Before
public void before() {
     incorrectPassword = new IncorrectPassword(driver);
}


@Test
public void run() {
    driver.get("http://automated-testing.info");
    incorrectPassword.LogIn();
   }
}

NullPointerException

Наверно из за того что driver не инициализирован, хотя это тоже не помогает

@BeforeClass
2)

класс BaseStart 
 WebDriver driver; 
@BeforeTest(alwaysRun = true);
public void init() {
 driver = new FirefoxDriver();
}
  1. Start extends BaseStart

всё равно NullPointerException

class BaseStart {
private WebDriver driver;

@BeforeTest(alwaysRun = true)
public void init() {
    driver = new FirefoxDriver();
}
@FindBy(id = "ember128")
private WebElement searchButtonLogIn;

public BaseStart(){
    super();
}
public BaseStart(WebDriver driver) {
    PageFactory.initElements(driver, this);
    this.driver = driver;
}

public void LogIn() {
    searchButtonLogIn.click();
   }
}



public class Start extends BaseStart {
private WebDriver driver;
private BaseStart base;

@Test
public void run() {
    base = new BaseStart(driver);
    driver.get("http://automated-testing.info");
    base.LogIn();
   }
}

Переделал и запустилось, изменил драйвер на static в BaseStart

class BaseStart {
 static WebDriver driver;

@BeforeTest(alwaysRun = true)
public void init() {
    driver = new FirefoxDriver();
}
@FindBy(id = "ember1241")
public WebElement searchButtonLogIn;

public BaseStart(){
    super();
}
public BaseStart(WebDriver driver) {
    PageFactory.initElements(driver, this);
    this.driver = driver;
}

public void LogIn() {
    searchButtonLogIn.click();
   }
}

public class Start extends BaseStart {

public BaseStart base;

@Test
public void run() {
    base = new BaseStart(driver);
    driver.get("http://automated-testing.info");
    base.LogIn();
   }
}

А ёё это опять каша .

три класса

1) Page 
public class IncorrectPassword {
  Webdriver driver ;      
@FindBy(id = "ember128")
private WebElement searchButtonLogIn;

public IncorrectPassword(WebDriver driver) {
     this.driver = driver;
    PageFactory.initElements(driver, this);

}

public void LogIn() {
    searchButtonLogIn.click();
   }
}

в ней могут быть токо локаторы и методы работы с локаторами . не должно быть никаких анотаций .
когда Page классов станет много лучше всего вынести в СommonPage

public IncorrectPassword(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);

}
public class Start extends BaseStart {

@Test
public void run() {
     IncorrectPassword incor = new IncorrectPassword(driver) 
    driver.get("http://automated-testing.info");    
    incor.LogIn()    //  методы лучше писать с маленькой буквы 
   }
}
    class BaseStart {
          WebDriver driver;

    @BeforeTest(alwaysRun = true)
    public void init() {
        driver = new FirefoxDriver();
    }
  }