Проблема очень похожа как в этой теме 14 года и вот в этом вопросе на стековерфлоу
Создал тестовый проект, цель зайти на сайт mail.ru и отправить письмо.Проблема в том что, при вводе “Имя ящика” и нажатии кнопки “Ввести пароль” не происходит смена поля на “Пароль”. и при попытке ввести пароль тест падает с “Element not available”.
На чистом Selenium действия выполняются успешно, тест не падает.
Пробовал браузер и фаерфокс и хром.
К сожалению в теме от 14 года самый нужный скриншот уже не отображается, поэтому проверить решение от туда не могу.
тест на силениуме, который нормально работает:
@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);
}
тест:
@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);
}
}
всякие явные и не явные ожидания не помогают. видно после ввода логина перерисовывается 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);
}
хотелось бы понять в чем проблема и совсем обойтись без PageFactory, либо как то более аккуратно его оформить в коде