значит у вас проблемы с инициализацией объекта homePage
посмотрите где он задекларирован
что скорее всего получается, что переменная инициализируется каждый раз для каждого теста
потому содержимое переменной не сохраняется
значит у вас проблемы с инициализацией объекта homePage
посмотрите где он задекларирован
что скорее всего получается, что переменная инициализируется каждый раз для каждого теста
потому содержимое переменной не сохраняется
Задекларирован в классе с этими двумя методами
public class LoginTest extends BasicTestCase {
private LoginPage loginPage = PageFactory.initElements(getWebDriver(),
LoginPage.class);
private HomePage homePage;
тут тогда без полного кода, тяжело будет узнать где проблема
и но все таки увебежден это проблема инициализации объектов между тестами
если есть возможность выпожить код, могу посмотреть
или же можете сделать примерочный простой код и полностью показать.
1, имхо, Вы делаете много лишних проверок
2, если Вы хотите открыть страницу, а потом запустить n тестов, то вам лучше воспользоваться @BeforeClass
и @AfterClass
3, выполните инициализацию homePage в @BeforeClass
и дальше пользуйтесь уже инициализированным объектом
чуть позже, если все таки появиться время, напишу вам небольшой пример на гугле чтобы можно было посмотреть
+ забыл добавить что у вас таким образом получаются зависимые тесты
а зависимые тесты плохи тем что могут поламаться цепочкой, как домино
будьте с этим осторожны, в общих случаях я рекомендую сделать тесты независимыми
я рекомендую сделать тесты независимыми
Спасибо Кэп, в этом какбы и есть смысл этой темы
не сказал бы, потому что человек хочет разделить один тест на два теста, но при этом чтобы страница не закрывалась и не перегружалась
т.е. если первый тест неправильно отработал и завел на какую-то другую страницу, то второй тест 100% упадет
в этом и есть зависимость
Под независимыми вы имеете ввиду такую логику тестов.
Первый тест:
1. Логинимся, - что по умолчанию приводит нас на первую страницу ,- делаем проверки, выходим.
Второй тест:
2. Снова логинимся, заходим на вторую страницу, делаем проверки, выходим.
Третий тест:
3. Снова логинимся, заходим на третью страницу, делаем проверки, выходим.. и т.д.
тут есть два варианта
1. первый тот который вы назвали
2 и второй, это залогиниться один раз в сессии, не закрывать браузер, но в каждом тесте сначала открывать нужную страницу, а потом уже производить необходимые действия.
Если не ошибаюсь, второй вариант мне как раз и нужен был изначально.
ок, мои извинения, значит я ошибался и не правильно понял
вот примерочный код на гугл правда, но я максимально выстроил Вашу структуру
Test1.java
package browser;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class Test1 extends BaseTestCase{
private HomePage home;
@BeforeClass
public void setup() {
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
home = PageFactory.initElements(driver, HomePage.class);
home.open();
}
@AfterClass
public void tearDown() {
driver.quit();
}
@Test
public void testGoogle1Search() throws InterruptedException {
GmailPage gmail = home.openGmail();
gmail.doSomething();
Thread.sleep(2000);
}
@Test
public void testGoogleSearch2() throws InterruptedException {
GooglePlus plus = home.openGooglePlus();
plus.doSomething();
Thread.sleep(2000);
}
}
BaseTestCase.java
package browser;
import org.openqa.selenium.WebDriver;
public class BaseTestCase {
protected static WebDriver driver;
}
HomePage.java
package browser;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
public class HomePage extends Page {
public HomePage(WebDriver driver) {
super(driver);
}
@Override
public void open() {
driver.get("https://www.google.com.ua/");
}
public GmailPage openGmail() {
driver.get("https://gmail.com");
return PageFactory.initElements(driver, GmailPage.class);
}
public GooglePlus openGooglePlus() {
driver.get("http://plus.google.com");
return PageFactory.initElements(driver, GooglePlus.class);
}
}
GmailPage.java
package browser;
public class GmailPage {
public void doSomething() {
System.out.println("do something");
}
}
GooglePlus.java
package browser;
public class GooglePlus {
public void doSomething() {
System.out.println("do something");
}
}
Page.java
package browser;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public abstract class Page {
protected static WebDriver driver;
public Page(WebDriver driver) {
Page.driver = driver;
}
protected void type(WebElement webElement, String text) {
webElement.clear();
webElement.sendKeys(text);
}
public abstract void open();
}
Спасибо за помощь. Но я обнаружил другую причину того, что второй тест не запускался и выпадал с ошибкой java.lang.NullPointerException.
Как оказалось, тесты в очередь на запуск ставятся по алфавиту.
Вот какой был порядок запуска, который привел к ошибке:
PASSED: testLogin
PASSED: testStatement
PASSED: testStatement1
PASSED: testStatement2
FAILED: testFea
Если тест testFea переименовать к примеру на testOver - все проходит без ошибок.
это и я называю зависимость, о которой я писал ранее.
потому что успешный проход теста зависит от порядка выполнения тестов, и это есть плохо как видите
у TestNG можно указать приоритет выполнения тестов в аннотации @Test(priority=1)
попробуйте использовать пример можно посмотреть тут Priority в TestNG не работает вместе с dependsOnMethods
а также, если бы вы использовали аннотацию @BeforeClass и там выполняли необходимые для вас действия, как я выполнил в своем примере Замена assert на мягкую проверку verify в TestNG - #20 от пользователя polusok
тогда у вас не было бы таких проблем
@BeforeClass
public void setup() {
loginPage = PageFactory.initElements(driver, LoginPage.class);
loginPage.open();
homePage = loginPage.loginAs(admin);
}
loginPage.open();
- открывает страницу с логином
homePage = loginPage.loginAs(admin);
- вводит логин и пароль
после ввода логина и пароля загружается первая страница… но. BeforeClass
не решил проблему с запуском тестов по “алфавиту” . или он не должен был это решить?
@BeforeClass
и не должен был ничего решать с запуском в алфавитном порядке
просто через использование @BeforeClass
, вы инициализируете нужные объекты перед использованием
почему у вас была nullpointer exception, потому что вы пытались использовать объект, который не был инициализирован
в предыдущем посте я писал на счет priority попробуйте его
priority помог, спасибо.
1, имхо, Вы делаете много лишних проверок
А как по вашему мнению лучше организовать проверки?