Java 中文官方教程 2022 版(三十八)(1)

简介: Java 中文官方教程 2022 版(三十八)

实现 SAX 验证

原文:docs.oracle.com/javase/tutorial/jaxp/sax/validation.html

示例程序SAXLocalNameCount默认使用非验证解析器,但也可以激活验证。激活验证允许应用程序判断 XML 文档是否包含正确的标记,或这些标记是否按正确顺序出现。换句话说,它可以告诉您文档是否有效。然而,如果未激活验证,它只能告诉文档是否格式良好,就像在上一节中删除 XML 元素的闭合标记时所示。要进行验证,XML 文档需要关联到一个 DTD 或 XML 模式。SAXLocalNameCount程序可以选择这两个选项。

选择解析器实现

如果没有指定其他工厂类,则将使用默认的SAXParserFactory类。要使用来自不同制造商的解析器,可以更改指向其的环境变量的值。您可以从命令行执行:

java -Djavax.xml.parsers.SAXParserFactory=*yourFactoryHere* [...]

您指定的工厂名称必须是完全限定的类名(包括所有包前缀)。有关更多信息,请参阅SAXParserFactory类的newInstance()方法中的文档。

使用验证解析器

直到这一点,本课程一直集中在非验证解析器上。本节将检查验证解析器,以了解在使用它解析示例程序时会发生什么。

关于验证解析器必须理解的两件事:

  • 需要模式或 DTD。
  • 因为存在模式或 DTD,只要可能,ContentHandler.``ignorableWhitespace()方法就会被调用。

可忽略的空格

当存在 DTD 时,解析器将不再调用characters()方法处理它知道是无关紧要的空格。从只对 XML 数据感兴趣的应用程序的角度来看,这是一件好事,因为应用程序永远不会受到纯粹为了使 XML 文件可读而存在的空格的干扰。

另一方面,如果您正在编写一个过滤 XML 数据文件的应用程序,并且希望输出一个同样可读的文件版本,那么这些空格将不再是无关紧要的:它们将变得至关重要。要获取这些字符,您需要在应用程序中添加ignorableWhitespace方法。为了处理解析器看到的任何(通常是)可忽略的空格,您需要添加类似以下代码以实现ignorableWhitespace事件处理程序。

public void ignorableWhitespace (char buf[], int start, int length) throws SAXException { 
    emit("IGNORABLE");
}

这段代码只是生成一条消息,让您知道看到了可忽略的空格。然而,并非所有解析器都是平等的。SAX 规范不要求调用此方法。Java XML 实现在 DTD 可能时会这样做。

配置工厂

SAXParserFactory 需要设置为使用验证解析器而不是默认的非验证解析器。 下面是 SAXLocalNameCount 示例的 main() 方法中的代码,显示了如何配置工厂以实现验证解析器。

static public void main(String[] args) throws Exception {
    String filename = null;
    boolean dtdValidate = false;
    boolean xsdValidate = false;
    String schemaSource = null;
    for (int i = 0; i < args.length; i++) {
        if (args[i].equals("-dtd")) {
            dtdValidate = true;
        }
        else if (args[i].equals("-xsd")) {
            xsdValidate = true;
        } 
        else if (args[i].equals("-xsdss")) {
            if (i == args.length - 1) {
               usage();
            }
            xsdValidate = true;
            schemaSource = args[++i];
        } 
        else if (args[i].equals("-usage")) {
            usage();
        }
        else if (args[i].equals("-help")) {
            usage();
        }
        else {
            filename = args[i];
            if (i != args.length - 1) {
                usage();
            }
        }
    }
    if (filename == null) {
        usage();
    }
    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setNamespaceAware(true);
    spf.setValidating(dtdValidate || xsdValidate);
    SAXParser saxParser = spf.newSAXParser();
    // ... 
}

在这里,SAXLocalNameCount 程序被配置为在启动时接受额外的参数,告诉它实现无验证、DTD 验证、XML Schema 定义(XSD)验证或针对特定模式源文件的 XSD 验证。 (这些选项的描述 -dtd-xsd-xsdss 也被添加到 usage() 方法中,但这里没有显示。)然后,工厂被配置为在调用 newSAXParser 时生成适当的验证解析器。 如 设置解析器 中所示,您还可以使用 setNamespaceAware(true) 来配置工厂返回一个支持命名空间的解析器。 Oracle 的实现支持任何配置选项的组合。 (如果某个实现不支持特定组合,则需要生成工厂配置错误)。

使用 XML Schema 进行验证

尽管本教程不涵盖 XML Schema 的完整内容,但本节向您展示了使用 XML Schema 语言编写的现有模式验证 XML 文档的步骤。 要了解有关 XML Schema 的更多信息,您可以查看在线教程 XML Schema Part 0: Primer,网址为 www.w3.org/TR/xmlschema-0/


注意 - 存在多种模式定义语言,包括 RELAX NG、Schematron 和 W3C 的 “XML Schema” 标准。 (即使 DTD 也算是一种 “模式”,尽管它是唯一不使用 XML 语法描述模式约束的模式。)然而,“XML Schema” 给我们带来了一个术语上的挑战。 虽然短语 “XML Schema schema” 可以很精确,但我们将使用短语 “XML Schema definition” 来避免冗余的外观。


要在 XML 文档中收到验证错误的通知,解析器工厂必须配置为创建验证解析器,如前一节所示。 此外,以下条件必须成立:

  • 在 SAX 解析器上必须设置适当的属性。
  • 必须设置适当的错误处理程序。
  • 文档必须与模式关联。

设置 SAX 解析器属性

从定义将用于设置属性的常量开始是有帮助的。 SAXLocalNameCount 示例设置了以下常量。

public class SAXLocalNameCount extends DefaultHandler {
    static final String JAXP_SCHEMA_LANGUAGE =
        "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
    static final String W3C_XML_SCHEMA =
        "http://www.w3.org/2001/XMLSchema";
    static final String JAXP_SCHEMA_SOURCE =
        "http://java.sun.com/xml/jaxp/properties/schemaSource";
}

注意 - 解析器工厂必须配置为生成一个既具有命名空间感知能力又进行验证的解析器。这在配置工厂中已经展示过。有关命名空间的更多信息在文档对象模型中提供,但现在,请理解模式验证是一个面向命名空间的过程。因为符合 JAXP 规范的解析器默认情况下不具有命名空间感知能力,所以必须设置用于模式验证的属性才能正常工作。


然后,您必须配置解析器以告诉它要使用哪种模式语言。在SAXLocalNameCount中,验证可以针对 DTD 或 XML Schema 执行。以下代码使用上面定义的常量来指定 W3C 的 XML Schema 语言作为程序启动时指定-xsd选项时要使用的语言。

// ...
if (xsdValidate) {
    saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
    // ...
}

除了设置错误处理中描述的错误处理外,在配置解析器进行基于模式的验证时可能会发生一个错误。如果解析器不符合 JAXP 规范,因此不支持 XML Schema,它可能会抛出SAXNotRecognizedException。为了处理这种情况,setProperty()语句被包裹在 try/catch 块中,如下面的代码所示。

// ...
if (xsdValidate) {
    try {
        saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
    }
    catch (SAXNotRecognizedException x){
        System.err.println("Error: JAXP SAXParser property not recognized: "
                           + JAXP_SCHEMA_LANGUAGE);
        System.err.println( "Check to see if parser conforms to the JAXP spec.");
        System.exit(1);
    }
}
// ...

将文档与模式关联

要使用 XML Schema 定义验证数据,必须确保 XML 文档与之关联。有两种方法可以做到这一点。

  • 通过在 XML 文档中包含模式声明。
  • 通过在应用程序中指定要使用的模式。

注意 - 当应用程序指定要使用的模式时,它会覆盖文档中的任何模式声明。


要在文档中指定模式定义,您可以创建如下的 XML:

<*documentRoot*
    xsi:noNamespaceSchemaLocation='*YourSchemaDefinition*.xsd'>

第一个属性定义了 XML 命名空间(xmlns)前缀xsi,代表 XML Schema 实例。第二行指定了要用于文档中没有命名空间前缀的元素的模式,即通常在任何简单、不复杂的 XML 文档中定义的元素。


注意 - 有关命名空间的更多信息包含在文档对象模型中的使用 XML Schema 进行验证中。现在,将这些属性视为您用来验证不使用它们的简单 XML 文件的"魔法咒语"。在学习更多关于命名空间的知识后,您将了解如何使用 XML Schema 来验证使用它们的复杂文档。这些想法在文档对象模型的使用多个命名空间进行验证中讨论。


您还可以在应用程序中指定模式文件,就像在SAXLocalNameCount中一样。

// ...
if (schemaSource != null) {
    saxParser.setProperty(JAXP_SCHEMA_SOURCE, new File(schemaSource));
}
// ...

在上面的代码中,变量schemaSource与一个模式源文件相关联,您可以通过使用-xsdss选项启动SAXLocalNameCount应用程序并提供要使用的模式源文件的名称来指向它。

验证解析器中的错误处理

重要的是要认识到,当文件未通过验证时抛出异常的唯一原因是由于设置错误处理中显示的错误处理代码。该代码在此作为提醒再次显示:

// ...
public void warning(SAXParseException spe) throws SAXException {
    out.println("Warning: " + getParseExceptionInfo(spe));
}
public void error(SAXParseException spe) throws SAXException {
    String message = "Error: " + getParseExceptionInfo(spe);
    throw new SAXException(message);
}
public void fatalError(SAXParseException spe) throws SAXException {
    String message = "Fatal Error: " + getParseExceptionInfo(spe);
    throw new SAXException(message);
}
// ...

如果这些异常没有被抛出,则验证错误将被简单地忽略。一般来说,SAX 解析错误是验证错误,尽管如果文件指定了解析器无法处理的 XML 版本,也会生成它。请记住,除非提供类似这里的错误处理程序,否则您的应用程序不会生成验证异常。

DTD 警告

如前所述,警告仅在 SAX 解析器处理 DTD 时生成。某些警告仅由验证解析器生成。非验证解析器的主要目标是尽可能快地运行,但它也会生成一些警告。

XML 规范建议由于以下原因生成警告:

  • 为实体、属性或符号提供额外的声明。(这些声明将被忽略。仅使用第一个。此外,请注意,当验证时,元素的重复定义总是会产生致命错误,就像您之前看到的那样。)
  • 引用未声明的元素类型。(仅当未声明的类型实际在 XML 文档中使用时才会发生有效性错误。当在 DTD 中引用未声明的元素时会产生警告。)
  • 为未声明的元素类型声明属性。

Java XML SAX 解析器还在其他情况下发出警告:

  • 在验证时不需要<!DOCTYPE ...>
  • 在不进行验证时引用未定义的参数实体。(在验证时会产生错误。尽管非验证解析器不需要读取参数实体,但 Java XML 解析器会这样做。因为这不是一个要求,所以 Java XML 解析器生成警告,而不是错误。)
  • 某些情况下,字符编码声明看起来不正确。

运行带验证的 SAX 解析器示例

在本节中,之前使用的SAXLocalNameCount示例程序将再次被使用,但这次将针对 XML Schema 或 DTD 进行验证。展示不同类型的验证的最佳方式是修改被解析的 XML 文件的代码,以及相关的模式和 DTD,以破坏处理并使应用程序生成异常。

尝试使用 DTD 验证错误进行实验

如上所述,这些示例重用了SAXLocalNameCount程序。您将在不进行验证运行 SAX 解析器示例中找到示例及其相关文件的位置。

  1. 如果尚未这样做,请将SAXLocalNameCount.java文件保存在名为sax的目录中。在文本编辑器中打开文件并进行上述更改。
  2. 如果尚未这样做,请按以下方式编译文件:
javac sax/SAXLocalNameCount.java
  1. 如果尚未这样做,请将示例 XML 文件rich_iii.xmltwo_gent.xml保存在data目录中。
  2. 运行带有 DTD 验证的SAXLocalNameCount程序。
    要做到这一点,运行程序时必须指定-dtd选项。
java sax/SAXLocalNameCount -dtd data/rich_iii.xml
  1. 您看到的结果将类似于这样:
