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

Не получается без PageFactory взаимодействовать с элементами страницы через .click()

pageobject
bdd
page-factory
serenity
java
webdriver
Теги: #<Tag:0x00007f9e35dfaec8> #<Tag:0x00007f9e35dface8> #<Tag:0x00007f9e35dfaae0> #<Tag:0x00007f9e35dfa928> #<Tag:0x00007f9e35dfa338> #<Tag:0x00007f9e35df9f28>

(Vlad Zhichkin) #1

Проблема очень похожа как в этой теме 14 года и вот в этом вопросе на стековерфлоу
Создал тестовый проект, цель зайти на сайт mail.ru и отправить письмо.Проблема в том что, при вводе “Имя ящика” и нажатии кнопки “Ввести пароль” не происходит смена поля на “Пароль”. и при попытке ввести пароль тест падает с “Element not available”.
На чистом Selenium действия выполняются успешно, тест не падает.
Пробовал браузер и фаерфокс и хром.
К сожалению в теме от 14 года самый нужный скриншот уже не отображается, поэтому проверить решение от туда не могу.


(Vlad Zhichkin) #2

тест на силениуме, который нормально работает:

  @Test

  public void loginMail() throws InterruptedException {
    WebDriver wd = new FirefoxDriver();

    wd.manage().timeouts().implicitlyWait(60, TimeUnit.NANOSECONDS);
    wd.get("https://mail.ru");

    wd.findElement(By.id("mailbox:login")).clear();
    wd.findElement(By.id("mailbox:login")).sendKeys("login@mail.ru");

    wd.findElement(By.xpath("//label[@id='mailbox:submit']/input")).click();
    Thread.sleep(5000);
    wd.findElement(By.id("mailbox:password")).clear();
    wd.findElement(By.id("mailbox:password")).sendKeys("пароль");

    wd.findElement(By.xpath("//label[@id='mailbox:submit']/input")).click();

    Thread.sleep(5000);
}

(Vlad Zhichkin) #3

тест:

@RunWith(SerenityRunner.class)
public class SendMailWithFileTest {

  @Managed(uniqueSession = true)
  WebDriver browser;

  @Steps
  MailRuSteps mark;

  @Test
  public void shouldBeAbleSendEmail() throws InterruptedException {
    // Given
    mark.isOnTheHomePage();
    mark.entersСredentialsAndLogsIn(); 
  }
}

класс шагов:

public class MailRuSteps {

  MailRuHomePage mailRuHomePage;

  @Step("Открывает в браузере начальную страницу Mail.ru")
  public void isOnTheHomePage() {
    mailRuHomePage.open();
  }

  @Step("Вводит логин и пароль в поля ввода и заходит в почту")
  public void entersСredentialsAndLogsIn () throws InterruptedException {
    mailRuHomePage.login();
  }
}

класс PageObject

@DefaultUrl("https://mail.ru")
public class MailRuHomePage extends PageObject {

  @FindBy(id = "mailbox:login")
  WebElementFacade inputLogin;

  @FindBy(id = "mailbox:password")
  WebElementFacade inputPassword;

  @FindBy(css = "label[id='mailbox:submit']>input")
  WebElementFacade buttonSubmit;

  public void login() throws InterruptedException {
    inputLogin.clear();
    inputLogin.sendKeys("login@mail.ru");
    buttonSubmit.click();
    Thread.sleep(5000);
    inputPassword.sendKeys("пароль");
    buttonSubmit.click();
    Thread.sleep(5000);
  }

}

(Vlad Zhichkin) #4

всякие явные и не явные ожидания не помогают. видно после ввода логина перерисовывается DOM и найденный ранее элемент “ввести пароль” уже отсутствует на странице.
прочитал что PageFactory может помочь в этой проблеме. Как смог засунул его но не не очень нравится как это выглядит в коде, хотя и работает.
класс шагов стал такой:

public class MailRuSteps {

  @Step("Вводит логин и пароль в поля ввода и заходит в почту")
  public void entersСredentialsAndLogsIn () throws InterruptedException {
    WebDriver driver = new FirefoxDriver();
    MailRuHomePage mailRuHomePage = PageFactory.initElements(driver, MailRuHomePage.class);
    mailRuHomePage.login();
  }

а Page класс перестал быть расширением от PageObject

public class MailRuHomePage {

  WebDriver driver;

  @FindBy(id = "mailbox:login")
  WebElement inputLogin;

  @FindBy(id = "mailbox:password")
  WebElement inputPassword;

  @FindBy(css = "label[id='mailbox:submit']>input")
  WebElement buttonSubmit;

  public MailRuHomePage(WebDriver driver) {
    this.driver = driver;
    driver.get("https://mail.ru");
  }

  public void login() throws InterruptedException {
    Thread.sleep(5000);

    inputLogin.clear();
    inputLogin.sendKeys("login@mail.ru");

    buttonSubmit.click();
    Thread.sleep(5000);

    inputPassword.clear();
    inputPassword.sendKeys("пароль");

    buttonSubmit.click();
    Thread.sleep(5000);
  }

(Vlad Zhichkin) #5

хотелось бы понять в чем проблема и совсем обойтись без PageFactory, либо как то более аккуратно его оформить в коде