selenium2(webdriver API)—软件测试

news/2024/10/17 22:15:43/

文章目录

  • 1.定位元素的方式
    • 1.1id
    • 1.2name
    • 1.3class name
    • 1.4link text
    • 1.5partial link name
    • 1.6tag name
    • 1.7xpath
    • 1.8css selector
  • 2.操作测试对象
    • 2.1send_keys()
    • 2.2click()
    • 2.3submit()
    • 2.4clear()
    • 2.5text
  • 3.等待
    • 3.1sleep()
    • 3.2implicitly_wait()
  • 4.信息打印
    • 4.1打印title
    • 4.2打印URL
  • 5.对浏览器的操作
    • 5.1浏览器的最大化
    • 5.2设置浏览器的宽和高
    • 5.3浏览器的前景和后退
    • 5.4浏览器滚动条的控制
  • 6.键盘事件
    • 6.1单个键
    • 6.2组合键
  • 7.鼠标事件
  • 8.定位一组元素
  • 9.多层框架的定位
  • 10.层级定位
  • 11.下拉框选择
  • 12.alert弹框的处理
  • 13.在alert弹框输入响应信息
  • 14.div块的处理
  • 15.上传文件
  • 16.为什么有些第三方网站的页面元素无法定位

1.定位元素的方式

定位元素的原则:不管用什么方式定位,这个元素必须全局唯一

1.1id

如果存在id,一定全局唯一

# 导入需要的工具包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 获取浏览器的驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
# 通过id来定位
browser.find_element(By.ID,"kw").send_keys("百度")
time.sleep(3)
browser.find_element(By.ID,"su").click()
time.sleep(3)
# 清理浏览器的缓存,也可以使用browser.close()
browser.quit()

1.2name

name不一定全局唯一,存在并且全局唯一才可以定位

# 导入需要的工具包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 获取浏览器的驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
# 通过name来定位
browser.find_element(By.NAME,"wd").send_keys("赵灵儿")
time.sleep(3)
# 这里的点击没有name属性,所以就使用id定位了
browser.find_element(By.ID,"su").click()
time.sleep(3)
# 清理浏览器的缓存,也可以使用browser.close()
browser.quit()

1.3class name

class name是类属性,存在并且全局唯一才可以定位

# 导入需要的工具包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 获取浏览器的驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
# 通过class name定位
browser.find_element(By.CLASS_NAME,"s_ipt").send_keys("赵灵儿")
time.sleep(3)
browser.find_element(By.ID,"su").click()
time.sleep(3)
# 清理浏览器的缓存,也可以使用browser.close()
browser.quit()

1.4link text

link text是链接内容,必须保证是一个可以访问的URL,必须是链接且链接全局唯一才可以定位

# 导入需要的工具包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 获取浏览器的驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
# 通过link text定位
browser.find_element(By.LINK_TEXT,"地图").click()
time.sleep(3)
# 清理浏览器的缓存,也可以使用browser.close()
browser.quit()

1.5partial link name

partial link name是部分链接内容,必须保证是一个可以访问的URL,必须是链接且链接全局唯一才可以定位

# 导入需要的工具包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 获取浏览器的驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
# 通过partial link text定位
browser.find_element(By.PARTIAL_LINK_TEXT,"新").click()
time.sleep(3)
# 清理浏览器的缓存,也可以使用browser.close()
browser.quit()

1.6tag name

tag name是元素标签,存在并且全局唯一才可以定位

# 导入需要的工具包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 获取浏览器的驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
# 通过tag_name定位(不成功)
browser.find_element(By.TAG_NAME,"input").send_keys("李逍遥")
time.sleep(3)
browser.find_element(By.TAG_NAME,"input").click()
time.sleep(3)
# 清理浏览器的缓存,也可以使用browser.close()
browser.quit()

1.7xpath

任何一个元素都可以定位到,通过xpath一定可以全局唯一定位一个元素(app定位都是通过xpath)

# 导入需要的工具包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 获取浏览器的驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
# 通过xpath定位
browser.find_element(By.XPATH,"//*[@id='kw']").send_keys("赵灵儿")
time.sleep(3)
browser.find_element(By.XPATH,"//*[@id='su']").click()
time.sleep(3)
# 清理浏览器的缓存,也可以使用browser.close()
browser.quit()

1.8css selector

任何一个元素都可以定位到

# 导入需要的工具包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
browser = webdriver.Chrome() # 获取浏览器的驱动
time.sleep(3)
browser.get("http://www.baidu.com")
time.sleep(3)
# 通过css selector定位
browser.find_element(By.CSS_SELECTOR,"#kw").send_keys("赵灵儿")
time.sleep(3)
browser.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(3)
# 清理浏览器的缓存,也可以使用browser.close()
browser.quit()

2.操作测试对象

2.1send_keys()

向元素发送信息

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# send_keys()向元素发送信息赵灵儿
driver.find_element(By.ID,"kw").send_keys("赵灵儿")
time.sleep(3)
driver.find_element(By.ID,"su").submit()
time.sleep(3)
driver.quit()

2.2click()

点击元素

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# click 点击元素
driver.find_element(By.ID,"kw").send_keys("赵灵儿")
time.sleep(3)
driver.find_element(By.ID,"su").click()
time.sleep(3)
driver.quit()

2.3submit()

提交表单

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# submit 提交表单,作用和click差不多
driver.find_element(By.ID,"kw").send_keys("赵灵儿")
time.sleep(3)
driver.find_element(By.ID,"su").submit()
time.sleep(3)
driver.quit()

2.4clear()

清楚元素的内容

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# clear 清除输入的元素
driver.find_element(By.ID,"kw").clear()
driver.find_element(By.ID,"kw").send_keys("李逍遥")
time.sleep(3)
driver.find_element(By.ID,"su").submit()
time.sleep(3)
driver.quit()

2.5text

获取元素的内容

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# text 获取文本信息
text = driver.find_element(By.ID,"bottom_layer").text
print(text)
time.sleep(3)
driver.quit()

3.等待

3.1sleep()

固定等待,必须等待够括号中的时间

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.ID,"kw").send_keys("李逍遥")
driver.find_element(By.ID,"su").click()
# 固定等待
# time.sleep(10)
time.sleep(3)
driver.quit()

3.2implicitly_wait()

隐式等待(智能等待),等待页面上的元素加载出来后就立刻去执行下一个相关指令

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.ID,"kw").send_keys("李逍遥")
driver.find_element(By.ID,"su").click()
# 智能等待
driver.implicitly_wait(10)
driver.find_element(By.LINK_TEXT,"百度百科").click()
time.sleep(3)
driver.quit()

4.信息打印

4.1打印title

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(3)
# 打印title
title = driver.title
print(title)
driver.quit()

4.2打印URL

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(3)
# 打印URL
url = driver.current_url
print(url)
driver.quit()

5.对浏览器的操作

5.1浏览器的最大化

maximize_window()

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(3)
driver.find_element(By.ID,"kw").send_keys("百度")
time.sleep(3)
driver.find_element(By.ID,"su").click()
time.sleep(3)
# 浏览器最大化
driver.maximize_window()
time.sleep(3)
driver.quit()

5.2设置浏览器的宽和高

set_window_size()

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(3)
driver.find_element(By.ID,"kw").send_keys("百度")
time.sleep(3)
driver.find_element(By.ID,"su").click()
time.sleep(3)
# 设置浏览器的高和宽
driver.set_window_size(400,1000)
time.sleep(3)
driver.quit()

5.3浏览器的前景和后退

(1)后退:driver.back()
(2)前进:driver.forward()

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(3)
driver.find_element(By.ID,"kw").send_keys("百度")
time.sleep(3)
driver.find_element(By.ID,"su").click()
time.sleep(3)
# 浏览器的后退
driver.back()
time.sleep(3)
# 浏览器的前进
driver.forward()
time.sleep(3)
driver.quit()

5.4浏览器滚动条的控制

