Произошла недопустимая операция отражающего доступа при выполнении автоматических тестов с использованием Selenium и Java 9.
У меня странная проблема с моим тестом на селен
Когда я открываю свой браузер Chrome, я получаю 2 ошибки:
[1569419754.430][WARNING]: Timed out connecting to Chrome, retrying...
[1569419759.899][WARNING]: Timed out connecting to Chrome, retrying...
Прежде, чем браузер откроется. Еще я заметил в конце теста многочисленные предупреждения:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.openqa.selenium.os.ProcessUtils
WARNING: Please consider reporting this to the maintainers of org.openqa.selenium.os.ProcessUtils
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Я попытался обновить зависимость maven:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.0.1</version>
</dependency>
Но затем он сломал все мои тесты, и я не смог инициализировать браузер, у кого-нибудь еще есть эта проблема?
1 ответ
Клиентские инструменты и библиотеки Java Selenium используют отражение для доступа к частям JDK, которые предназначены только для внутреннего использования. Этот незаконный доступ к отражению будет отключен в будущем выпуске JDK. При использовании JDK 9 это разрешено по умолчанию, и выдается следующее предупреждение:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.openqa.selenium.os.ProcessUtils
WARNING: Please consider reporting this to the maintainers of org.openqa.selenium.os.ProcessUtils
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Согласно статье " Понимание предупреждений о доступе во время выполнения" по умолчанию выдается максимум одно предупреждение об отражающем доступе за время существования процесса, запущенного средством запуска java. Точное время появления предупреждения зависит от поведения инструментов и библиотек, выполняющих операции рефлексивного доступа. Предупреждение может появиться в начале жизненного цикла процесса или спустя долгое время после запуска.
Вы можете отключить предупреждающее сообщение для каждой библиотеки с помощью команды --add-opens
флаг командной строки. Например, вы можете запустить Selenium следующим образом:
>java --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED -jar selenium-server-standalone-3.14.0.jar
Расслабляющая сильная инкапсуляция
Чтобы помочь нам в переходе на Java 9, потребовалась реализация, ослабляющая строгую инкапсуляцию модулей, которая решала бы следующее:
Реализация, которая может предоставлять некоторые средства для вызова своей системы времени выполнения с одним или несколькими пакетами одного или нескольких ее модулей, открытых для кода во всех безымянных модулях, т. Е. Для кода на пути к классу. Если система времени выполнения вызывается таким образом, и если при этом некоторые вызовы API-интерфейсов отражения завершаются успешно, тогда как в противном случае они бы потерпели неудачу, то первый такой вызов должен вызвать выдачу предупреждения в стандартном потоке ошибок. Позже такие вызовы могут также вызывать выдачу предупреждений.
Реализация, которая по умолчанию может открывать один или несколько пакетов одного или нескольких своих модулей для кодирования во всех безымянных модулях во время выполнения. В этом случае он должен выдать предупреждения, как описано в предыдущем абзаце. Если он это делает, он должен, кроме того, предоставить средства для вызова своей системы времени выполнения без открытия каких-либо пакетов любого из своих модулей. (Система времени выполнения эталонной реализации ведет себя таким образом по умолчанию, и, поскольку это значение по умолчанию, ее также можно вызывать без открытия каких-либо пакетов с помощью параметра командной строки
--illegal-access=deny
.)
Ожидается, что в будущих версиях этой спецификации все модули реализации будут строго инкапсулированы по умолчанию и, в конечном итоге, запретить вышеописанное ослабление.
JEP 261: Модульная система
С появлением JEP 261: Module System строгая инкапсуляция некоторых пакетов JDK по умолчанию ослаблена, как это разрешено спецификацией платформы Java SE 9. Это расслабление контролируется во время выполнения с помощью новой опции запуска.--illegal-access
, который работает следующим образом:
--illegal-access=permit
: Эта опция открывает каждый пакет в каждом модуле в образе времени выполнения для кодирования во всех безымянных модулях, т. Е. Для кодирования на пути к классу, если этот пакет существовал в JDK 8. Это обеспечивает статический доступ, т. и доступ с глубоким отражением через различные API-интерфейсы отражения платформы.--illegal-access=warn
: Эта опция идентична разрешению, за исключением того, что выдается предупреждающее сообщение для каждой незаконной операции отражающего доступа.--illegal-access=debug
: Эта опция идентична предупреждению, за исключением того, что и предупреждающее сообщение, и трассировка стека выдаются для каждой незаконной операции отражающего доступа.--illegal-access=deny
: Этот параметр отключает все операции с незаконным доступом, кроме тех, которые разрешены другими параметрами командной строки, например,--add-opens
.
Примечание. Этот режим установлен по умолчанию в JDK 9. В будущих версиях он будет прекращен и, в конечном итоге, будет удален.
Решение
Быстрое решение - вернуться к последней версии Java 8.