Exception in thread "main" org.xml.sax.SAXException:
Error: URI=file:data/rich_iii.xml 
Line=4: Document is invalid: no grammar found.
  1. 此消息表示没有语法可以针对文档rich_iii.xml进行验证,因此它自动无效。换句话说,该消息表示您正在尝试验证文档,但没有声明 DTD,因为没有DOCTYPE声明。因此,现在您知道 DTD 是有效文档的要求。这是有道理的。
  2. 将示例 DTD 文件play.dtd保存在data目录中。
  3. 在文本编辑器中打开文件data/rich_iii.xml。在data/rich_iii.xml的开头插入以下DOCTYPE声明。(该声明将验证解析器指向名为play.dtd的 DTD 文件。如果激活了 DTD 验证,则将检查正在解析的 XML 文件的结构是否符合play.dtd中提供的结构。)
    <!DOCTYPE PLAY SYSTEM "play.dtd">
    不要忘记保存修改,但保持文件打开,因为稍后会再次需要它。
  4. 返回data/rich_iii.xml并修改第 18 行中角色"KING EDWARD The Fourth"的标记。
    将开始和结束标记从<PERSONA></PERSONA>更改为<PERSON></PERSON>。现在第 18 行应该是这样的:
    18:<PERSON>KING EDWARD The Fourth</PERSON>
    再次,不要忘记保存修改,并保持文件打开。
  5. 运行带有 DTD 验证的SAXLocalNameCount程序。
    这次,运行程序时将看到不同的错误:
java sax/SAXLocalNameCount -dtd data/rich_iii.xml
Exception in thread "main" org.xml.sax.SAXException: 
Error: URI=file:data/rich_iii.xml 
Line=26: Element type "PERSON" must be declared.
  1. 在这里,您可以看到解析器反对的一个未包含在 DTD data/play.dtd中的元素。
  2. data/rich_iii.xml中更正"KING EDWARD The Fourth"的标记。
    将开始和结束标记恢复为原始版本,<PERSONA></PERSONA>
  3. data/rich_iii.xml中,从第 16 行删除<TITLE>Dramatis Personae</TITLE>
    再次,不要忘记保存修改。
  4. 运行带有 DTD 验证的SAXLocalNameCount程序。
    与以前一样,您将看到另一个验证错误:
java sax/SAXLocalNameCount -dtd data/rich_iii.xml
Exception in thread "main" org.xml.sax.SAXException: 
Error: URI=file:data/rich_iii.xml 
Line=77: The content of element type "PERSONAE" must match "(TITLE,(PERSONA|PGROUP)+)".
  1. 通过从第 16 行删除<TITLE>元素,<PERSONAE>元素变得无效,因为它不包含 DTD 期望的<PERSONAE>元素的子元素。请注意,错误消息指出错误在data/rich_iii.xml的第 77 行,即使您从第 16 行删除了<TITLE>元素。这是因为<PERSONAE>元素的结束标记位于第 77 行,解析器只有在解析到元素结尾时才会抛出异常。
  2. 在文本编辑器中打开 DTD 文件data/play.dtd
    在 DTD 文件中,你可以看到 <PERSONAE> 元素的声明,以及可以在符合剧本 DTD 的 XML 文档中使用的所有其他元素。 <PERSONAE> 的声明如下所示。
<!ELEMENT PERSONAE (TITLE, (PERSONA | PGROUP)+)>
  1. 正如你所看到的,<PERSONAE> 元素需要一个 <TITLE> 子元素。 管道 (|) 键表示 <PERSONA><PGROUP> 子元素可以包含在 <PERSONAE> 元素中,而在 (PERSONA | PGROUP) 分组后的加号 (+) 键表示必须包含至少一个或多个这些子元素中的任意一个。
  2. <PERSONAE> 的声明中,在 TITLE 后面添加一个问号 (?) 键。
    在 DTD 中给子元素的声明添加一个问号,使得该子元素的一个实例的存在是可选的。
<!ELEMENT PERSONAE (TITLE?, (PERSONA | PGROUP)+)>
  1. 如果在元素后面添加星号 (*),则可以包含零个或多个该子元素的实例。 但是,在这种情况下,在文档的某个部分中有多个标题是没有意义的。
    不要忘记保存对 data/play.dtd 所做的修改。
  2. 运行 SAXLocalNameCount 程序,并激活 DTD 验证。
java sax/SAXLocalNameCount -dtd data/rich_iii.xml
  1. 这次,您应该看到 SAXLocalNameCount 的正确输出,没有错误。

实验模式验证错误

前面的练习演示了使用 SAXLocalNameCount 验证 XML 文件与 DTD 的过程。 在这个练习中,您将使用 SAXLocalNameCount 验证不同的 XML 文件,同时还要针对标准 XML Schema 定义和自定义模式源文件进行验证。 同样,通过修改 XML 文件和模式,使解析器抛出错误来演示这种类型的验证。

