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

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

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

处理词法事件

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

到目前为止,您已经消化了许多 XML 概念,包括 DTD 和外部实体。您还学会了如何使用 SAX 解析器。本课程的其余部分涵盖了您只有在编写基于 SAX 的应用程序时才需要理解的高级主题。如果您的主要目标是编写基于 DOM 的应用程序,您可以直接跳转到文档对象模型。

您之前看到,如果您将文本写出为 XML,您需要知道是否处于 CDATA 部分中。如果是,则尖括号(<)和和号(&)应保持不变输出。但如果不在 CDATA 部分中,则应将它们替换为预定义的实体<&。但是您如何知道自己是否在处理 CDATA 部分?

另一方面,如果您以某种方式过滤 XML,您希望传递注释。通常解析器会忽略注释。您如何获取注释以便可以回显它们?

本节回答了这些问题。它向您展示了如何使用org.xml.sax.ext.LexicalHandler来识别注释、CDATA 部分和对解析实体的引用。

注释、CDATA 标记和对解析实体的引用构成词法信息-即,涉及 XML 文本本身而不是 XML 信息内容的信息。当然,大多数应用程序只关注 XML 文档的内容。这些应用程序将不使用LexicalEventListener API。但是输出 XML 文本的应用程序会发现它非常有价值。


注意 - 词法事件处理是一个可选的解析器功能。解析器实现不需要支持它。(参考实现是这样的。)本讨论假定您的解析器支持它。


LexicalHandler的工作原理

要在 SAX 解析器看到词法信息时得到通知,您需要使用LexicalHandler配置解析器底层的XmlReaderLexicalHandler接口定义了以下事件处理方法。

comment(String comment)

将注释传递给应用程序。

startCDATA(), endCDATA()

告诉您 CDATA 部分何时开始和结束,这告诉您的应用程序下次调用characters()时可以期望什么样的字符。

startEntity(String name), endEntity(String name)

给出解析实体的名称。

startDTD(String name, String publicId, String systemId), endDTD()

告诉您正在处理 DTD,并标识它。

要激活词法处理程序,您的应用程序必须扩展DefaultHandler并实现LexicalHandler接口。然后,您必须配置您的XMLReader实例,使解析器委托给它,并配置它将词法事件发送到您的词法处理程序,如下所示。

// ...
SAXParser saxParser = factory.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler",
                      handler); 
// ...

在这里,您可以使用XMLReader类中定义的setProperty()方法来配置XMLReader。作为 SAX 标准的一部分定义的属性名称是 URN,http://xml.org/sax/properties/lexical-handler

最后,添加类似以下代码来定义将实现接口的适当方法。

// ...
public void warning(SAXParseException err) {
    // ...
}
public void comment(char[] ch, int start, int length) throws SAXException {
    // ...   
}
public void startCDATA() throws SAXException {
    // ...
}
public void endCDATA() throws SAXException {
    // ...
}
public void startEntity(String name) throws SAXException {
    // ...
}
public void endEntity(String name) throws SAXException {
    // ...
}
public void startDTD(String name, String publicId, String systemId)
    throws SAXException {
    // ...
}
public void endDTD() throws SAXException {
    // ...
}
private void echoText() {
    // ...
}
// ...

这段代码将把您的解析应用程序转换为一个词法处理程序。剩下的就是为这些新方法中的每一个指定一个要执行的操作。

使用 DTDHandler 和 EntityResolver

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

本节介绍了另外两个 SAX 事件处理程序:DTDHandlerEntityResolver。当 DTD 遇到未解析的实体或符号声明时,将调用DTDHandler。当需要将 URN(公共 ID)解析为 URL(系统 ID)时,将使用EntityResolver

DTDHandler API

选择解析器实现展示了引用包含二进制数据(如图像文件)的文件的方法,使用 MIME 数据类型。这是最简单、最可扩展的机制。但是,为了与旧的 SGML 样式数据兼容,也可以定义未解析的实体。

NDATA关键字定义了一个未解析的实体:

NDATA关键字表示此实体中的数据不是可解析的 XML 数据,而是使用其他符号的数据。在本例中,符号被命名为gif。然后 DTD 必须包含该符号的声明,类似于以下内容。