(1)将一个滚动条拉倒最底端:js0 = “var q=document.documentElement.scrollTop=10000”
driver.execute_script(js0)
(2)将一个滚动条拉倒最顶端:js1 = “var q=document.documentElement.scrollTop=0”
driver.execute_script(js1)

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(3)
driver.find_element(By.ID,"kw").send_keys("百度")
time.sleep(3)
driver.find_element(By.ID,"su").click()
time.sleep(3)
# 将浏览器的滚动条拉倒最低端
js0 = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js0)
time.sleep(3)
# 将浏览器的滚动条拉倒最顶端
js1 = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js1)
time.sleep(3)
driver.quit()

6.键盘事件

所有的键盘操作必须建立在定位元素的基础上,因为我们是基于元素进行操作的

6.1单个键

导入工具包:from selenium.webdriver.common.keys import Keys
(1)keys.TAB:定位
(2)keys.ENTER:回车

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:88/zentao/user-login-L3plbnRhby8=.html")
time.sleep(3)
# 浏览器最大化
driver.maximize_window()
time.sleep(3)
# 清除已经存在的账户
driver.find_element(By.ID,"account").clear()
driver.find_element(By.NAME,"password").clear()
time.sleep(3)
# 登录操作
driver.find_element(By.ID,"account").send_keys("admin")
time.sleep(3)
# 用tab键定位到用户名
driver.find_element(By.ID,"account").send_keys(Keys.TAB)
driver.find_element(By.NAME,"password").send_keys("1234567890wh")
time.sleep(3)
# 用enter键直接登录
driver.find_element(By.NAME,"password").send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()

6.2组合键

导入工具包:from selenium.webdriver.common.action_chains import ActionChains
(1)全选:send_keys(Keys.CONTROL,‘a’)
(2)剪切:send_keys(Keys.CONTROL,‘x’)

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
time.sleep(3)
driver.find_element(By.ID,"kw").send_keys("2022")
time.sleep(3)
# # ctrl A 全选
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
# # ctrl X 剪切
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
driver.find_element(By.ID,"kw").send_keys("2023")
driver.find_element(By.ID,"su").click()
time.sleep(3)
driver.quit()

7.鼠标事件

鼠标定位前提是定位元素
(1)右键:context_click(b).perform()
(2)双击:double_click(b).perform()
(3)拖动:drag_and_drop()
(4)移动:move_to_element(element).perform()

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
time.sleep(3)
driver.find_element(By.ID,"kw").send_keys("2023")
driver.find_element(By.ID,"su").click()
# time.sleep(3)
b = driver.find_element(By.ID,"su")
time.sleep(3)
# 右键
ActionChains(driver).context_click(b).perform()
time.sleep(3)
# 双击
ActionChains(driver).double_click(b).perform()
time.sleep(3)
#定位要移动元素的位置
element = driver.find_element(By.PARTIAL_LINK_TEXT,"2023年(21世纪的第23年) - 百度百科")
#执行元素的移动操作
ActionChains(driver).move_to_element(element).perform()
time.sleep(3)
driver.quit()

8.定位一组元素

  1. 如何打开本地的HTML页面
    (1)拼成一个URL:file:+///+文件的绝对路径
    (2)导包:import os
    (3)os.path.abspath(文件的绝对路径)
  2. 先定位出同一类元素,然后根据需要定位的元素的特征去甄别出要定位的具体元素进行操作
  3. 获取属性值:get_attribute
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
import os
driver  = webdriver.Chrome() # 获取浏览器的驱动
url = "file:///"+os.path.abspath("E:\VScode\Test\selenium2html\checkbox.html") # 拼成一个url
driver.get(url)
time.sleep(3) # 固定等待时间
driver.maximize_window() # 将浏览器的窗口放到最大
# 勾选所有的checkBox
# driver.find_element(By.ID,"c1").click()
# driver.find_element(By.ID,"c2").click()
# driver.find_element(By.ID,"c3").click()
# 定位一组元素:定位一组tag name都为input的元素
buttons = driver.find_elements(By.TAG_NAME,"input")
for button in buttons:if button.get_attribute('type') == 'checkbox':button.click()
time.sleep(3)
driver.quit() # 清理浏览器的缓存