如上所述,这些示例重用了 SAXLocalNameCount 程序。 可以在 不进行验证运行 SAX 解析器示例 中找到示例及其相关文件的位置。

  1. 如果还没有这样做,请将 SAXLocalNameCount.java 文件保存在名为 sax 的目录中。 在文本编辑器中打开文件并进行上述更改。
  2. 如果还没有这样做,请按照以下方式编译文件:
javac sax/SAXLocalNameCount.jav
  1. 将示例 XML 文件 personal-schema.xml 保存在 data 目录中,然后在文本编辑器中打开它。
    这是一个简单的 XML 文件,提供了一个小公司员工的姓名和联系方式。 在这个 XML 文件中,你会看到它已经与一个模式定义文件 personal.xsd 相关联。
    <personnel xsi:noNamespaceSchemaLocation='personal.xsd'>
  2. 将示例 XSD Schema 文件 personal.xsd 保存在 data 目录中,然后在文本编辑器中打开它。
    这个模式定义了关于每个员工所需的信息种类,以便将与模式关联的 XML 文档视为有效。例如,通过检查模式定义,你可以看到每个person元素需要一个name,每个人的名字必须包括一个family名和一个given名。员工还可以选择性地拥有电子邮件地址和 URL。
  3. data/personal.xsd中,将person元素所需的电子邮件地址最小数量从0更改为1
    email元素的声明现在如下。
    <xs:element ref="email" minOccurs='1' maxOccurs='unbounded'/>
  4. data/personal-schema.xml中,从person元素one.worker中删除email元素。
    Worker One 现在看起来像这样:
<person id="one.worker">
  <name><family>Worker</family> <given>One</given></name>
  <link manager="Big.Boss"/>
</person>
  1. personal-schema.xml运行SAXLocalNameCount,不进行模式验证。
java sax/SAXLocalNameCount data/personal-schema.xml
  1. SAXLocalNameCount通知你每个元素在personal-schema.xml中出现的次数。
Local Name "email" occurs 5 times
Local Name "name" occurs 6 times
Local Name "person" occurs 6 times
Local Name "family" occurs 6 times
Local Name "link" occurs 6 times
Local Name "personnel" occurs 1 times
Local Name "given" occurs 6 times
  1. 你会发现email只出现了五次,而personal-schema.xml中有六个person元素。因此,因为我们将email元素的最小出现次数设置为每个person元素为 1,我们知道这个文档是无效的。然而,因为SAXLocalNameCount没有被告知要根据模式验证,所以没有报告错误。
  2. 再次运行SAXLocalNameCount,这次指定personal-schema.xml文档应该根据personal.xsd模式定义进行验证。
    正如你在上面看到的使用 XML 模式验证,SAXLocalNameCount有一个选项可以启用模式验证。使用以下命令运行SAXLocalNameCount
java sax/SAXLocalNameCount -xsd data/personal-schema.xml
  1. 这次,你将看到以下错误消息。
Exception in thread "main" org.xml.sax.SAXException: Error: 
URI=file:data/personal-schema.xml 
Line=14: cvc-complex-type.2.4.a: Invalid content was found starting with 
element 'link'. 
One of '{email}' is expected.
  1. email元素恢复到person元素one.worker
  2. 第三次运行SAXLocalNameCount,再次指定personal-schema.xml文档应该根据personal.xsd模式定义进行验证。