当解析器看到未解析的实体或符号声明时,除了将其传递给应用程序使用DTDHandler接口外,它不会对信息做任何处理。该接口定义了两个方法。

  • notationDecl(String name, String publicId, String systemId)
  • unparsedEntityDecl(String name, String publicId, String systemId, String notationName

notationDecl方法传递符号的名称和公共或系统标识符,或两者,取决于 DTD 中声明了哪个。unparsedEntityDecl方法传递实体的名称、适当的标识符和它使用的符号的名称。


注意 - DTDHandler接口由DefaultHandler类实现。


符号也可以用于属性声明。例如,以下声明需要 GIF 和 PNG 图像文件格式的符号。

<!ENTITY image EMPTY>
<!ATTLIST image ...  type  NOTATION  (gif | png) "gif">

在这里,类型声明为 gif 或 png。如果没有指定,则默认为 gif。

无论符号引用用于描述未解析的实体还是属性,都由应用程序进行适当处理。解析器对符号的语义一无所知。它只传递声明。

EntityResolver API

EntityResolver API 允许您将公共 ID(URN)转换为系统 ID(URL)。例如,您的应用程序可能需要将类似href="urn:/someName"的内容转换为"http://someURL"

EntityResolver接口定义了一个方法:

resolveEntity(String publicId, String systemId)

这种方法返回一个InputSource对象,可以用来访问实体的内容。将 URL 转换为InputSource很容易。但作为系统 ID 传递的 URL 很可能是原始文档的位置,而这个位置很可能在网络上的某个地方。要访问本地副本(如果有的话),必须在系统的某处维护一个目录,将名称(公共 ID)映射到本地 URL。

更多信息

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

以下链接提供了关于本课程中介绍的技术的进一步有用信息。

课程:文档对象模型

原文:docs.oracle.com/javase/tutorial/jaxp/dom/index.html

这节课介绍了文档对象模型(DOM)。DOM 是一种标准的树结构,其中每个节点包含 XML 结构中的一个组件。最常见的节点类型是元素节点和文本节点。使用 DOM 函数可以创建节点,删除节点,更改它们的内容,并遍历节点层次结构。

这节课的示例演示了如何解析现有的 XML 文件以构建 DOM,显示和检查 DOM 层次结构,并探索命名空间的语法。它还展示了如何从头开始创建 DOM,并了解如何使用 Sun 的 JAXP 实现中的一些特定于实现的功能将现有数据集转换为 XML。

何时使用 DOM

原文:docs.oracle.com/javase/tutorial/jaxp/dom/when.html

文档对象模型标准首先是为文档(例如文章和书籍)设计的。此外,JAXP 1.4.2 实现支持 XML Schema,这对于任何特定应用程序都可能是一个重要考虑因素。

另一方面,如果您处理简单的数据结构,且 XML Schema 不是您计划的重要部分,那么您可能会发现更适合您目的的是 JDOM 或 dom4j 等更面向对象的标准之一。

从一开始,DOM 旨在是与语言无关的。由于它是为诸如 C 和 Perl 之类的语言设计的,DOM 并没有利用 Java 的面向对象特性。这一事实,加上文档和数据之间的区别,也有助于解释处理 DOM 与处理 JDOM 或 dom4j 结构之间的差异。

在本节中,我们将研究这些标准背后的模型之间的差异,以帮助您选择最适合您应用程序的标准。

文档与数据

DOM 中使用的文档模型与 JDOM 或 dom4j 中使用的数据模型之间的主要差异在于:

  • 存在于层次结构中的节点类型
  • 混合内容的能力

主要是数据层次结构中的“节点”构成的差异主要导致了使用这两种模型进行编程的差异。然而,与其他任何因素相比,混合内容的能力最能解释标准如何定义节点的差异。因此,我们首先来看一下 DOM 的混合内容模型。

混合内容模型

在 DOM 层次结构中,文本和元素可以自由混合。这种结构称为 DOM 模型中的混合内容。

文档中经常出现混合内容。例如,假设您想要表示这种结构:

这是一个重要的想法。

DOM 节点的层次结构可能如下所示,其中每行代表一个节点:

ELEMENT: sentence
   + TEXT: This is an
   + ELEMENT: bold
     + TEXT: important
   + TEXT: idea.

请注意,sentence 元素包含文本,然后是一个子元素,然后是额外的文本。文本和元素的混合定义了混合内容模型。

节点类型

为了提供混合内容的能力,DOM 节点本质上非常简单。在上述示例中,第一个元素的“内容”(其值)只是标识它是什么类型的节点。

第一次使用 DOM 的用户通常会被这个事实搞糊涂。在导航到节点后,他们要求节点的“内容”,并期望得到一些有用的东西。相反,他们只能找到元素的名称,sentence


注意 - DOM 节点 API 定义了nodeValue()nodeType()nodeName()方法。对于第一个元素节点,nodeName()返回sentence,而nodeValue()返回 null。对于第一个文本节点,nodeName()返回#text,而nodeValue()返回“This is an”。重要的一点是,元素的与其内容不同。


在上面的例子中,询问“句子”的“文本”是什么意思?根据您的应用程序,以下任何一种都可能是合理的:

  • 这是一个
  • 这是一个想法。
  • 这是一个重要的想法。
  • 这是一个重要的想法。

一个更简单的模型

使用 DOM,您可以自由创建所需的语义。但是,您还需要进行必要的处理以实现这些语义。另一方面,像 JDOM 和 dom4j 这样的标准使得执行简单任务变得更容易,因为层次结构中的每个节点都是一个对象。

尽管 JDOM 和 dom4j 允许元素具有混合内容,但它们并非主要设计用于这种情况。相反,它们针对的是 XML 结构包含数据的应用程序。

数据结构中的元素通常只包含文本或其他元素,而不是两者兼有。例如,这里是代表简单地址簿的一些 XML:

<addressbook>
    <entry>
        <name>Fred</name>
        <email>fred@home</email>
    </entry>
      ...
</addressbook>

注意 - 对于像这样非常简单的 XML 数据结构,您还可以使用内置在 Java 平台 1.4 版本中的正则表达式包(java.util.regex)。


在 JDOM 和 dom4j 中,当您导航到包含文本的元素后,您可以调用诸如text()之类的方法来获取其内容。但是,在处理 DOM 时,您必须检查子元素列表以“组合”节点的文本,就像您之前看到的那样 - 即使该列表只包含一个项目(TEXT 节点)。

因此,对于简单的数据结构,比如地址簿,您可以通过使用 JDOM 或 dom4j 来节省一些工作量。即使数据在技术上是“混合的”,但在给定节点中始终只有一个(且仅有一个)文本段落时,使用其中一个模型可能是有意义的。

这是一个这种结构的示例,也可以很容易地在 JDOM 或 dom4j 中处理:

<addressbook>
    <entry>Fred
        <email>fred@home</email>
    </entry>
      ...
</addressbook>

在这里,每个条目都有一些标识性文本,后面跟着其他元素。有了这种结构,程序可以导航到一个条目,调用text()来找出它属于谁,并在正确的节点处处理子元素。

增加复杂性

但是,为了全面了解在搜索或操作 DOM 时需要执行的处理类型,了解 DOM 可能包含的节点类型是很重要的。

这里有一个说明这一点的示例。这是这些数据的表示:

<sentence>
    The &projectName; <![CDATA[<i>project</i>]]> is
    <?editor: red><bold>important</bold><?editor: normal>.
</sentence>

这个句子包含一个实体引用 - 指向在其他地方定义的实体的指针。在这种情况下,实体包含项目的名称。示例还包含一个 CDATA 部分(未解释的数据,类似于 HTML 中的

 数据)以及处理指令),在这种情况下告诉编辑器在呈现文本时使用的颜色。

