WebDriverException: невідома помилка: Файл DevToolsActivePort не існує під час спроби ініціювання браузера Chrome


152

Я намагаюся запустити хром з URL-адресою, браузер запускається, і він нічого не робить після цього.

Я бачу помилку нижче через 1 хвилину:

Unable to open browser with url: 'https://www.google.com' (Root cause: org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist
  (Driver info: chromedriver=2.39.562718 (9a2698cba08cf5a471a29d30c8b3e12becabb0e9),platform=Windows NT 10.0.15063 x86_64) (WARNING: The server did not provide any stacktrace information)

Моя конфігурація:

  • Хром: 66
  • ChromeBrowser: 2,39,56

PS у Firefox все працює добре


1
Чи можете ви оновити питання за допомогою коду, який викликає цю помилку?
GPT14

Я отримав цю помилку, коли vncserver зазнав аварії, і у мене більше не було X-дисплея
xtian

Відповіді:


71

Це повідомлення про помилку ...

org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist 

... означає, що ChromeDriver не зміг ініціювати / породити новий веб- браузер, тобто сеанс браузера Chrome .

Ваші випробування з кодом та інформація про версію всіх бінарних файлів дали б нам підказку про те, що відбувається не так.

Однак, відповідно до Add --disable-dev-shm-use до прапорів запуску за замовчуванням, схоже, додавання аргументу --disable-dev-shm-usageтимчасово вирішить проблему.

Якщо ви хочете ініціювати / продовжувати новий сеанс браузера Chrome, ви можете скористатися наступним рішенням:

System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized"); // open Browser in maximized mode
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("--no-sandbox"); // Bypass OS security model
WebDriver driver = new ChromeDriver(options);
driver.get("https://google.com");

відключити-dev-shm-використання

Згідно з базовим_switches.cc, disable-dev-shm-usage здається, діє лише в ОС Linux :

#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
// The /dev/shm partition is too small in certain VM environments, causing
// Chrome to fail or crash (see http://crbug.com/715363). Use this flag to
// work-around this issue (a temporary directory will always be used to create
// anonymous shared memory files).
const char kDisableDevShmUsage[] = "disable-dev-shm-usage";
#endif

У дискусії Додайте можливість використовувати / tmp замість / dev / shm, згаданий Давид:

Я думаю, це залежатиме від того, як монтуються / dev / shm та / tmp. Якщо вони обидва встановлені як tmpfs, я припускаю, що різниці не буде. якщо з якоїсь причини / tmp не відображається як tmpfs (і я думаю, що за замовчуванням відображається як tmpfs системою), керування спільною пам’яттю в Chrome завжди створює файли в пам'ять під час створення анонімних спільних файлів, тому навіть у такому випадку не повинно бути велика різниця. Я думаю, ви можете змусити тести на телеметрію із включеним прапором і подивитися, як це відбувається.

Щодо того, чому б не використовувати за замовчуванням, це було відштовхується командою спільної пам’яті, я думаю, має сенс використовувати за замовчуванням використання / dev / shm для спільної пам'яті.

Зрештою, все це має рухатись до використання memfd_create, але я не думаю, що це станеться незабаром, оскільки це потребує значного рефакторингу управління пам’яттю Chrome.


Outro

Ось посилання на історію пісочниці .


8
Але що спричинило цю конкретну помилку DevToolsActivePort file doesn't exist, і чому вона раптом почала спливати?

3
Пункти "Додаткового розгляду" - вони виглядають так, що цілком застосовні до цього питання. Особливо така ситуація, коли не було встановлено саме те, що спричинило проблему.
Піт Келлі

5
З видаленої частини публікації @ DebanjanB це може бути викликано використанням Chromedriver, який не підтримує версію встановленого Chrome. Це може статися, наприклад, якщо хром оновлюється без оновлення Chromedriver.
expz

Це вирішувалось для мене, це не в моїй теперішній системі (Ubuntu 18 + Python 3.7)
tw0000

3
У випадку, якщо це допомагає комусь іншому, просто додавання disable-dev-shm-usageбуло недостатньо. Довелося також додати, --no-sandboxщоб змусити його працювати. Це було для мене повним виправленням для Selenium-java:chromeOptions.addArguments("--no-sandbox", "--disable-dev-shm-usage");
Джордж Пантазес

52

Я почав бачити цю проблему в понеділок 2018-06-04. Наші тести працюють щодня. Здається, що єдине, що змінилося, - це версія google-chrome (яка була оновлена ​​до поточної версії). JVM та Selenium - це останні версії Linux box (Java 1.8.0_151, selenium 3.12.0, google-chrome 67.0.3396.62 та xvfb-run).
Конкретно додавання аргументів " --no-sandbox " та " --disable-dev-shm-use " зупинило помилку. Я розгляну ці проблеми, щоб знайти більше інформації про ефект та інші питання, як у тому, що викликало оновлення google-chrome.

ChromeOptions options = new ChromeOptions();
        ...
        options.addArguments("--no-sandbox");
        options.addArguments("--disable-dev-shm-usage");

Хочу уточнити, що цей код працював щонеділі на коробці Ubuntu Linux, але еквівалентний код на робочому столі Windows працював нормально навіть у понеділок. Я не знайшов інформації про те, для чого функціонує файл DevToolsActivePort, і це також було б корисно. ПК
Піт Келлі

1
Ці параметри зупинили помилку і для мене. pd: використання стеку Rails.
Маріо Перес

Я все ще отримую [java] [1536892035.965][SEVERE]: Timed out receiving message from renderer: 60.000помилки навіть з цим
Джонатан

@Jonathan - Привіт! Ви можете надати детальнішу інформацію, наприклад, яку ОС, які версії компонентів, які ви використовуєте, або як ви викликаєте процес?
Піт Келлі

@Toby: Привіт! Я не мав на увазі, що позиція змінила лише мінімальне використання цих параметрів. Здавалося, деякі значення за замовчуванням, на які я покладався, були змінені, коли відбулося оновлення. Будь-які інші деталі щодо вашої системи чи повідомлення, які ви надаєте, можуть допомогти.
Піт Келлі

35

У нас були ті ж самі проблеми з нашими рабами-дженкінами (машина Linux) і спробували всі варіанти, описані вище.

Єдине, що допомогло - це встановити аргумент

chrome_options.add_argument('--headless')

Але коли ми дослідили далі, помітили, що екран XVFB не запускає властивості, і це спричиняє цю помилку. Після того як ми виправили екран XVFB, це вирішило проблему.


2
це вирішило мою проблему під час роботи з використанням C # (у цьому випадку параметр виглядав
приблизно

XVFB була проблемою для мене
lucaswxp

23

У мене була така ж проблема в python. Сказане допомогло. Ось що я використовував у python -

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('/path/to/your_chrome_driver_dir/chromedriver',chrome_options=chrome_options)

Я вирішив свою проблему з оновленням chrome (у мене вже був останній chromedrive), отже, мені довелося також оновити звичайний браузер.
axel_ande

18

Оновлення:

Я можу пройти проблему, і тепер я можу отримати доступ до хрому з потрібною URL-адресою.

Результати спробу запропонованих рішень:

Я спробував усі налаштування, як зазначено вище, але я не зміг вирішити проблему

Пояснення щодо проблеми:

Згідно з моїм спостереженням, файл DevToolsActivePort не існує, викликаний, коли хром не може знайти свою посилання в папці scoped_dirXXXXX.

Вжиті заходи для вирішення проблеми

  1. Я вбив усі процеси хромування та водії хрому.
  2. Доданий нижче код, щоб викликати хром

    System.setProperty("webdriver.chrome.driver","pathto\\chromedriver.exe");    
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("useAutomationExtension", false);
    WebDriver driver = new ChromeDriver(options);
    driver.get(url);
    

Використовуючи вищезазначені кроки, я зміг вирішити проблему.

Дякую за відповіді


3
Чи знаєте ви, що впливає на використанняAutomationExtension? Це відключає розширення для автоматизації (скріншоти / управління тощо), ні? Чи не повинно поява DevTools вплинути на цю зміну? codereview.chromium.org/2785413002
Тобі

10

Нещодавно я стикався з тим же питанням, і після деяких спроб і помилок він працював і для мене.

ОБОВ'ЯЗКОВО БУТИ В ТОПУ:

options.addArguments("--no-sandbox"); //has to be the very first option

BaseSeleniumTests.java

public abstract class BaseSeleniumTests {

    private static final String CHROMEDRIVER_EXE = "chromedriver.exe";
    private static final String IEDRIVER_EXE = "IEDriverServer.exe";
    private static final String FFDRIVER_EXE = "geckodriver.exe";
    protected WebDriver driver;

    @Before
    public void setUp() {
        loadChromeDriver();
    }

    @After
    public void tearDown() {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }

    private void loadChromeDriver() {
        ClassLoader classLoader = getClass().getClassLoader();
        String filePath = classLoader.getResource(CHROMEDRIVER_EXE).getFile();
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        ChromeDriverService service = new ChromeDriverService.Builder()
                .usingDriverExecutable(new File(filePath))
                .build();
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--no-sandbox"); // Bypass OS security model, MUST BE THE VERY FIRST OPTION
        options.addArguments("--headless");
        options.setExperimentalOption("useAutomationExtension", false);
        options.addArguments("start-maximized"); // open Browser in maximized mode
        options.addArguments("disable-infobars"); // disabling infobars
        options.addArguments("--disable-extensions"); // disabling extensions
        options.addArguments("--disable-gpu"); // applicable to windows os only
        options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
        options.merge(capabilities);
        this.driver = new ChromeDriver(service, options);
    }

}

GoogleSearchPageTraditionalSeleniumTests.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class GoogleSearchPageTraditionalSeleniumTests extends BaseSeleniumTests {

    @Test
    public void getSearchPage() {
        this.driver.get("https://www.google.com");
        WebElement element = this.driver.findElement(By.name("q"));
        assertNotNull(element);
    }

}

пом.хмл

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

Цікаво! Як створити файл .side? Це щось, що QA людина робить вручну?
Nital

Ви використовуєте ID Selenium для запису тесту. Результат - файл .side. Він працює добре за допомогою IDE, але я намагаюся запустити його за допомогою бічного бігу з селеном, але зіткнувся з усіма проблемами з kromedriver.
пабрамс

має бути першим варіантом - витратити дні, щоб знайти цю ха-ха
кунікул

Дякую! Додавання "--no-sandbox" вирішить мою проблему.
matabares

7

У моєму випадку в наступному середовищі:

  • Windows 10
  • Пітон 3.7.5
  • Google Chrome версії 80 та відповідного ChromeDriver на шляху C:\Windows
  • селен 3.141.0

Мені потрібно було додати аргументи --no-sandboxі --remote-debugging-port=9222до ChromeOptionsоб’єкта і запустити код , як користувач адміністратора на ланч в Powershell / CMD від імені адміністратора.

Ось пов'язаний фрагмент коду:

options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('--disable-infobars')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')
options.add_argument('--remote-debugging-port=9222')
driver = webdriver.Chrome(options=options)

1
те саме для мене з docker з ubuntu 18.04, py3.7, chrome (драйвер) 80
patroqueeet

Це працювало для мене без додаткових питань. Я щойно почав стикатися з цим питанням сьогодні, але через вашу відповідь це швидко виправляється! Моє оточення по суті таке ж, як і ваше.
Райан Харріс

5

Я зіткнувся з цією проблемою на Ubuntu 20 з Python Selenium після того, як спочатку завантажив хромодрук окремо, а потім використав sudo apt install chromium-browserНавіть якщо вони були тією ж версією, це продовжувалося.

Моє виправлення полягало у використанні наданого драйвера для хромування, який постачався із пакетом repo, який знаходиться у

/snap/bin/chromium.chromedriver

driver = webdriver.Chrome(chrome_options=options, executable_path='/snap/bin/chromium.chromedriver')

4

Як зазначено в цій іншій відповіді :

Це повідомлення про помилку ... означає, що ChromeDriver не зміг ініціювати / породити новий веб-браузер, тобто сеанс браузера Chrome.

Серед можливих причин, я хотів би відзначити той факт , що, в разі , якщо ви працюєте в обезголовлене Chromium через Xvfb, ви , можливо , необхідно exportв DISPLAYзмінної: в моєму випадку, я був на місці (як рекомендується) --disable-dev-shm-usageі --no-sandboxваріанти, все було працює нормально, але в новій установці, що працює з останньою (на момент написання) Ubuntu 18.04, ця помилка почала виникати, і єдиним можливим виправленням було виконання export DISPLAY=":20"(попередньо запустивши Xvfb з Xvfb :20&).


OMG Дякую Я вніс кілька змін у наш контейнер докера, і я випадково залишив xvfb. Я б ніколи цього не знайшов, якби ти цього не залишив тут :-).
Райан