9.多层框架的定位

(1)iframe:框架里面嵌套框架
(2)解决不同层框架上的页面的元素的定位
(3)如果要定位一个层级框架中的元素必须先跳转到这个框架层级才可以定位
(4)如果要定位某一个层级,必须从默认页面跳转
举个栗子:在这里插入图片描述
(5)switch_to.frame():页面跳转
(6)switch_to.default_content():回到默认页面

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
driver = webdriver.Chrome()
url = "file:///" + os.path.abspath("E:\VScode\Test\selenium2html\frame.html")
driver.get(url)
time.sleep(3)
driver.maximize_window();
# 从默认页面跳转到f1页面
driver.switch_to.frame("f1")
time.sleep(3)
driver.find_element(By.LINK_TEXT,"click").click()
time.sleep(3)
# 回到默认页面
driver.switch_to.default_content()
time.sleep(3)
driver.quit()

10.层级定位

要定位的元素没有直接在页面上展示出来,就需要对页面的元素经过一系列操作后才展示出来,就需要一层层定位

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
url = "file:///" + os.path.abspath("E:\VScode\Test\selenium2html\level_locate.html")
driver.get(url)
time.sleep(3)
driver.maximize_window()
# 定位link1并点击
driver.find_element(By.LINK_TEXT,"Link1").click()
time.sleep(3)
# 定位Another Action
action = driver.find_element(By.LINK_TEXT,"Another action")
time.sleep(3)
# 高亮显示Another Action,将鼠标移动到Another Action上
ActionChains(driver).move_to_element(action).perform()
time.sleep(3)
driver.quit()

11.下拉框选择

(1)直接用xpath定位
(2)先定位出一组元素,然后根据元素的属性进行过滤筛选,再进行具体操作
(3)先定位出一组元素,再通过数组下标的方式定位

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
driver = webdriver.Chrome()
url = "file:///"+os.path.abspath("E:\VScode\Test\selenium2html\drop_down.html")
driver.get(url)
driver.maximize_window();
time.sleep(3)
# xpath
# driver.find_element(By.XPATH,"//*[@id='ShippingMethod']/option[3]").click()
# tag name
# 定位出一组元素+根据元素属性进行筛选
options = driver.find_elements(By.TAG_NAME,"option")
for option in options:if option.get_attribute('value') == '10.69':option.click()
# 定位出一组元素+数组下标
# options[2].click()
time.sleep(3)
driver.quit()

12.alert弹框的处理

(1)定位弹出框并获得弹出框的操作句柄:switch_to.alert()
(2)关闭弹框:alert.accept()

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
driver = webdriver.Chrome()
url = "file:///"+os.path.abspath("E:/VScode/Test/selenium2html/alert.html")
driver.get(url)
driver.maximize_window()
time.sleep(3)
# 定位元素并点击使得弹出框出现
driver.find_element(By.TAG_NAME,"a").click()
time.sleep(3)
# 定位弹出框并获得弹出框的操作句柄
alert = driver.switch_to.alert
time.sleep(3)
# 关闭弹出框
alert.accept()
time.sleep(3)
driver.quit()

13.在alert弹框输入响应信息

(1)定位弹出框并获得弹出框的操作句柄:switch_to.alert()
(2)使用send_keys去输入信息:alert.send_keys(“”)

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
driver = webdriver.Chrome()
url = "file:///"+os.path.abspath("E:/VScode/Test/selenium2html/send.html")
driver.get(url)
driver.maximize_window()
time.sleep(3)
# 定位元素并点击使得弹出框出现
driver.find_element(By.TAG_NAME,"input").click()
time.sleep(3)
# 定位弹出框并获得弹出框的操作句柄
alert = driver.switch_to.alert
time.sleep(3)
# 输入相应的信息
alert.send_keys("2023.3.28")
time.sleep(3)
# 关闭弹出框
alert.accept()
time.sleep(3)
driver.quit()

14.div块的处理

