При выполнении автоматических тестов с использованием Selenium и Java произошла недопустимая операция доступа с отражением - PullRequest
0 голосов
/ 25 сентября 2019

У меня странная проблема с тестом селена

Когда я открываю свой браузер 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>

Но затем он сломал все мои тесты, и я не смогне инициализировать браузер, у кого-то еще есть эта проблема?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019
Клиентские инструменты и библиотеки 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

Расслабление сильной инкапсуляции

Чтобы помочь нам в переходе на Java9 , была необходима реализация, чтобы ослабить сильную инкапсуляцию модулей, которые могли бы решить следующее:

  • Реализация, которая может предоставить некоторые средствавызывать свою систему времени выполнения с одним или несколькими пакетами из одного или нескольких своих модулей, открытых для кодирования во всех безымянных модулях, т. е. для кодирования на пути к классам.Если во время выполнения система вызывается таким образом, и если при этом некоторые вызовы API-интерфейсов отражения выполняются там, где в противном случае они бы потерпели неудачу, то первый такой вызов должен вызвать предупреждение о потоке стандартной ошибки.Позднее такие вызовы могут также привести к выдаче предупреждений.

  • Реализация, которая может по умолчанию открывать один или несколько пакетов одного или нескольких своих модулей для кодирования во всех безымянных модулях при запуске.время.Если это так, то он должен выдавать предупреждения, как описано в предыдущем абзаце.Если это так, то он должен, кроме того, предоставить средства для вызова своей системы времени выполнения, не открывая никаких пакетов ни одного из своих модулей.(Во время выполнения система эталонной реализации ведет себя таким образом по умолчанию, и, поскольку это значение по умолчанию, ее также можно запускать, не открывая ни один из ее пакетов с помощью параметра командной строки --illegal-access=deny.)

Ожидается, что в будущих редакциях этой спецификации будет предписано, чтобы все модули реализации были строго инкапсулированы по умолчанию, и, в конечном счете, запретить описанное выше ослабление.


JEP 261: модульная система

С появлением JEP 261: модульная система строгая инкапсуляция некоторых пакетов JDK по умолчанию ослаблена, как разрешено Java SE9 Спецификация платформы .Это ослабление контролируется во время выполнения новой опцией запуска --illegal-access, которая работает следующим образом:

  • --illegal-access=permit: эта опция открывает каждый пакет в каждом модуле в образе времени выполнения для кодированияво всех безымянных модулях, т. е. кодировать путь к классу, если этот пакет существовал в JDK 8. Это обеспечивает как статический доступ, т. е. скомпилированный байт-код, так и доступ с глубоким отражением, через различные API отражения платформы.
  • --illegal-access=warn: этот параметр идентичен разрешению, за исключением того, что выдается предупреждающее сообщение для каждой незаконной операции отражающего доступа.
  • --illegal-access=debug: этот параметр идентичен предупреждению, за исключением как предупреждающего сообщения, так итрассировка стека выдается для каждой недопустимой операции отраженного доступа.
  • --illegal-access=deny: эта опция отключает все недопустимые операции доступа, кроме тех, которые включены другими параметрами командной строки, например, --add-opens.

Примечание : этот режим используется по умолчанию в JDK 9. Он будет прекращен в следующем выпуске и, в конце концов, перезапустится.Перемещено.


Решение

Быстрое решение проблемы - возврат к последней версии Java 8

0 голосов
/ 25 сентября 2019

Отражающие доступы Illefal связаны с переходом на Java 9+.Прочитайте это: что такое нелегальный рефлексивный доступ .Попробуйте изменить используемую версию Java.

...