3

Я також зіткнувся з цією проблемою під час інтеграції з сервером jenkins, мене використовували root користувача для роботи з jenkin. Проблема була виправлена, коли я змінив користувача на іншого користувача . Я не впевнений, чому ця помилка виникає для кореневого користувача.

  • Google Chrome версії 71.0
  • Версія ChromeDriver 2.45
  • Версія CentOS7 1.153

Некореневий користувач працював на мене, у мене була правильна версія драйвера для хрому.
TicJit

2

У моєму випадку це сталося, коли я намагався використовувати мій профіль користувача за замовчуванням:

...
options.addArguments("user-data-dir=D:\\MyHomeDirectory\\Google\\Chrome\\User Data");
...

Це викликало хром для повторного використання процесів, які вже працюють у фоновому режимі, таким чином, що процес, запущений Chromeedriver.exe, просто закінчився.

Дозвіл: знищити всі процеси chrome.exe, що працюють у фоновому режимі.


У мене була подібна проблема, але в Linux - мої хромовані процеси не були належним чином закриті після того, як сценарій вийшов з ладу, і вони були повторно використані неправильно. вбивство їх вирішило питання
jeremycg

2

оновити можливості в conf.js як

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['todo-spec.js'],
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: ['--disable-gpu', '--no-sandbox', '--disable-extensions', '--disable-dev-shm-usage']
    }
  },

};

