Size: a a a

2021 March 10

ЕГ

Евгений Горбоконенко... in atinfo chat
Alex
Понял. Будем искать... с перламутровыми пуговицами :)

Хотя для меня остаётся загадкой, почему обычные элементы: private By name = By.xpath("//xpath']"); отрабатывают без проблем. Но стоит обратиться к списку элементов: private List<WebElement> list = driver.findElements(By.xpath("//xpath")); То вылетает эта ошибка. Хотя если напрямую указать этот список в самом тесте, то всё работает???
Ну, надо разбираться что у вас там в коде творится, но тут у вас в первом случае селектор без обращения к драйверу, соответственно пока ничего не ищется, а во втором поиск элементов через обращение к драйверу
источник

R(

Roman (rpwheeler) in atinfo chat
Alex
Понял. Будем искать... с перламутровыми пуговицами :)

Хотя для меня остаётся загадкой, почему обычные элементы: private By name = By.xpath("//xpath']"); отрабатывают без проблем. Но стоит обратиться к списку элементов: private List<WebElement> list = driver.findElements(By.xpath("//xpath")); То вылетает эта ошибка. Хотя если напрямую указать этот список в самом тесте, то всё работает???
By.xpath это вызов метода класса By.

list = driver.find( ...  это вызов _инстанса_ драйвера, который (инстанс) должен быть как-то создан до того как вызван.

Не в обиду, но Вам учиться, учиться и ещё раз учиться, как говорил великий Ленин.
источник

A

Alex in atinfo chat
Roman (rpwheeler)
By.xpath это вызов метода класса By.

list = driver.find( ...  это вызов _инстанса_ драйвера, который (инстанс) должен быть как-то создан до того как вызван.

Не в обиду, но Вам учиться, учиться и ещё раз учиться, как говорил великий Ленин.
пока я ничего не знаю, то меня очень тяжело обидеть :)

А разве мы его в конструкторе изначально не создаём?

public class MainPage {
private WebDriver driver;

   public MainPage(WebDriver driver) {
       this.driver = driver;
   }
private By name = By.xpath("//xpath']");
private List<WebElement> list = driver.findElements(By.xpath("//xpath"));
}
источник

ЕГ

Евгений Горбоконенко... in atinfo chat
Alex
пока я ничего не знаю, то меня очень тяжело обидеть :)

А разве мы его в конструкторе изначально не создаём?

public class MainPage {
private WebDriver driver;

   public MainPage(WebDriver driver) {
       this.driver = driver;
   }
private By name = By.xpath("//xpath']");
private List<WebElement> list = driver.findElements(By.xpath("//xpath"));
}
Вы в конструкторе его только прокидываете, сюда уже должен прийти созданный экземпляр. Смотреть нужно так, где вы создаёте уже экземпляр MainPage.
А вообще посмотрите в сторону Selenide, она такую фигню за вас всякую разруливает
источник

R(

Roman (rpwheeler) in atinfo chat
Alex
пока я ничего не знаю, то меня очень тяжело обидеть :)

А разве мы его в конструкторе изначально не создаём?

public class MainPage {
private WebDriver driver;

   public MainPage(WebDriver driver) {
       this.driver = driver;
   }
private By name = By.xpath("//xpath']");
private List<WebElement> list = driver.findElements(By.xpath("//xpath"));
}
Про порядок инициализации в классе надо почитать.
источник

A

Alex in atinfo chat
Евгений Горбоконенко
Вы в конструкторе его только прокидываете, сюда уже должен прийти созданный экземпляр. Смотреть нужно так, где вы создаёте уже экземпляр MainPage.
А вообще посмотрите в сторону Selenide, она такую фигню за вас всякую разруливает
В @Before

public class MainPageTest {

   private WebDriver driver;
   private MainPage mainPage;

   @Before
   public void setUp() {
       System.setProperty(....chromedriver.exe");
       driver = new ChromeDriver();
       mainPage = new MainPage(driver);
       driver.manage().window().maximize();
       driver.manage().timeouts().implicitlyWait(7, TimeUnit.SECONDS);
       driver.get("http://practice.automationtesting.in/");
   }
}
источник

ЕГ

Евгений Горбоконенко... in atinfo chat
Alex
В @Before

public class MainPageTest {

   private WebDriver driver;
   private MainPage mainPage;

   @Before
   public void setUp() {
       System.setProperty(....chromedriver.exe");
       driver = new ChromeDriver();
       mainPage = new MainPage(driver);
       driver.manage().window().maximize();
       driver.manage().timeouts().implicitlyWait(7, TimeUnit.SECONDS);
       driver.get("http://practice.automationtesting.in/");
   }
}
Выглядит вроде валидно. Надо разбираться что там дальше происходит и почему драйвер не подтягивается
источник

ВШ

Вадим Шевчук... in atinfo chat
а поля инициализируются после того как конструктор отработал?
источник

ВШ

Вадим Шевчук... in atinfo chat
или до?
источник

MS

Maks Stn in atinfo chat
Пардон, до
источник

ВШ

Вадим Шевчук... in atinfo chat
Maks Stn
Пардон, до
тогда вполне понятно из-за чего NullPointerException
источник

MS

Maks Stn in atinfo chat
Поэтому и написали что в бифор нужно сэтать драйвер
источник

ВШ

Вадим Шевчук... in atinfo chat
Maks Stn
Поэтому и написали что в бифор нужно сэтать драйвер
так сетится оно в бифор , но в другом классе
источник

MS

Maks Stn in atinfo chat
Вадим Шевчук
так сетится оно в бифор , но в другом классе
Выше решение от Alex
источник

MS

Maks Stn in atinfo chat
Alex
В @Before

public class MainPageTest {

   private WebDriver driver;
   private MainPage mainPage;

   @Before
   public void setUp() {
       System.setProperty(....chromedriver.exe");
       driver = new ChromeDriver();
       mainPage = new MainPage(driver);
       driver.manage().window().maximize();
       driver.manage().timeouts().implicitlyWait(7, TimeUnit.SECONDS);
       driver.get("http://practice.automationtesting.in/");
   }
}
В идеале ещё объект драйвера засунуть в синглтон
источник

ВШ

Вадим Шевчук... in atinfo chat
public class MainPage {
private WebDriver driver;

   public MainPage(WebDriver driver) {
       this.driver = driver;
       list = driver.findElements(By.xpath("//xpath"));
   }
private By name = By.xpath("//xpath']");
private List<WebElement> list;
}

так будет работать
источник

ЕГ

Евгений Горбоконенко... in atinfo chat
Вадим Шевчук
public class MainPage {
private WebDriver driver;

   public MainPage(WebDriver driver) {
       this.driver = driver;
       list = driver.findElements(By.xpath("//xpath"));
   }
private By name = By.xpath("//xpath']");
private List<WebElement> list;
}

так будет работать
Ну вообще в конструкторе инициализировать некий лист объектов - так себе идея)
источник

ВШ

Вадим Шевчук... in atinfo chat
согласен
источник

ЕГ

Евгений Горбоконенко... in atinfo chat
С драйвером не связано, да, но проблем и не удобностей можно огрести прям ворох
источник

A

Alex in atinfo chat
Вадим Шевчук
public class MainPage {
private WebDriver driver;

   public MainPage(WebDriver driver) {
       this.driver = driver;
       list = driver.findElements(By.xpath("//xpath"));
   }
private By name = By.xpath("//xpath']");
private List<WebElement> list;
}

так будет работать
Да. Заработало. Тест прошёл. Спасибо.

Вот только такого костыля, чтобы инициализировать листы объектов в конструкторе я нигде не встречал.
источник