TestNG 默认禁用从不安全的 Url 加载 DTD
Posted
技术标签:
【中文标题】TestNG 默认禁用从不安全的 Url 加载 DTD【英文标题】:TestNG by default disables loading DTD from unsecure Urls 【发布时间】:2019-12-09 11:53:18 【问题描述】:我正在使用 testng maven 和 selenium 来运行我的测试,目前我有以下 testng.xml 文件
看起来问题出在 &listeners 和 &classes 行,如果我用引用文件上的 xml 内容替换这些行,它运行良好。我在以前的项目中使用过它,它工作正常,不知道为什么会出现这个错误。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" [
<!ENTITY listeners SYSTEM "listeners.xml">
<!ENTITY classes SYSTEM "classes.xml">
]>
<suite name="Local Execution" verbose="5">
&listeners;
<test name="Core Integration Tests" time-out="800000">
<groups>
<run>
<include name="failed"/>
</run>
</groups>
&classes;
</test>
</suite>
Listener.xml 内容是这样的
<listeners>
<listener class-name="com.myclass.Listeners.TestListener"/>
</listeners>
类文件是
<classes>
<class name="com.orders.tc_class1"/>
<class name="com.orders.tc_class2"/>
</classes>
这是我遇到的错误的一部分
org.testng.TestNGException:
TestNG by default disables loading DTD from unsecure Urls. If you need to explicitly load the DTD from a http url, please do so by using the JVM argument [-Dtestng.dtd.http=true]
at org.testng.xml.TestNGContentHandler.resolveEntity(TestNGContentHandler.java:102)
【问题讨论】:
这是安全github.com/cbeust/testng/pull/2023/files 的新实现。正如消息所说,设置 JVM 参数 [-Dtestng.dtd.http=true] 感谢@RahulL,但是如果我从 intellij 运行测试,如何添加该参数,右键单击 xml 然后运行 添加虚拟机参数testng.org/doc/idea.html或搜索 另外,如果你添加了 maven 依赖但忘记添加 testng.jar 文件作为外部库,也会出现同样的错误。 IntelliJ 正在修复这个问题:youtrack.jetbrains.com/issue/IDEA-234765 【参考方案1】:是的,这是 TestNG 的默认行为,我通过拉取请求引入了它以修复错误 https://github.com/cbeust/testng/issues/2022
要在 intelliJ 中设置 JVM 参数,请选择 Run > Edit Configurations
,然后在 VM 选项部分中的 -ea
之后添加此 JVM 参数(默认情况下会在此处。
更多编辑配置请参考官方文档here
添加了屏幕截图以便在 Intellij 中查找
参数值
-ea -Dtestng.dtd.http=true
如果上述方法在模板级别不起作用,这将解决它,即
Run--> Edit configuration --> template --> testng
【讨论】:
如何在没有互联网访问的情况下执行测试?我得到一个Connection Timeout
错误与那个 arg。
添加什么JVM参数?
这不应该是公认的答案,因为它不完整,另一个答案有正确的解决方案,包括“-Dtestng.dtd.http=true”
无论如何这是一种解决方法。正确的解决方案是将 改变你所有的
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"
在https上:
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"
【讨论】:
不错!就如此容易!没有讽刺。为我工作。 这是更合适的答案。 这比让你的所有团队添加一些东西来运行配置要好得多。 @msiles 你介意改变接受的答案吗?其他的更多的是一种解决方法...... 今天这对我有用。随后刷新文件,重新构建并重新运行。谢谢! 但是我的项目中没有这个 DOCTYPE 的东西,我仍然得到这个错误。【参考方案3】:-
右键类,选择运行-->运行配置
默认情况下,将在 testng 选项下生成一个具有相同类名的 testNg 类
选择该类并转到“参数”选项卡
在 VM 参数中提供 -Dtestng.dtd.http=true
就是这样。
【讨论】:
【参考方案4】:只是为了避免混淆,让那些不熟悉配置编辑选项等的人更容易,附上一个在 intellij 中完成它的快照。
正如 Krishnan M. 先生所回答的那样: 转到 Cucumber TestNGRunner 类的编辑配置,然后我们必须向 VM 选项添加另一个参数,如下所示-
如何编辑运行配置
如何添加>VM参数:“-Dtestng.dtd.http=true”
【讨论】:
我是这样添加的。当我使用工具栏上的按钮运行时,它可以工作,但是如果我在类文件上单击鼠标右键并运行,则会创建另一个运行配置而没有参数,并且它使用该参数运行,因此再次出现该错误【参考方案5】:-
如果您仅从 eclipse/其他 IDE 运行项目,请更新您的 TestNG 首选项并在 JVM_args 中添加语句
-Dtestng.dtd.http=true
。
如果您正在寻找从 CLI 运行 maven 的通用修复程序,那么请更新您的所有 TestNG.xml 文件
来自
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
到:
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
我个人更喜欢更新 DOCTYPE。
【讨论】:
即使创作者也不确定修复方法,谢谢【参考方案6】:添加这些 VM 选项:-ea -Dtestng.dtd.http=true
解决了这个问题。
但是,如果您想为任何类或方法的每次运行解决它,您需要在 TestNG 模板中添加相同的内容,请参阅此屏幕截图。
Intelij TestNg Template SS
【讨论】:
绝对是最好的答案:修复模板解决了所有测试运行的问题 最佳答案。 你重复了我的回答***.com/a/63517935/3470233【参考方案7】:另一个选项,如果希望它适用于所有测试,无论您从哪里运行它们,请通过设置系统属性在 pom 中设置该选项。为maven-surefire-plugin
和maven-failsafe-plugin
添加以下内容
<configuration>
<systemPropertyVariables>
<testng.dtd.http>true</testng.dtd.http>
</systemPropertyVariables>
</configuration>
【讨论】:
感谢您指出这一点——我不希望我的项目参与者经历设置 IntelliJ testng 运行配置的同样痛苦,这个选项真的很有帮助。 谢谢。你用这种简单的方法拯救了我的一天。【参考方案8】:在您的套件文件中将“http://testng.org/testng-1.0.dtd”更改为“https://testng.org/testng-1.0.dtd”。
【讨论】:
【参考方案9】:在 TestNG 文件中,将 参数中的值 (http) 更改为 https,如下图所示。就是这样。
【讨论】:
这就是解决方案,不知道为什么没有人支持它。【参考方案10】:详情例外如下:- org.testng.TestNGException: TestNG 默认禁用从不安全的 URL 加载 DTD。如果需要从 http url 显式加载 DTD,请使用 JVM 参数 [-Dtestng.dtd.http=true]
要修复异常,它需要设置 JVM 参数。在 Eclipse 中设置 JVM 参数:
-
打开 Eclipse 并转到 Window -> Preferences
在左侧展开TestNG并点击Run/Debug
在右侧:在 JVM args 文本字段中键入以下文本:
-Dtestng.dtd.http=true
点击应用并关闭按钮
【讨论】:
【参考方案11】:要为仅从 IntelliJ 运行的所有测试修复此问题,可以使用 -Dtestng.dtd.http=true
vm 选项更新 TestNG 模板。将需要删除现有的测试运行或手动添加 vm 选项(我只是删除它们)。模板更改后运行的所有测试都将具有提到的 vm 选项。
Run/Debug Configurations
-> Edit Configurations
-> Templates
-> TestNG
【讨论】:
【参考方案12】:请按照以下所有步骤操作。在 Eclipse 中配置 JVM 参数后完美运行。
问题陈述:
TestNG 默认禁用从不安全的 URL 加载 DTD 如果需要从 http url 显式加载 DTD,请使用 JVM 参数 [-Dtestng.dtd.http=true]
通常我们需要在启动规则项目的 JVM 上使用某些 VM 参数。
为此,需要执行以下 2 个步骤: • 使用默认 JVM 参数定义新安装的 JRE: -- 转到 Eclipse 窗口 > 首选项 > Java > 已安装的 JRE"。 -- 选择默认 JRE 并单击复制。 -- 根据您的选择更改 JRE 名称,例如 myJRE 并输入默认 VM 参数为 “-Dtestng.dtd.http=true” enter image description here
-- 单击完成。 --- 取消选中默认 JRE 并检查添加了 VM 参数的新 JRE。 --- 点击应用、应用和关闭。
• 配置规则项目启动配置以使用新安装的 JRE: -- 转到运行 > 运行配置 --- 运行配置对话框可见。
enter image description here
--- 输入您选择的名称,例如:RunConfigWithJVMArgs。 --- 测试选项卡: 默认显示项目名称。 选择“Suite”选项并浏览项目文件夹中的 testng.xml 文件。例如:src/main/resources/testng.xml enter image description here
--- 参数选项卡: 在 VM 参数文本字段中输入“-Dtestng.dtd.http=true”。 --- JRE 选项卡: 选择“Alternate JRE :”作为新添加的带有JVM 参数的JRE。 --- 无需其他更改。 --- 点击应用,然后运行。
如果套件在 Eclipse 中启动并成功运行,那么当您运行打包的 JAR 文件时它也将起作用。
注意:在Eclipse中更改以上配置后,执行mvn clean和mvn package –Dmaven.test.skip=true。
一旦 JAR 准备就绪,它将使用 JVM 参数配置新的 JRE,并将修复问题陈述。
【讨论】:
【参考方案13】:要在 Eclipse 中解决此问题,请按照以下步骤操作:
-
转到 windows -> 首选项->TestNG->运行/调试
在 JVM_args 添加以下 -Dtestng.dtd.http=true
点击应用并关闭按钮。
右键单击您的项目选择 Maven -> 更新项目
现在转到您的 pom.xml 并单击 Run as ->Maven Test
现在下面的问题“TestNG 默认禁用从不安全的 URL 加载 DTD”将不存在。
【讨论】:
【参考方案14】:我最近遇到了这个错误,并尝试了上面给出的解决方案,但仍然出现错误。 无论如何,设置 JVM 参数是解决此问题的方法,如上面的答案所示,但我又添加了一个步骤,它解决了我的问题。
我更改了 TestNG 配置中的参数,如下所示(添加步骤):
我还更改了 LoginTests.testSuccessfullLogin 中的参数。 (这一步只会 如果您已经运行了该问题的程序,则有必要。否则,如果您正在运行 第一次使用该程序,它将使用相同的方式创建此配置 TestNG 配置中的参数。)
我还注意到,如果您还没有完成上述第二步,它将创建一个名为 LoginTests.testSuccessfullLogin(1) 的新配置,并使用更改后的参数来运行测试。
【讨论】:
以上是关于TestNG 默认禁用从不安全的 Url 加载 DTD的主要内容,如果未能解决你的问题,请参考以下文章
不安全登录被阻止:您无法获取访问令牌或从不安全页面登录到此应用程序。尝试将页面重新加载为 https://