默认情况下,TestNG 禁止从不安全的 URL 加载 DTD

msi*_*les 23 java xml testng selenium

我正在使用 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>
Run Code Online (Sandbox Code Playgroud)

Listener.xml 内容就像

<listeners>
    <listener class-name="com.myclass.Listeners.TestListener"/>
</listeners>
Run Code Online (Sandbox Code Playgroud)

而类文件是

<classes>
    <class name="com.orders.tc_class1"/>
    <class name="com.orders.tc_class2"/>
</classes>
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误的一部分

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)
Run Code Online (Sandbox Code Playgroud)

Kri*_*van 40

是的,这是 TestNG 的默认行为,我通过拉取请求引入它来修复错误https://github.com/cbeust/testng/issues/2022

要在 intelliJ 中设置 JVM 参数,请选择Run > Edit Configurations,然后在 VM 选项部分中添加此 JVM 参数-ea(默认情况下会在那里。

有关编辑配置的更多信息,请参阅此处的官方文档

添加屏幕截图以便于在 Intellij 中查找

参数值

-ea -Dtestng.dtd.http=true

在此处输入图片说明

如果以上在模板级别不起作用,这将修复它,这是

Run--> Edit configuration --> template --> testng
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 无论如何,这是一个解决方法。正确的解决方案是将 &lt;DOCTYPE&gt; 中的 url 更改为 https。根据@Amerousful 的回答 (7认同)
  • 这不应该是接受的答案,因为它不完整,另一个答案有正确的解决方案,包括“-Dtestng.dtd.http=true” (2认同)

Ame*_*ful 35

只需改变你的一切

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"

在 https 上:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"

  • 这比让所有团队添加一些东西来运行配置要好得多。@msiles 你介意改变对此接受的答案吗?其他的更多的是一种解决方法...... (7认同)

小智 13

  1. 右键单击该类,选择运行--> 运行配置
  2. 默认情况下,将在 testng 选项下生成一个具有相同类名的 testNg 类
  3. 选择该类并转到参数选项卡
  4. 在 VM 参数中提供 -Dtestng.dtd.http=true

就是这样。


Sat*_*rma 10

只是为了避免混淆并让一些不熟悉配置编辑选项等的人更容易附加一个快照以在 intellij 中完成它。

所以正如- Krishnan M. 先生的回答:转到您的 Cucumber TestNGRunner 类的编辑配置,然后我们必须向 VM 选项添加另一个参数,如下所示-

  1. 如何编辑运行配置 如何编辑运行配置

  2. 如何添加 >VM 参数:“-Dtestng.dtd.http=true” 如何添加 >VM 参数:“-Dtestng.dtd.http=true”


Far*_*aik 7

  1. 如果您仅从 eclipse/其他 IDE 运行您的项目,请更新您的 TestNG 首选项并-Dtestng.dtd.http=true在 JVM_args 中添加语句。
  2. 如果您正在寻找从 CLI 运行 maven 的一般修复程序,然后更新所有 TestNG.xml 文件

 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
Run Code Online (Sandbox Code Playgroud)

到:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢更新 DOCTYPE。

  • 即使创作者也不确定修复,谢谢你 (2认同)

小智 6

添加这些 VM 选项:-ea -Dtestng.dtd.http=true解决了这个问题。
但是如果你想为任何类或方法的每次运行解决它,你需要在TestNG模板中添加相同的内容,请参考这个截图。 Intelij TestNg 模板 SS


IPl*_*ato 5

另一个选项,如果希望它适用于所有测试,无论您从哪里运行它们,请通过设置系统属性在 pom 中设置该选项。为maven-surefire-plugin和添加以下内容maven-failsafe-plugin

                    <configuration>
                        <systemPropertyVariables>
                            <testng.dtd.http>true</testng.dtd.http>
                        </systemPropertyVariables>
                    </configuration>
Run Code Online (Sandbox Code Playgroud)