这是该数据的 DOM 结构。它代表了一个健壮应用程序应该准备处理的结构类型:

+ ELEMENT: sentence
       + TEXT: The
       + ENTITY REF: projectName
        + COMMENT: 
        The latest name we are using
        + TEXT: Eagle
       + CDATA: <i>project</i>
       + TEXT: is
       + PI: editor: red
       + ELEMENT: bold
          + TEXT: important
       + PI: editor: normal

这个例子描述了 DOM 中可能出现的节点类型。尽管你的应用程序可能大部分时间都能忽略它们,但一个真正健壮的实现需要识别和处理每一个节点。

类似地,导航到一个节点的过程涉及处理子元素,忽略你不感兴趣的元素并检查你感兴趣的元素,直到找到你感兴趣的节点。

一个处理固定、内部生成数据的程序可以承担简化假设:处理指令、注释、CDATA 节点和实体引用在数据结构中不存在。但是真正健壮的应用程序,尤其是处理来自外部世界的各种数据的应用程序,必须准备处理所有可能的 XML 实体。

(一个“简单”的应用程序只能在输入数据包含它所期望的简化 XML 结构时工作。但是没有验证机制来确保更复杂的结构不存在。毕竟,XML 的设计目的就是允许它们存在。)

为了更加健壮,DOM 应用程序必须做到以下几点:

  1. 在搜索元素时:
  1. 忽略注释、属性和处理指令。
  2. 允许子元素不按预期顺序出现的可能性。
  3. 如果不进行验证,则跳过包含可忽略空格的 TEXT 节点。
  1. 在提取节点的文本时:
  1. 从 CDATA 节点以及文本节点提取文本。
  2. 在收集文本时忽略注释、属性和处理指令。
  3. 如果遇到实体引用节点或另一个元素节点,则递归(即对所有子节点应用文本提取过程)。

当然,许多应用程序不必担心这些事情,因为它们看到的数据类型将受到严格控制。但如果数据可能来自各种外部来源,那么应用程序可能需要考虑这些可能性。

执行这些功能所需的代码在本课程的末尾的 搜索节点 和 获取节点内容 中给出。现在,目标只是确定 DOM 是否适合你的应用程序。

选择你的模型

正如您所见,当您使用 DOM 时,即使是从节点获取文本这样的简单操作也需要一些编程。因此,如果您的程序处理简单的数据结构,那么 JDOM、dom4j,甚至 1.4 版本的正则表达式包(java.util.regex)可能更适合您的需求。

另一方面,对于完整的文档和复杂的应用程序,DOM 为您提供了很大的灵活性。如果需要使用 XML Schema,那么再次选择 DOM 是明智之举 - 至少目前是这样。

如果您在开发的应用程序中处理文档和数据,那么 DOM 可能仍然是您最佳选择。毕竟,一旦编写了用于检查和处理 DOM 结构的代码,就很容易为特定目的定制它。因此,选择在 DOM 中执行所有操作意味着您只需处理一组 API,而不是两组。

此外,DOM 标准是内存中文档模型的规范标准。它功能强大且稳健,并且有许多实现。这对许多大型安装来说是一个重要的决策因素,特别是对于需要尽量减少由 API 更改造成的成本的大型应用程序。

最后,即使通讯录中的文本今天可能不允许粗体、斜体、颜色和字体大小,但将来您可能会希望处理这些内容。因为 DOM 能处理几乎任何您提出的要求,选择 DOM 可以更轻松地使您的应用程序具备未来的可扩展性。

将 XML 数据读入 DOM

原文:docs.oracle.com/javase/tutorial/jaxp/dom/readingXML.html

在本节中,您将通过读取现有的 XML 文件构造一个文档对象模型。


注意 - 在可扩展样式表语言转换中,您将看到如何将 DOM 写出为 XML 文件。(您还将看到如何相对容易地将现有数据文件转换为 XML。)


创建程序

文档对象模型提供了让您创建、修改、删除和重新排列节点的 API。在尝试创建 DOM 之前,了解 DOM 的结构是很有帮助的。这一系列示例将通过一个名为DOMEcho的示例程序展示 DOM 的内部结构,您可以在安装了 JAXP API 后在目录*INSTALL_DIR*/jaxp-*version*/samples/dom中找到它。

创建骨架

首先,构建一个简单的程序,将 XML 文档读入 DOM,然后再将其写回。

从应用程序的正常基本逻辑开始,并检查确保命令行上已提供了参数:

public class DOMEcho {
    static final String outputEncoding = "UTF-8";
    private static void usage() {
        // ...
    }
    public static void main(String[] args) throws Exception {
        String filename = null;
        for (int i = 0; i < args.length; i++) {
            if (...) { 
                // ...
            } 
            else {
                filename = args[i];
                if (i != args.length - 1) {
                    usage();
                }
            }
        }
        if (filename == null) {
            usage();
        }
    }
}

此代码执行所有基本的设置操作。DOMEcho的所有输出都使用 UTF-8 编码。如果未指定参数,则调用usage()方法会简单地告诉您DOMEcho期望的参数,因此此处不显示代码。还声明了一个filename字符串,它将是要由DOMEcho解析为 DOM 的 XML 文件的名称。

导入所需的类

在本节中,所有类都以单独命名,以便您可以看到每个类来自何处,以便在需要引用 API 文档时参考。在示例文件中,导入语句使用较短的形式,如javax.xml.parsers.*

这些是DOMEcho使用的 JAXP API:

package dom;
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory;

这些类用于在解析 XML 文档时可能抛出的异常:

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.*

这些类读取示例 XML 文件并管理输出:

import java.io.File;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

最后,导入 W3C 定义的 DOM、DOM 异常、实体和节点:

import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Entity;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

处理错误

接下来,添加错误处理逻辑。最重要的一点是,当 JAXP 符合标准的文档构建器在解析 XML 文档时遇到问题时,需要报告 SAX 异常。DOM 解析器实际上不必在内部使用 SAX 解析器,但由于 SAX 标准已经存在,因此使用它来报告错误是有意义的。因此,DOM 应用程序的错误处理代码与 SAX 应用程序的错误处理代码非常相似:

private static class MyErrorHandler implements ErrorHandler {
    private PrintWriter out;
    MyErrorHandler(PrintWriter out) {
        this.out = out;
    }
    private String getParseExceptionInfo(SAXParseException spe) {
        String systemId = spe.getSystemId();
        if (systemId == null) {
            systemId = "null";
        }
        String info = "URI=" + systemId + " Line=" + spe.getLineNumber() +
                      ": " + spe.getMessage();
        return info;
    }
    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);
    }
}

正如您所看到的,DomEcho类的错误处理程序使用PrintWriter实例生成其输出。

实例化工厂

接下来,在main()方法中添加以下代码,以获取一个可以提供文档构建器的工厂实例。

public static void main(String[] args) throws Exception {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    // ...
}

获取解析器并解析文件

现在,在main()中添加以下代码以获取一个构建器实例,并使用它来解析指定的文件。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(new File(filename));

被解析的文件由在 main() 方法开头声明的 filename 变量提供,当程序运行时,它作为参数传递给 DOMEcho

配置工厂

默认情况下,工厂返回一个不进行验证的解析器,不了解命名空间。要获得一个验证解析器,或者一个了解命名空间的解析器(或两者兼有),您可以配置工厂来设置这两个选项中的一个或两个,使用以下代码。

public static 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 {
            filename = args[i];
            if (i != args.length - 1) {
                usage();
            }
        }
    }
    if (filename == null) {
        usage();
    }
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    dbf.setValidating(dtdValidate || xsdValidate);
    // ...
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new File(filename));
}

如您所见,命令行参数已设置好,以便您可以通知 DOMEcho 对 DTD 或 XML Schema 执行验证,并且工厂已配置为了解命名空间并执行用户指定的验证类型。


注意 - 符合 JAXP 标准的解析器并不需要支持所有这些选项的所有组合,即使参考解析器支持。如果您指定了无效的选项组合,在尝试获取解析器实例时,工厂会生成一个 ParserConfigurationException


有关如何使用命名空间和验证的更多信息,请参阅使用 XML Schema 进行验证,其中将描述上述摘录中缺失的代码。

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

