Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/55: Рейтинг темы: голосов - 55, средняя оценка - 4.76
2 / 2 / 0
Регистрация: 08.11.2013
Сообщений: 24

WebDriver as Singleton

04.12.2014, 23:55. Показов 11106. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Вопрос использования синглтон паттерна на практике, а именно задача - сделать общим и единственным экземпляр объекта WebDriver (Selenium 2) и обеспечить его работу.
В интернете нашёл одно решение, но оно различается со всеми теоретическими вариантами паттерна.
Я предлагаю следующий вариант.
Cинглтон от Bill Pugh, неизменённый, в который добавлен объект WebDriver и методы для его обслуживания.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
 
public class Driver {
 
    private static WebDriver driver = null;
 
    // Private constructor prevents instantiation from other classes
    private Driver() {
        System.out.println("Driver()");
    }
    /** author Bill Pugh
     * LazyHolder is loaded on the first execution of Driver.getInstance()
     * or the first access to LazyHolder.INSTANCE, not before.
     * minus: It is impossible to use for not static fields of a class
     */
    private static class LazyHolder  {
        private static final Driver INSTANCE = new Driver();
    }
 
    public static Driver instance() {
        System.out.println("instance()");
        return LazyHolder.INSTANCE;
    }
 
    public WebDriver getDriver() {
        System.out.println("getDriver()");
        return driver;
    }
 
    public void init() {
        System.out.print("init(): ");
        driver = new FirefoxDriver();
        System.out.println("FirefoxDriver()");
    }
 
    public void close() {
        System.out.print("close(): ");
        if (driver!=null) {
            driver.quit();
            System.out.println("driver.quit()");
        }
        else
            System.out.println("null error");
    }
}
 
public class Main {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("get instance ...");
        Driver drv = Driver.instance();
        drv.init();
        drv.getDriver().get("http://yandex.ru");
        Thread.sleep(5000);
        drv.close();
    }
}
Вывод консоли:
get instance ...
instance()
Driver()
init(): FirefoxDriver()
getDriver()
close(): org.openqa.selenium.os.UnixProcess$Selen iumWatchDog destroyHarder Command failed to close cleanly. Destroying forcefully (v2).
Хотелось бы получить совет по оптимизации или узнать другие более удачные решения.
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.12.2014, 23:55
Ответы с готовыми решениями:

Collections: singleton/singletonList/singletonMap. Что значит слово singleton?
Заметил, что в классе Collections (утилитный класс) имеются методы для оборачивания элемента в set/list/map Все эти методы содержат в...

Selenium Webdriver
Здравствуйте, как можно при помощи Selenium webdriver можно заполнить поле по ссылке https://www.wrike.com/price/ (выбрать Professional -...

Создание фреймворка для АТ UI на базе Webdriver + java
Нужна литература или какие-нибудь видюшки по этой теме. Возможно у кого-то есть какие-то небольшие полезные наработки)

5
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
05.12.2014, 03:29
обычно в синглтонах метод получения инстанса синхронизирован. В остальном обычный сингтон незнаю что тут можно более удачно сделать, хотя в код не вникал особо...
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.12.2014, 17:38
Код странный. Синглтон должен быть в первую очередь потокобезопасный, а у вас init() может вызываться в разных потоках.
Зачем driver сделан static? Чтобы GC не смог его собрать?

Как правильно писать синглтон - http://shipilev.net/blog/2014/... struction/
0
2 / 2 / 0
Регистрация: 08.11.2013
Сообщений: 24
05.12.2014, 17:53  [ТС]
Согласен. Да возможно он не потокобезопасный, но это довольно популярный вариант синглтона.

Мой вопрос как раз в этом и есть, как применить синглтон (любой) на практике, то есть обернуть WebDriver.
Методы getDriver(), init(), close() - это не методы синглтона, а методы обслуживания объёкта WebDriver.

По поводу улучшений хотелось бы избавится от строчки drv.init(), можно ли её поместить внутрь синглтона, например в конструктор?
0
2 / 2 / 0
Регистрация: 08.11.2013
Сообщений: 24
11.12.2014, 21:26  [ТС]
Хотел бы выяснить может ли следующий класс применяться как синглтон.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class WebBrowser {
    private static WebDriver instance;
 
    private WebBrowser() { }
 
    public static WebDriver getInstance() {
        if (instance==null) {
            instance = new FirefoxDriver();
            System.out.println("get instance FirefoxDriver()");
        }
        return instance;
    }
 
    public void close() {
        System.out.println("close ");
        if (instance!=null) {
            instance.quit();
            instance = null;
        }
        else
            System.out.println("null error at close()");
    }
}
Чем эта реализация лучше предыдущей?
0
2 / 2 / 0
Регистрация: 08.11.2013
Сообщений: 24
18.12.2014, 21:21  [ТС]
Наверное последний вариант:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Driver {
    private static WebDriver driver = null;
 
    private Driver() {
        driver = new FirefoxDriver();
    }
 
    private static class LazyHolder  {
        private static final Driver INSTANCE = new Driver();
    }
 
    public static WebDriver instance() {
        return LazyHolder.INSTANCE.driver;
    }
 
    public static void close() {
        if (driver!=null) {
            driver.quit();
        }
    }
}
 
    public static void main(String[] args) throws InterruptedException {
        WebDriver drv1 = Driver.instance();
        WebDriver drv2 = Driver.instance();
        drv1.get("http://yandex.ru");
        drv2.get("http://mail.ru");
        Thread.sleep(5000);
        Driver.close();
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2014, 21:21
Помогаю со студенческими работами здесь

Singleton
Добрый день, объясните пожалуйста как работает этот код и что такое синглетон? я немного понимаю, но преподу нужно точная формулировка...

Singleton
Привет. Прошу помочь в решении такои задачи. Перевод немножко кривой. Если можно, то с пояснениями. Спасибо создать класс, который...

Singleton
Можете обьяснить что такое singleton в Java? Для чего он создается?

Singleton
Вот например я создал в блоке между фигурными скобками обьект класса Singleton и этот обьект может быть единственным только в рамках этого...

Singleton
Всем привет... не могу сообразить почему делают так: public class Singleton { private static volatile Singleton instance; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru