Произошла недопустимая операция отражающего доступа при выполнении автоматических тестов с использованием 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.

Другие вопросы по тегам