相关文章
|
11天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
【4月更文挑战第21天】本文介绍了Selenium中处理特殊测试场景的方法,如鼠标悬停。Selenium的Actions类提供了鼠标悬停功能,用于模拟用户在网页元素上的悬停行为。文中通过实例展示了如何使用Actions悬停并展开下拉菜单,以及在搜索时选择自动补全的字段。代码示例包括了打开百度首页,悬停在“更多”元素上显示下拉菜单并点击“音乐”,以及在搜索框输入关键词并自动补全的过程。
34 0
|
4天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
14 0
|
4天前
|
Java 测试技术 项目管理
Java基础教程(22)-构建工具Maven的基本使用
【4月更文挑战第22天】Maven是Java项目管理及构建工具,简化构建、测试、打包和部署等任务。遵循约定优于配置原则,核心是`pom.xml`配置文件,用于管理依赖和项目信息。安装涉及下载、解压、配置环境变量。在IDEA中使用Maven创建项目,通过`pom.xml`添加依赖和管理版本。常用命令包括`clean`、`compile`、`test`、`package`、`install`和`deploy`。IDEA支持直接执行这些命令。
|
4天前
|
NoSQL Java 关系型数据库
Java基础教程(21)-Java连接MongoDB
【4月更文挑战第21天】MongoDB是开源的NoSQL数据库,强调高性能和灵活性。Java应用通过MongoDB Java驱动与之交互,涉及MongoClient、MongoDatabase、MongoCollection和Document等组件。连接MongoDB的步骤包括:配置连接字符串、创建MongoClient、选择数据库和集合。伪代码示例展示了如何建立连接、插入和查询数据。
|
5天前
|
存储 前端开发 测试技术
《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
【4月更文挑战第27天】本文介绍了使用Java+Selenium进行Web自动化测试时,如何遍历和操作多选按钮的方法。文章分为两个部分,首先是一个本地HTML页面的示例,展示了多选按钮的HTML代码和页面效果,并详细解释了遍历多选按钮的思路:找到所有多选按钮的共同点,通过定位这些元素并放入list容器中,然后使用for循环遍历并操作。 第二部分介绍了在JQueryUI网站上的实战,给出了被测网址,展示了代码设计,同样使用了findElements()方法获取所有多选按钮并存储到list中,然后遍历并进行点击操作。最后,文章对整个过程进行了小结,并推荐了作者的其他自动化测试教程资源。
13 0
|
5天前
|
Java 关系型数据库 MySQL
Java基础教程(20)-Java连接mysql数据库CURD
【4月更文挑战第19天】MySQL是流行的关系型数据库管理系统,支持SQL语法。在IDEA中加载jar包到项目类路径:右击项目,选择“Open Module Settings”,添加库文件。使用JDBC连接MySQL,首先下载JDBC驱动,然后通过`Class.forName()`加载驱动,`DriverManager.getConnection()`建立连接。执行CRUD操作,例如创建表、插入数据和查询,使用`Statement`或`PreparedStatement`,并确保正确关闭数据库资源。
|
6天前
|
设计模式 算法 Java
Java基础教程(19)-设计模式简述
【4月更文挑战第19天】设计模式是软件设计中反复使用的代码设计经验,旨在提升代码的可重用性、可扩展性和可维护性。23种模式分为创建型、结构型和行为型三类。创建型模式如工厂方法、抽象工厂、建造者、原型和单例,关注对象创建与使用的分离。结构型模式涉及对象组合,如适配器、装饰器、外观等,增强结构灵活性。行为型模式专注于对象间职责分配和算法合作,包括责任链、命令、观察者等。设计模式提供标准化解决方案,促进代码交流和复用。
|
7天前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(三十三)-java+ selenium自动化测试-单选和多选按钮操作-上篇(详解教程)
【4月更文挑战第25天】本文介绍了自动化测试中如何处理单选和多选按钮的操作,包括它们的定义、HTML代码示例以及如何判断和操作这些元素。文章通过一个简单的HTML页面展示了单选和多选框的示例,并提供了Java+Selenium实现的代码示例,演示了如何检查单选框是否选中以及如何进行全选操作。
13 0
|
7天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。
|
8天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)
【4月更文挑战第24天】本文介绍了在自动化测试中处理HTML下拉选择(select)的方法。使用Selenium的Select类,可以通过index、value或visible text三种方式选择选项,并提供了相应的取消选择的方法。此外,文章还提供了一个示例HTML页面(select.html)和相关代码实战,演示了如何使用Selenium进行选择和取消选择操作。最后,文章提到了现代网页中类似下拉框的新设计,如12306网站的出发地选择,并给出了相应的代码示例,展示了如何定位并选择特定选项。
18 0