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 &gt; 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” 无论如何这是一种解决方法。正确的解决方案是将 中的 url 更改为 https。根据@Amerousful 的回答 为我工作。谢谢【参考方案2】:

改变你所有的

&lt;!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"

在https上:

&lt;!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-pluginmaven-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的主要内容,如果未能解决你的问题,请参考以下文章

如何根据条件禁用 TestNG 测试

不安全登录被阻止:您无法获取访问令牌或从不安全页面登录到此应用程序。尝试将页面重新加载为 https://

使用 SnakeYAML 从不受信任的来源加载 YAML 文件时会发生啥?

简单的LNMP安全加固

通知内容扩展中的 WKWebView 在手机锁定时从不加载

为包含路径变量的 url 禁用 spring 安全性 [重复]