Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

ChromeDriver видимый другим классам в JAVA

chrome
webdriver
Теги: #<Tag:0x00007f7b6907e040> #<Tag:0x00007f7b6907dac8>

(Vladislav Zolotaryov) #1

Здравствуйте! Подскажите пожалуйста, как запускать ChromeDriver, чтобы его могли использовать другие классы? В коде ниже не работает команда System.

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Start {

System.setProperty(“webdriver.chrome.driver”, “chromedriver.exe”);
static WebDriver driver = new ChromeDriver();

public static void main(String[] args) {
// TODO Auto-generated method stub

}

}

В коде ниже driver не виден другим классам.

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Start {

public static void main(String[] args) {
// TODO Auto-generated method stub

  System.setProperty("webdriver.chrome.driver", "chromedriver.exe");	
  WebDriver driver = new ChromeDriver();

}

}

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


(Bohdan Harasym) #2

попробуй с selenium ide написать скрипт для рассылки. со временем разберешся как что работает.


(Vladislav Zolotaryov) #3

Bohdan_Harasym, как это вообще связано? :frowning:


(Vladislav Zolotaryov) #4

Я использовал следующий метод:

static ChromeDriverService driverService = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(“chromedriver.exe”))
.build();

static WebDriver driver = new ChromeDriver(driverService);
У кого ещё какие идеи??? Как делать всё же правильно?


(Vladislav Zolotaryov) #5

Bohdan_Harasym, как это вообще связано? :frowning:


(Nik Sidorenko) #6

Вы пытаетесь вызвать статический метод setProperty у класса System вне метода/конструктора другого класса. В объектно-ориентированном программирование такое не допускается. Так же Вы объявили “static WebDriver driver” без модификатора доступа - это означает, что драйвер будет виден только классам внутри того же пакета.

В данном случае Вы объявили “WebDriver driver” как переменную метода “main”. В этом случае driver будет доступен только внутри этого метода.

Для того чтобы драйвер был доступен везде объявити его так. Сразу после строки:
public class Start {
напишите
public static WebDriver driver = new ChromeDriver();

P.S.: Если Вы хотите заниматься автоматизацией, прежде чем пытаться что-либо сделать с WebDriver, следует хорошо изучить основы объектно-ориентированного программирования.


(Vladislav Zolotaryov) #7

Спасибо, за ответ. Но суть вовсе не в этом была вопроса. Я понимаю, что мне не ясны все основы объектно-ориентированного программирования.
Ясно стало, что методы другого класса не могу вызывать за пределами конструктора. Запомнил.
Также хочу пояснить, что мне не важно будет ли драйвер виден за пределами пакета в данном проекте.

Однако Ваш ответ не помогает в решении данной проблемы, в таком случае ChromeDriver запустится с ошибкой, так как не указан путь к нему. Так как:
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
выполняется после запуска ChromeDriver’a и уже вылезет ошибка.


(5am) #8

объявите webdriver как static = null
инициализируйте драйвер после setProperty


(Vladislav Zolotaryov) #9

Мне кажется это извращением. Хороша ложка к обеду, зачем брать ложку, затем выкидывать, чтобы потом снова её взять и начать использовать?
P. S. Могу ошибаться, в программировании Я новичок.

Я нашёл данный способ:

`public static ChromeDriverService driverService = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(“chromedriver.exe”))
.build();

public static WebDriver driver = new ChromeDriver(driverService);`

Чем он плох? В чём его минус?


(Nik Sidorenko) #10

Ничего плохого тут нет. Если Вам такое решение подходит и оно работает, значит всё ок.
Просто зачастую инициализация вебдрайвера не ограничевается одной строчкой и приходится создавать отдельный метод где вебдрайвер инициализируется со всякими свойствами. Вот пример

public class Driver {

public static WebDriver  driver;

public static void startDriver() {
    if (System.getProperty("webdriver.chrome.driver") == null) {
      String chromedriver = PathUtils.concatPath(PathUtils.getDriversFolder(),"chromedriver");
      if (SystemUtils.IS_OS_WINDOWS) {
        chromedriver += ".exe";
      }
    System.setProperty("webdriver.chrome.driver", chromedriver);
   }
   ChromeOptions options = new ChromeOptions();
   options.addArguments("--disable-sync", "--test-type");
   DesiredCapabilities capabilities = DesiredCapabilities.chrome();
   capabilities.setCapability(ChromeOptions.CAPABILITY, options);
   driver = new ChromeDriver(capabilities);
 }
}

Методы другого класса могут вызываться за пределами конструктора.

Виноват, постоянно забываю, что ChromeDriver - это отдельный файл и к нему надо указывать путь (Чаще пользуюсь FireFoxDriver).

Проблема “как запускать ChromeDriver, чтобы его могли использовать другие классы?” ещё актуальна?
Если да, то приведите пример класса где Вы создаёте ChromeDriver и класса где Вы хотите его использовать


(Bohdan Harasym) #11

http://ru.selenide.org/ вам в помощь. с этой библиотекой значительно проще начать писать тесты, чем с селениумом. и к слову о драйвере, екземпляр драйвера юзается в тестовом методе тестового класса, в одном конкретном, после теста он гасится. и в новом тестовом методе поднимаетмся новый. при каждом переходе на другие страницы или же при обновлении страницы создаетс новый екземпляр драйвера, так что статический драйвер доступный повсюду, это нонсенс. Драйвер может поднимматься вне теста, в так званном классе враппере, и это правильно, но это задача далеко не для новачка.начните с селенида, там есть простые примеры.