java sax/SAXLocalNameCount -xsd data/personal-schema.xml
  1. 这次你将看到正确的输出,没有错误。
  2. 再次在文本编辑器中打开personal-schema.xml
  3. personnel元素中删除模式定义personal.xsd的声明。
    personnel元素中删除斜体代码。
    <personnel *xsi:noNamespaceSchemaLocation='personal.xsd'/*>
  4. 再次运行SAXLocalNameCount,再次指定模式验证。
java sax/SAXLocalNameCount -xsd data/personal-schema.xml
  1. 很明显,这不会起作用,因为尚未声明要验证 XML 文件的模式定义。你将看到以下错误。
Exception in thread "main" org.xml.sax.SAXException: 
Error: URI=file:data/personal-schema.xml 
Line=2: cvc-elt.1: Cannot find the declaration of element 'personnel'.
  1. 再次运行SAXLocalNameCount,这次在命令行传递模式定义文件。
java sax/SAXLocalNameCount -xsdss data/personal.xsd data/personal-schema.xml
  1. 这次你使用了允许指定不在应用程序中硬编码的模式定义的SAXLocalNameCount选项。你应该看到正确的输出。

Java 中文官方教程 2022 版(三十八)(2)https://developer.aliyun.com/article/1488148

相关文章
|
2天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)
【5月更文挑战第3天】本文介绍了如何在Web自动化测试中使用JavaScript执行器(JavascriptExecutor)来完成Selenium API无法处理的任务。首先,需要将WebDriver转换为JavascriptExecutor对象,然后通过executeScript方法执行JavaScript代码。示例用法包括设置JS代码字符串并调用executeScript。文章提供了两个实战场景:一是当时间插件限制输入时,用JS去除元素的readonly属性;二是处理需滚动才能显示的元素,利用JS滚动页面。还给出了一个滚动到底部的代码示例,并提供了详细步骤和解释。
31 10
|
2天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
25 0
|
1天前
|
算法 Java Python
保姆级Java入门练习教程,附代码讲解,小白零基础入门必备
保姆级Java入门练习教程,附代码讲解,小白零基础入门必备
|
1天前
|
Web App开发 JavaScript 测试技术
《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
【5月更文挑战第9天】本文介绍了在Appium中处理App自动化测试中遇到的Toast元素定位的方法。Toast在Web UI测试中也常见,通常作为轻量级反馈短暂显示。文章提供了两种定位Toast元素的技巧.
10 0
|
2天前
|
Web App开发 缓存 前端开发
《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)
【5月更文挑战第8天】这篇文档介绍了如何在IE、Chrome和Firefox浏览器中处理不信任证书的问题。作者北京-宏哥分享了如何通过编程方式跳过浏览器的证书警告,直接访问不受信任的HTTPS网站。文章分为几个部分,首先简要介绍了问题背景,然后详细讲解了在Chrome浏览器中的两种方法,包括代码设计和运行效果,并给出了其他浏览器的相关信息和参考资料。最后,作者总结了处理此类问题的一些通用技巧。
16 2
|
2天前
|
Java Android开发
【Java开发指南 | 第十八篇】Eclipse安装教程
【Java开发指南 | 第十八篇】Eclipse安装教程
11 2
|
2天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(四十三)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-上篇(详解教程)
【5月更文挑战第7天】本文介绍了如何在Java+Selenium自动化测试中处理浏览器对不信任证书的处理方法,特别是针对IE、Chrome和Firefox浏览器。在某些情况下,访问HTTPS网站时会遇到证书不可信的警告,但可以通过编程方式跳过这些警告。
13 1
|
2天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)
【5月更文挑战第6天】本文介绍了如何使用Selenium处理含有iframe的网页。作者首先解释了iframe是什么,即HTML中的一个框架,用于在一个页面中嵌入另一个页面。接着,通过一个实战例子展示了在QQ邮箱登录页面中,由于输入框存在于iframe内,导致直接定位元素失败。作者提供了三种方法来处理这种情况:1)通过id或name属性切换到iframe;2)使用webElement对象切换;3)通过索引切换。最后,给出了相应的Java代码示例,并提醒读者根据iframe的实际情况选择合适的方法进行切换和元素定位。
9 0
|
2天前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
【5月更文挑战第5天】本文介绍了HTML中的`iframe`标签,它用于在网页中嵌套其他网页。`iframe`常用于加载外部内容或网站的某个部分,以实现页面美观。文章还讲述了使用Selenium自动化测试时如何处理`iframe`,通过`switchTo().frame()`方法进入`iframe`,完成相应操作,然后使用`switchTo().defaultContent()`返回主窗口。此外,文章提供了一个包含`iframe`的HTML代码示例,并给出了一个简单的自动化测试代码实战,演示了如何在`iframe`中输入文本。
17 3
|
2天前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)
【5月更文挑战第4天】本文介绍了如何使用JavaScriptExecutor在自动化测试中实现元素高亮显示。通过创建并执行JS代码,可以改变元素的样式,例如设置背景色和边框,以突出显示被操作的元素。文中提供了一个Java示例,展示了如何在Selenium中使用此方法,并附有代码截图和运行效果展示。该技术有助于跟踪和理解测试过程中的元素交互。
10 0