2

У моєму випадку я намагався створити запущену банку в ОС Windows з хромовим браузером і хочу запустити те саме в режимі без голови, в коробці Unix з CentO на ньому. І я вказував свій бінарний файл на драйвер, який я завантажив і пакував із своїм пакетом. Для мене ця проблема продовжує виникати незалежно від додавання нижче:

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--no-sandbox");
System.setProperty("webdriver.chrome.args", "--disable-logging");
System.setProperty("webdriver.chrome.silentOutput", "true");
options.setBinary("/pointing/downloaded/driver/path/in/automationsuite");
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("window-size=1024,768"); // Bypass OS security model
options.addArguments("--log-level=3"); // set log level
options.addArguments("--silent");//
options.setCapability("chrome.verbose", false); //disable logging
driver = new ChromeDriver(options);

Я вирішив і працював для мене рішення: завантажте хром та його інструменти на вікні VM / Unix, встановіть і вкажіть бінарне на це в комплекті автоматизації та бінго! Це працює :)

Команда завантаження:

wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

Команда встановлення:

sudo yum install -y ./google-chrome-stable_current_*.rpm

Оновіть набір нижче двійкового шляху google-chrome:

options.setBinary("/opt/google/chrome/google-chrome");

І .. це працює!


Де ми додаємо цей код? Я не бачу коду C # у своєму .side файлі
pabrams

