Вы пытаетесь вызвать статический метод setProperty у класса System вне метода/конструктора другого класса. В объектно-ориентированном программирование такое не допускается. Так же Вы объявили “static WebDriver driver” без модификатора доступа - это означает, что драйвер будет виден только классам внутри того же пакета.
В данном случае Вы объявили “WebDriver driver” как переменную метода “main”. В этом случае driver будет доступен только внутри этого метода.
Для того чтобы драйвер был доступен везде объявити его так. Сразу после строки: public class Start {
напишите public static WebDriver driver = new ChromeDriver();
P.S.: Если Вы хотите заниматься автоматизацией, прежде чем пытаться что-либо сделать с WebDriver, следует хорошо изучить основы объектно-ориентированного программирования.
Спасибо, за ответ. Но суть вовсе не в этом была вопроса. Я понимаю, что мне не ясны все основы объектно-ориентированного программирования.
Ясно стало, что методы другого класса не могу вызывать за пределами конструктора. Запомнил.
Также хочу пояснить, что мне не важно будет ли драйвер виден за пределами пакета в данном проекте.
Однако Ваш ответ не помогает в решении данной проблемы, в таком случае ChromeDriver запустится с ошибкой, так как не указан путь к нему. Так как: System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
выполняется после запуска ChromeDriver’a и уже вылезет ошибка.
Мне кажется это извращением. Хороша ложка к обеду, зачем брать ложку, затем выкидывать, чтобы потом снова её взять и начать использовать?
P. S. Могу ошибаться, в программировании Я новичок.
Я нашёл данный способ:
`public static ChromeDriverService driverService = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(“chromedriver.exe”))
.build();
public static WebDriver driver = new ChromeDriver(driverService);`
Ничего плохого тут нет. Если Вам такое решение подходит и оно работает, значит всё ок.
Просто зачастую инициализация вебдрайвера не ограничевается одной строчкой и приходится создавать отдельный метод где вебдрайвер инициализируется со всякими свойствами. Вот пример
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 и класса где Вы хотите его использовать
http://ru.selenide.org/ вам в помощь. с этой библиотекой значительно проще начать писать тесты, чем с селениумом. и к слову о драйвере, екземпляр драйвера юзается в тестовом методе тестового класса, в одном конкретном, после теста он гасится. и в новом тестовом методе поднимаетмся новый. при каждом переходе на другие страницы или же при обновлении страницы создаетс новый екземпляр драйвера, так что статический драйвер доступный повсюду, это нонсенс. Драйвер может поднимматься вне теста, в так званном классе враппере, и это правильно, но это задача далеко не для новачка.начните с селенида, там есть простые примеры.