(1)适用于页面复杂,元素非常多,没有id并且name或者tag name重复
(2)首先要定位元素所在的div模块
(3)再定位到div模块的基础上来精确寻找需要定位的元素

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os
driver = webdriver.Chrome()
url = "file:///"+os.path.abspath("E:/VScode/Test/selenium2html/modal.html")
driver.get(url)
driver.maximize_window()
time.sleep(3)
# 点击CLick,出现弹出框
driver.find_element(By.LINK_TEXT,"Click").click()
time.sleep(3)
# 点击div框里面的click me,让弹出框的内容发生变化
div1 = driver.find_element(By.CLASS_NAME,"modal-body")
div1.find_element(By.LINK_TEXT,"click me").click()
time.sleep(3)
# 关闭弹出框:先定位div在定位具体的button
div2 = driver.find_element(By.CLASS_NAME,"modal-footer")
buttons = driver.find_elements(By.TAG_NAME,"button")
buttons[0].click()
time.sleep(3)
driver.quit()

15.上传文件

(1)定位上传文件按钮
(2)send_keys(需要上传文件的绝对路径+文件名称)

from selenium import webdriver
from selenium.webdriver.common.by import By
import os
import time
driver = webdriver.Chrome()
url = "file:///"+os.path.abspath("E:/VScode/Test/selenium2html/upload.html")
driver.get(url)
driver.maximize_window()
time.sleep(3)
driver.find_element(By.NAME,"file").send_keys("E:\me\CSDN.jpg")
time.sleep(6)
driver.quit()

16.为什么有些第三方网站的页面元素无法定位

安全性考虑,每次刷新所使用的定位元素的值是不同的


http://www.ppmy.cn/news/998229.html

相关文章

什么是熵?

熵(Entropy)是一个重要的概念,最初出现在热力学领域,用于描述系统的混乱程度或不确定性。熵也被广泛应用于信息理论、统计学和计算机科学等领域。通常来讲,熵,是对混乱程度、不确定程度的度量。熵越大&…

【FAQ】如何隐藏网页H.265播放器EasyPlayer.js的实时录像按钮?

目前我们TSINGSEE青犀视频所有的视频监控平台,集成的都是EasyPlayer.js版播放器,它属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,包括WebSocket-FLV、HTTP-FLV,HLS(m3u8&#x…

【Redis】内存数据库Redis进阶(Redis哨兵集群)

目录 分布式缓存 Redis 四大问题搭建Redis哨兵集群哨兵原理Redis哨兵集群小结RedisTemplate集成哨兵机制 分布式缓存 Redis 四大问题 基于 Redis 集群解决单机 Redis 存在的四大问题: 搭建Redis哨兵集群 搭建一个三节点形成的 Sentinel 集群,来监管 R…

Linux第六章之vim与gcc使用

一、Linux编辑器-vim使用 vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也…

如何制作Windows10安装U盘

如何制作Windows10安装U盘 有新电脑的时候,我们会用安装U盘装系统,可是要怎么制作? 工具/原料 一台可以使用并且能上网的电脑 一个至少4.7GB的U盘 方法/步骤 1 2 选择官网 3 点击“立即下载工具”下载制作工具 4 插入U盘&#xff…

Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单 em

Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含:录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署,免费售…

Linux第三章之重定向 管道命令 环境变量PATH

一、了解Linux目录配置标准FHS FHS本质一套规定Linux目录结构,软件建议安装位置的标准。 使用Linux来开发产品或者发布软件的公司、个人太多,如果每家公司或者个人都按照自己的意愿来配置文件或者软件的存放位置,这无疑是一场灾难。 #进入…

xml的学习笔记

学习视频:093-尚硅谷-xml-什么是XML以及它的作用_哔哩哔哩_bilibili 目录 XML简介 XML的作用 XML语法 1.文档声明 2.xml注释 3.元素标签 4.xml属性 5.语法规则 1.所有xml元素都须有关闭标签(也就是闭合) 2.xml 标签对大小写敏感 3.xml必须正确的嵌套 4…