1

У мене була та сама проблема, але в моєму випадку хром раніше був встановлений у папці temp для користувача, після чого був перевстановлений у програмні файли. Тому жодне із запропонованих тут рішень не допомогло мені. Але якщо забезпечити шлях до chrome.exe, все працює:

chromeOptions.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");

Я сподіваюся, що це комусь допоможе =)


Здається, навпаки виправлено @shiuu нижче
Тобі

1

Жодне рішення не працювало на моє. Але ось вирішення:

maxcounter=5
for counter in range(maxcounter):
    try:           
        driver = webdriver.Chrome(chrome_options=options,
                          service_log_path=logfile,
                          service_args=["--verbose", "--log-path=%s" % logfile])
        break
    except WebDriverException as e:
        print("RETRYING INITIALIZATION OF WEBDRIVER! Error: %s" % str(e))
        time.sleep(10)
        if counter==maxcounter-1:
            raise WebDriverException("Maximum number of selenium-firefox-webdriver-retries exceeded.")

1

Ви можете отримати цю помилку, просто передавши погані аргументи Chrome. Наприклад, якщо я передаю "headless"як аргумент C # ChromeDriver, це спрацьовує чудово. Якщо я помиляюся і використовую неправильний синтаксис "--headless", я отримую DevToolsActivePort file doesn't existпомилку.


1

Я зіткнувся з тією ж проблемою, я використовую браузер UBUNTU, PYTHON та OPERA . у моєму випадку проблема виникла через те, що у мене була застаріла версія operadriver.

Рішення: 1. Переконайтеся, що ви встановили останню версію браузера опери (не використовуйте бета-версію опери чи розробника опери), для цього перейдіть на офіційний сайт опери та завантажте звідти останню версію opera_stable.

  1. Встановіть останній драйвер опери (якщо у вас вже встановлена ​​операційна драйвер, її потрібно видалити спочатку, використовуйте sudo rm ...)

wget https://github.com/operasoftware/operachromiumdriver/releases/download/v.80.0.3987.100/operadriver_linux64.zip

   unzip operadriver_linux64.zip
   sudo mv operadriver /usr/bin/operadriver
   sudo chown root:root /usr/bin/operadriver
   sudo chmod +x /usr/bin/operadriver

