当前位置: 首页 > 知识库问答 >
问题:

使用Selenium和Java9执行自动测试时发生了非法反射访问操作[重复]

令狐高洁
2023-03-14

我的硒测试有一个奇怪的问题

当我打开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个答案

张瀚漠
2023-03-14

Selenium的Java客户机工具和库使用反射来访问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 html" target="_blank">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的一些调用在否则会失败的情况下成功,那么第一次这样的调用必须导致在标准错误流上发出警告。以后这样的调用也可能导致发出警告。

    一种实现,默认情况下,它可以打开一个或多个模块的一个或多个包,以便在运行时在所有未命名的模块中进行编码。如果它这样做了,那么它必须发出上一段所述的警告。如果它这样做了,那么它必须进一步提供一种方法来调用其运行时系统,而无需打开任何模块的任何包。(默认情况下,参考实现的运行时系统会以这种方式运行,由于这是默认情况,因此也可以通过命令行选项--非法访问=deny在不打开任何包的情况下调用它。)

    本规范的未来修订预计将要求默认情况下实现的所有模块都被强烈封装,并最终不允许上述放松。

    随着JEP 261:模块系统的到来,一些JDK包的强封装在默认情况下被放松了,这是JavaSE 9平台规范所允许的。这种放松在运行时由一个新的启动器选项-非法访问控制,其工作原理如下:

    • --非法访问=允许:此选项打开运行时映像中每个模块中的每个包,以便在所有未命名模块中编码,即,如果JDK 8中存在该包,则在类路径上编码。这既可以通过编译字节码进行静态访问,也可以通过平台的各种反射API进行深度反射访问
    • --非法访问=警告:此选项与“允许”相同,只是会为每个非法反射访问操作发出警告消息
    • --非法访问=调试:此选项与警告相同,只是针对每个非法反射访问操作都会发出警告消息和堆栈跟踪
    • --非法访问=拒绝:此选项禁用所有非法访问操作,但由其他命令行选项启用的操作除外,例如,--添加打开

    注意:这种模式是JDK 9中的默认模式。它将在未来的版本中被逐步淘汰,并最终被删除。

    一个快速解决方案是恢复到最新版本的Java8

  •  类似资料:
    • 在尝试构建时,。我按照其他人的建议添加了,但仍然得到相同的错误。 有什么建议吗? pom.xml

    • 我试图使用Java9(JDK9)运行DMelt programs(http://jwork.org/DMelt/)程序,它给出了如下错误: 我该怎么修好它?我试图在脚本“dmelt.sh”的最后一行添加-illegal-access=permit(我在Linux中使用bash),但这并没有解决这个问题。我对此很沮丧。我经常使用这个程序,很长一段时间了。也许我永远不应该转到JDK9

    • 问题内容: 我正在尝试使用Java9(JDK9)运行DMelt程序(http://jwork.org/dmelt/)程序,它给了我以下错误: 我该如何解决?我试图将–illegal-access = permit添加到脚本“ dmelt.sh”的最后一行(我在Linux中使用bash),但这不能解决此问题。我对此感到非常沮丧。我经常使用此程序很长时间。也许我永远不应该转向JDK9 问题答案: 解决

    • 我在Eclipse(版本2019-06)中运行一个项目,它在我的java计算机上运行得很好--“OpenJDK 1.8.0_222” 然而,当我尝试tor在Eclipse(版本2021-3)上的另一台计算机上用java运行该项目时--“OpenJDK版本”1.8.0_292“,它不起作用! 我得到以下错误: 警告:发生非法反射访问操作警告:com.google.gson.internal.bind

    • 我想开始Minecraft,但我无法从Eclipse启动它。以下是当我尝试将与一起使用时收到的错误消息: 我以前检查过类似的问题,普遍的共识是Minecraft不支持最新版本的Java,我必须使用Java8(或1.8)。因此,我更改了Eclipse首选项,将执行环境设置为。我还下载了版本为的JDK,并将编译器首选项设置为。这些方法都没有解决这个问题。我知道如果我使用的是Java8,这个问题应该是不

    • 我添加了两个新的依赖项到我的演示应用程序,这是Spring集成和Spring集成文件。之后,我在控制台中得到以下警告。应用程序工作正常,但它困扰着我。 我如何克服这个问题? 我的项目的SDK版本是15.0.2 Spring引导版本 添加依赖项