t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f9b04f8d288> #<Tag:0x00007f9b04f8ce00>

Здравствуйте! Подскажите пожалуйста, как запускать 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, который будет виден всем другим классам для использования

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

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

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

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

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

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

Вы пытаетесь вызвать статический метод 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 и уже вылезет ошибка.

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

Мне кажется это извращением. Хороша ложка к обеду, зачем брать ложку, затем выкидывать, чтобы потом снова её взять и начать использовать?
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 и класса где Вы хотите его использовать

1 Симпатия

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