у моєму випадку останнім було 80.0.3987, як ви бачите

  1. Крім того, я також встановив Chromeedriver (але оскільки я це робив перед тестуванням, я не знаю, що це потрібно) для того, щоб встановити kromedriver, виконайте кроки на попередньому кроці: v

  2. Насолоджуйтесь і дякуйте мені!

Зразок коду селену

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Opera()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.quit()

0

Здається, існує багато можливих причин цієї помилки. У нашому випадку помилка сталася через те, що у нас були два наступні рядки в коді:

System.setProperty("webdriver.chrome.driver", chromeDriverPath);
chromeOptions.setBinary(chromeDriverPath);

Це вирішується шляхом видалення другого рядка.


Здається, якраз протилежний @ sergiy-konoplyaniy виправте вище: '(
Toby

У нашому setBinary ми намагалися встановити драйвер хрому, що здається помилкою. Виправлення @ sergiy-konoplyaniy встановлює chrome.exe через setBinary.
шиуу

Звідки у вас цей код? Все, що у мене є, - це .side файл, і він не має в ньому коду C #.
пабрамс

0

Я зіткнувся з тим самим випуском під керуванням Chrome через Behat / Mink та Selenium в контейнері Docker. Після декількох хитрощів я дійшов до наступного, behat.ymlяке постачає перемикачі, згадані вище. Зауважте, що всі вони були потрібні мені для успішного запуску.

default:
    extensions:
        Behat\MinkExtension:
            base_url: https://my.app/
            default_session: selenium2
            selenium2:
                browser: chrome
                capabilities:
                    extra_capabilities:
                        chromeOptions:
                            args:
                                - "headless"
                                - "no-sandbox"
                                - "disable-dev-shm-usage"

0

У моєму випадку я перебуваю в середовищі Kubernetes, де я не можу використовувати TMPDIR за замовчуванням, оскільки він заповнить каталог темп сміттям.

Тому я використовував це для використання іншого tmpdir:

driver = new ChromeDriver(new ChromeDriverService.Builder()
                    .withEnvironment(ImmutableMap.of("TMPDIR", customTmpPath))
                    .build(), options);

Але тепер, коли я оновив усе до останнього, це більше не здається, що це працює. Мені потрібно буде знайти новий спосіб зробити це.


0

Це трапляється, коли Chromeedriver не в змозі розібратися, для чого використовується хром для налагодження порту.

Однією з можливих причин є відкритий дефект HKEY_CURRENT_USER \ Програмне забезпечення \ Політика \ Google \ Chrome \ UserDataDir

Але в моєму останньому випадку це була якась інша невстановлена ​​причина.

На щастя, встановлення номера порту вручну працювало:

final String[] args = { "--remote-debugging-port=9222" };
options.addArguments(args);
WebDriver driver = new ChromeDriver(options);

2
Це постійний порт? Або де я можу його шукати?
Майк Шиян

0

Неправильний номер порту в моєму випадку. Перевірте, чи номер порту при запуску сервера Selenium такий, як у вашому скрипті.


-2

Я вирішую цю проблему, встановивши yum -y install gtk3-devel gtk3-devel-docs", це добре

Моя робота env:

Selenium Version 3.12.0
ChromeDriver Version v2.40
Chrome 68 level

Перед:
введіть тут опис зображення введіть тут опис зображення

Після:
введіть тут опис зображення введіть тут опис зображення


9
З перегляду: Будь ласка, не публікуйте текст у зображеннях. Редагуйте свою відповідь та замініть ці зображення текстом. Спасибі
sɐunıɔ ןɐ qɐp

1
Чи вирішує це проблема для когось? Це не вирішило для мене проблеми
Бендрам,

-2

Оскільки це найактивніше повідомлення для подібного типу помилок, я хотів зазначити своє рішення (витративши години, щоб виправити це).

У Ubuntu 18.04, використовуючи Chrome 70 та Chromedriver 2.44 та Python3, я постійно отримував таку ж помилку DevToolsActivePort, навіть коли я відключав усі перераховані вище варіанти. Файл журналу chromedriver, а також ps показав, що хромодрук, який я встановив у chrome_options.binary_location, працює, але він завжди давав помилку DevToolsActivePort. Коли я видалив chrome_options.binary_location = '....' і додав його до створення веб-драйвера, я можу це працювати нормально. webdriver.Chrome ('/ шлях до ... / chromedriver', chrome_options = chrome_options)

Дякую всім за ваші коментарі, які змушують мене зрозуміти та вирішити проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.