Selenium

介绍

Selenium是一个用于Web应用程序的自动化测试工具

特点

1.开源、免费

2.多浏览器支持:FireFox、Chrome、IE、Opera、Edge;

3.多平台支持:Linux、Windows、MAC;

4.多语言支持:Java、Python、Ruby、C#、JavaScript、C++;

5.对Web 页面有良好的支持;

6.简单(API 简单)、灵活(用开发语言驱动);

7.支持分布式测试用例执行。

环境搭建

基于Python环境搭建

步骤

  1. Python开发环境(自行百度搭建)

  1. 安装Selenium包

  1. 安装浏览器(一般都有,跳过)

  1. 安装浏览器驱动--保证能够用程序驱动浏览器,实习自动化测试

安装selenium包

前提:Python3安装完毕且能正常运行

PIP工具

pip是一个通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。

以下命令在doc命令行中操作

安装

pip install selenium

卸载

pip uninsatll selenium

查看

pip show selenium

安装浏览器驱动

Chrome浏览器驱动下载地址

https://npm.taobao.org/mirrors/chromedriver/

找到自己浏览器对应的版本后下载,然后进行解压,并设置path

当然,可以通过简便path操作,将下载好的驱动解压至python目录下

Firefow浏览器下载地址

https://github.com/mozilla/geckodriver/releases/

操作与上述一致

实操

元素定位

方式

  1. id

  1. name

  1. class_name

  1. tag_name

  1. link_text

  1. partial_link_text

  1. XPath

  1. CSS

id定位

通过元素的id属性来定位元素

前提:元素有id属性

有id属性,优先使用

方法(selenium版本不同,方法略有不同,在此的版本是4.5.0)

element = driver.find_element("id","kw")

name定位

通过元素的name属性进行定位

方法

element = driver.find_element("name","wd")

class_name定位

通过元素的class_name属性进行定位

方法

element = driver.find_element("class name","s_ipt")

link_text定位

通过超链接元素进行定位,link_text为超链接的全部文本内容

方法

element = driver.find_element("link text","新闻")

partial_link_text定位

通过超链接元素进行定位,partial_link_text为超链接的部分文本内容

方法

element = driver.find_element("partial link text","新")

XPath定位

通过标签路径进行定位

方法

element = driver.find_element("xpath", "//*[@id='kw']")

CSS选择器定位

通过标签路径进行定位

方法

element = driver.find_element("css selector", "#kw")

示例

该例子是通过百度首页进行测试

先通过谷歌打开百度首页

按F12进入调试界面

然后通过按钮找到对应元素的标签,再获取到id、name等属性

代码

from selenium import webdriver
from time import sleep# 创建WebDriver对象
driver = webdriver.Chrome()
# 设置打开的网址
url = "https://www.baidu.com"
# 使用浏览器打开指定页面
driver.get(url)# 根据id获取
# driver.find_element("id","kw").send_keys("查询")
# driver.find_element("id","su").click()# 根据name获取
# driver.find_element("name","wd").send_keys("美女")
# driver.find_element("id","su").click()# 根据class name 获取
# driver.find_element("class name","s_ipt").send_keys("美女")
# driver.find_element("id","su").click()# 根据link text获取
# driver.find_element("link text","新闻").click()# 根据 partial link text获取
# driver.find_element("partial link text","新").click()# 根据CSS选择器获取
# driver.find_element("css selector", "#kw").send_keys("美女")
# driver.find_element("css selector", "#su").click()
# driver.find_element("css selector", "[name=wd]").send_keys("美女")
# driver.find_element("css selector", "#su").click()
# driver.find_element("css selector",".s_ipt").send_keys("美女")
# driver.find_element("css selector", "#su").click()
# print(driver.find_element("css selector", "input"))# 根据Xpath获取
# driver.find_element("xpath", "//*[@id='kw']").send_keys("美女")
# driver.find_element("xpath", "//*[@id='kw']").clear()# 元素的其他操作
# driver.find_element("xpath", "//*[@id='kw']").send_keys("美女")
# driver.find_element("xpath", "//*[@id='kw']").clear()
# print(driver.find_element("xpath", "//*[@id='kw']").size)
# print(driver.find_element("xpath", "//*[@id='su']").text)
# print(driver.find_element("xpath", "//*[@id='kw']").get_attribute())
# driver.find_element("xpath", "//*[@id='su']").click()# 隐式等待
# driver.find_element("css selector",".s_ipt").send_keys("美女")
# driver.find_element("css selector", "#su").click()
# print(driver.find_element("css selector", "a"))
# driver.implicitly_wait(10)sleep(3)
# 关闭浏览器
driver.quit()

元素操作

目的

1.需要让脚本模拟用户给指定元素输入值

2.需要让脚本模拟人为删除元素的内容

3.需要让脚本模拟点击操作

元素常用操作方法

click() 单击元素

send_keys(value) 模拟输入

clear() 清除文本

可参照上述代码

模拟鼠标

拖动

使用场景

在网页中将一个元素拖动到指定地方

方法

chains.drag_and_drop(driver.find_element("id", "div1"), driver.find_element("id", "div2"))

移动鼠标

使用场景

在网页中移动鼠标

方法

chains.move_to_element(driver.find_element("xpath", "//*[@id='zc']/fieldset/button"))

双击

使用场景

在网页中模拟鼠标双击操作

方法

chains.double_click(driver.find_element("id", "selectA"))

代码

前置页面

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>拖拽div</title>
<style type="text/css">
div{position:absolute;width:150px;height:150px;background-color:red;
}
</style>
<script type="text/javascript">
<!--
function drag(obj)
{if (typeof obj == "string") {var obj = document.getElementById(obj);obj.orig_index=obj.style.zIndex;//设置当前对象永远显示在最上层}obj.onmousedown=function (a){//鼠标按下this.style.cursor="move";//设置鼠标样式this.style.zIndex=1000;var d=document;if(!a) a=window.event;//按下时创建一个事件var x=a.clientX-document.body.scrollLeft-obj.offsetLeft;//x=鼠标相对于网页的x坐标-网页被卷去的宽-待移动对象的左外边距var y=a.clientY-document.body.scrollTop-obj.offsetTop;//y=鼠标相对于网页的y左边-网页被卷去的高-待移动对象的左上边距d.onmousemove=function(a){//鼠标移动if(!a) a=window.event;//移动时创建一个事件obj.style.left=a.clientX+document.body.scrollLeft-x;obj.style.top=a.clientY+document.body.scrollTop-y;}d.onmouseup=function (){//鼠标放开document.onmousemove=null;document.onmouseup = null;obj.style.cursor="normal";//设置放开的样式obj.style.zIndex=obj.orig_index;}}
}
-->
</script>
</head>
<body>
<div id="div1" style="width:100px;height:100px;z-index:99"> </div>
<div id="div2" style="left:170px; background-color:blue; z-index:98"></div>
<script type="text/javascript">
<!--drag("div1");drag("div2");
-->
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-cn">
<head><meta charset="UTF-8"><title>注册A</title><style type="text/css">body{background: #F0F0F0}#zc{width: 500px;background: #C7C7E2;padding: 10px;margin-top: 10%;margin-left: 30%}input{padding: 5px;background: #f8f8f8}button{padding: 8px; background: #f8f8f8;border-radius: 5px}button:hover{padding: 10px; background: #2F4F4F}input:focus{background: #FFC0CB}/*span{display: none}*/</style><script type="text/javascript"></script>
</head>
<body>
<form action=""><div id="zc"><fieldset><legend>注册用户A</legend><p id="p1"><label for="userA">账号A</label><input type="textA" name="userA" id="userA" placeholder="账号A" required="" value="">            </p><p><label for="password">密码A</label>        <input type="password" name="passwordA" id="passwordA" placeholder="密码A" value=""></p><p><label for="telA">电话号码A</label><input type="telA" name="telA" id="telA" placeholder="电话A" class="telA haha" value="">                </p><p><label for="emailA">电子邮件A</label><input type="emailA" name="emailA" id="emailA" placeholder="电子邮箱A" value="">                </p><button type="submitA" value="注册A" title="加入会员A">注册用户A</button><hr><p><span>Span_tagName</span></p><p><a href="http://www.baidu.com" id="fwA" target="_blank">访问 百度 网站</a></p><p><a href="http://www.baidu.com.cn" id="AAA">AA 百度 网站</a></p><p><a href="http://www.baidu.com" rel="nofo"></a></p><p><a href="logout">我是a标签A</a></p><p><a href="www.taobao.com" rel="">退出</a></p><hr><p><select name="selecta" id="selectA"><option value="bj">A北京</option><option value="sh">A上海</option><option value="gz">A广州</option><option value="cq">A重庆</option></select></p><hr><form action=""><label for=""><input type="radio" name="fruit" value="pga" id="pga">A苹果</label><label for=""><input type="radio" name="fruit" value="jza" id="jza">A橘子</label><label for=""><input type="radio" name="fruit" value="xja" id="xja">A香蕉</label><label for=""><input type="radio" name="fruit" value="lia" id="lia" checked="">A梨</label><label for=""><input type="radio" name="fruit" value="xga" id="xga">西瓜</label></form><form action=""><input type="checkbox" name="checkbox" value="汽车" id="qcA">汽车A<br><input type="checkbox" name="checkbox" value="购物" id="gwA">购物A<br><input type="checkbox" name="checkbox" value="旅游" id="lyA" readonly="">旅游A <br><input type="checkbox" name="checkbox" value="音乐" id="yyA"disabled="">音乐A <br><input type="button" value="取消A" disabled="" id="cancelA"><br><input type="button" value="alerta" id="alerta" onclick="al()"> <br><input type="file"  name="upfilea" value=""></form></fieldset>        </div><script>function al(){alert('我被被点击啦!')}</script>
</form>
<!-- <a href="http://www.sina.com.cn" target="myframe1">新浪</a>
<a href="http://www.hao123.com" target="myframe1">hao123</a>
<a href="http://www.taobao.com" target="myframe2">淘宝</a>
<a href="http://www.baidu.com" target="myframe2">百度</a><br>
<iframe src="http://www.baidu.com" frameborder="1" height="500" width="48%" name="myframe1"></iframe>
<iframe src="http://www.so.com" frameborder="1" height="500" width="48%" name="myframe2"></iframe>    -->
</body>
</html>
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleepdriver = webdriver.Chrome()
# url = r"E:\python_code\python_test\drag.html"
url = r"E:\python_code\python_test\注册A.html"
driver.get(url)chains = ActionChains(driver)
# 拖动
# chains.drag_and_drop(driver.find_element("id", "div1"), driver.find_element("id", "div2"))# 移动鼠标,将鼠标放置在加入会员按钮上
# chains.move_to_element(driver.find_element("xpath", "//*[@id='zc']/fieldset/button"))# 双击
# chains.double_click(driver.find_element("id", "selectA"))chains.perform()
sleep(3)
driver.quit()

注意:需要执行这个方法chains.perform()才能够有效。

键盘操作

使用场景

模拟在网页上,使用键盘输入

代码

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keysdriver = webdriver.Chrome()
url = "https://www.baidu.com"
driver.get(url)element = driver.find_element("id", "kw")
element.send_keys("美女")
element.send_keys(Keys.BACK_SPACE)
element.send_keys(Keys.CONTROL, 'a')
sleep(1)
# 复制
element.send_keys(Keys.CONTROL, 'c')
element.send_keys(Keys.CONTROL, 'v')
element.send_keys(Keys.CONTROL, 'v')sleep(3)
driver.quit()

注意:固定的按键如control等按键,都有方法。

下拉框操作

使用场景

在一些网页上,需要对下拉框进行选择

代码

前置网页(上面的注册A页面)

from time import sleep
from selenium import webdriver
from selenium.webdriver.support.select import Selectdriver = webdriver.Chrome()
url = r"E:\python_code\python_test\注册A.html"
driver.get(url)ele = driver.find_element("id", "selectA")
select = Select(ele)
sleep(1)
select.select_by_index(2)
sleep(1)
select.select_by_value("bj")
sleep(1)
select.select_by_visible_text("A重庆")sleep(3)
driver.quit()

滚动条

使用场景

在网页中,将页面往下滑的操作

代码

from selenium import webdriver
from time import sleep# 创建WebDriver对象
driver = webdriver.Chrome()
# 设置打开的网址
url = "https://douyu.com"
# 使用浏览器打开指定页面
driver.get(url)js_script = "window.scrollTo(0,10000)"
driver.execute_script(js_script)driver.find_element("class name","HomeFooter-friendLinkItem").click()sleep(3)
# 关闭浏览器
driver.quit()

警告框

使用场景

在一些页面会弹出警告框,需要点击接受或者忽略

代码

前置页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>.box2{background: red;color: blue;}</style>
</head>
<body><!--第一级标签 2个div 1个a标签 --><!--第一个div标签中包含3个p标签,第一个p中包含1个a  --><!--第二个div中包含3个p标签 --><!-- p>a --><!-- div+div+a --><div id="div1" class="box1" newattr="css_course new_attr"><p class="div1p1">div1 p1<a href="#">inner link text</a></p><p class="div1p2">div1 p2</p><p class="div1p3">div1 p3</p></div><div id="div2" class="box2"><p class="div2p1">div2 p1文本</p><p class="div2p2">div2 p2文本</p><p class="div2p3">div2 p3文本</p></div><a href="#">outter link text</a><br><input type="button" value="alert" onclick="alert('这是警告框')"><input type="button" value="confirm" onclick="confirm('这是确认框')"><input type="button" value="prompt" onclick="prompt('这是提示框')">
</body>
</html>
from selenium import webdriver
from time import sleep# 创建WebDriver对象
driver = webdriver.Chrome()
# 设置打开的网址
url = r"E:\python_code\python_test\css_example.html"
# 使用浏览器打开指定页面
driver.get(url)driver.find_element("css selector", "[value=alert]").click()sleep(1)# 弹出框点击确定
# driver.switch_to.alert.dismiss()
# driver.switch_to.alert.accept()
# print(driver.switch_to.alert.text)sleep(3)
# 关闭浏览器
driver.quit()

Frame切换

使用场景

在页面中存在多个窗体,需要切换窗体进行操作

代码

前置页面

<!DOCTYPE html>
<html lang="zh-cn">
<head><meta charset="UTF-8"><title>表单综合实例</title><style type="text/css">body{background: #F0F0F0}form{width: 500px;background: #C7C7E2;padding: 10px;margin-top: 10%;margin-left: 30%}input{padding: 5px;background: #f8f8f8}button{padding: 8px; background: #f8f8f8;border-radius: 5px}button:hover{padding: 10px; background: #2F4F4F}input:focus{background: #FFC0CB}/*span{display: none}*/</style><script type="text/javascript"></script>
</head>
<body>
<form action=""><div id="zc"><fieldset><legend>注册用户</legend><p id="p1"><label for="user">账号</label><input type="text" name="user" id="user" placeholder="账号" required="" value="">            </p><p><label for="password">密码</label>        <input type="password" name="password" id="password" placeholder="密码" value=""></p><p><label for="tel">电话号码</label><input type="tel" name="tel" id="tel" placeholder="电话" class="tel" value="">                </p><p><label for="email">电子邮件</label><input type="email" name="email" id="email" placeholder="电子邮箱" value="" aa="ddd">                </p><button type="submit" value="注册" title="加入会员">注册用户</button><hr><p><span>Span_tagName</span></p><p><a href="http://www.sina.com.cn" id="fw" target="_blank">访问 新浪 网站</a></p><p><a href="http://www.sina.com.cn" id="AA">AA 新浪 网站</a></p><p><a href="注册A.html" id="ZCA" target="_blank">注册A网页</a></p><p><a href="注册B.html" id="ZCB" target="_blank">注册B网页</a></p><p><a href="http://www.baidu.com" rel="nofo"></a></p><p><a href="logout">我是a标签</a><s/p><p><a href="www.taobao.com" rel="">退出</a></p><hr><p><select name="select" id="select"><option value="bj">北京</option><option value="sh">上海</option><option value="gz">广州</option><option value="cq">重庆</option></select></p><hr><form action=""><label for=""><input type="radio" name="fruit" value="pg" id="pg">苹果</label><label for=""><input type="radio" name="fruit" value="jz" id="jz">橘子</label><label for=""><input type="radio" name="fruit" value="xj" id="xj">香蕉</label><label for=""><input type="radio" name="fruit" value="li" id="li" checked="">梨</label><label for=""><input type="radio" name="fruit" value="xg" id="xg">西瓜</label></form><form action=""><input type="checkbox" name="checkbox" value="汽车" id="qc">汽车<br><input type="checkbox" name="checkbox" value="购物" id="gw">购物<br><input type="checkbox" name="checkbox" value="旅游" id="ly" readonly="">旅游 <br><input type="checkbox" name="checkbox" value="音乐" id="yy"disabled="">音乐 <br><input type="button" value="取消" disabled="" id="cancel"><br><input type="button" value="alert" id="alert" onclick="al()"> <br><input type="file"  name="upfile" value=""></form></fieldset>        </div><script>function al(){alert('我被被点击啦!')}</script>
</form>
<a href="http://www.sina.com.cn" target="myframe1">新浪</a>
<a href="http://www.hao123.com" target="myframe1">hao123</a>
<a href="http://www.taobao.com" target="myframe2">淘宝</a>
<a href="http://www.baidu.com" target="myframe2">百度</a><br>
<iframe src="注册A.html" frameborder="1" height="500" width="48%" name="myframe1" id="idframe1"></iframe>
<iframe src="注册B.html" frameborder="1" height="500" width="48%" name="myframe2"></iframe>
</body>
</html>
from time import sleep
from selenium import webdriverdriver = webdriver.Chrome()url = r'E:\python_code\python_test\注册实例.html'
driver.get(url)driver.switch_to.frame("myframe1")
ele_user_a = driver.find_element("id", "userA")
ele_user_a.send_keys("hahaha")sleep(1)driver.switch_to.default_content()
driver.switch_to.frame("myframe2")
ele_user_b = driver.find_element("id", "userB")
ele_user_b.send_keys("wuwuwu")sleep(3)
# 关闭浏览器
driver.quit()

标签页切换

使用场景

页面中会出现多个标签页,需要进行切换后操作

代码

前置页面(上述注册示例.html)

from time import sleep
from selenium import webdriverdriver = webdriver.Chrome()url = r'E:\python_code\python_test\注册实例.html'
driver.get(url)handle_a = driver.current_window_handle
print(handle_a)driver.find_element("id","ZCA").click()
sleep(1)for handle in driver.window_handles:driver.switch_to.window(handle)sleep(1)sleep(3)
# 关闭浏览器
driver.quit()

截图

使用场景

在操作的过程中,出现错误或一些操作需要进行记录

代码

from selenium import webdriver
from time import sleep# 创建WebDriver对象
driver = webdriver.Chrome()
# 设置打开的网址
url = "https://douyu.com"
# 使用浏览器打开指定页面
driver.get(url)driver.get_screenshot_as_file(r"E:\python_code\python_test\douyu.png")sleep(3)
# 关闭浏览器
driver.quit()

cookie的处理

使用场景

在打开网页的时候,可能需要进行登录或权限校验的操作,可以在打开网页后添加cookie完成验证或登录

示例

打开百度网页并传输cookie进行登录

代码

from selenium import webdriver
from time import sleep# 创建WebDriver对象
driver = webdriver.Chrome()
# 设置打开的网址
url = "https://www.baidu.com"
# 使用浏览器打开指定页面
driver.get(url)driver.maximize_window()
sleep(5)
# “BDUSS”的值和“BAIDUID”的值在登录后的页面中查找
driver.add_cookie({"name": "BDUSS", "value": "xxx"})
driver.add_cookie({"name": "BAIDUID", "value": "xxx"})
sleep(5)
driver.refresh()sleep(3)
# 关闭浏览器
driver.quit()

注意:别把BDUSS的值截漏了

软件测试-Web自动化测试-Selenium-笔记相关推荐

  1. 软件测试web自动化测试

    今天目标 1.自动化相关概念 2.自动化相关环境搭建 3.元素定位 课程大纲 1.核心重点(第二章) 2,提高代码质量,自动化水平(第三.四.五.六章) 3.项目实战(第七章) 4.理论及环境与定位( ...

  2. 软件测试-web自动化测试教程

    selenium的官网:Selenium selenium的API文档:Generated Documentation (Untitled) selenium的中文文档:介绍 | Selenium 中 ...

  3. Web自动化测试Selenium【入门必看】

    目录:导读 1.Web自动化测试简介 2.功能测试和自动化测试的区别 3.自动化测试流程 4.自动化测试用例和手工测试用例的区别 5.为什么要做自动化? 6.是否适合做自动化? 7.在什么情况下做自动 ...

  4. 【软件测试】总结web自动化测试-selenium+python

    自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果.将人为驱动的测试行为转化为机器执行的过程. 常见的自动化测试工具:QTP.selenium.R ...

  5. web 自动化测试 selenium基础到应用(目录)

    第一章   自动化测试前提及整体介绍 1-1功能测试和自动化测试的区别 1-2自动化测试流程有哪些 1-3自动化测试用例和手工用例的区别 1-4 自动化测试用例编写 1-5 selenium的优势以及 ...

  6. Web自动化测试(Selenium自动化测试框架)

    一.Selenium的简介 1.是一种浏览器自动化测试框架 2.用于web应用程序的自动化测试 二.Selenium 1.0 的工作原理 (1)Selenium IDE: Selenium的IDE(集 ...

  7. web自动化测试—selenium游览器下拉框操作

    # coding=utf-8'''下拉框实战思路导包:from selenium.webdriver.support.select import Select #下拉框select from sele ...

  8. Web自动化测试 Selenium+Eclipse+Junit+TestNG+Python

    Selenium+Eclipse+Junit+TestNG+Python 第三步 下载Selenium IDE.SeleniumRC.IEDriverServer.SeleniumClient Dri ...

  9. 软件测试 Web自动化测试 基础知识 HTML CSS JavaScript

    文章目录 1 HTML 1.1 HTML简述 1.1.2 常用基本标签 1.1.3 表格 1.1.4 表单(重点) 表单小结 HTML小结 2 CSS样式表 2.1 三种格式修改样式 2.1.1 行内 ...

最新文章

  1. 您的主机不满足在启用hyper-v或device_是时候换掉你的旧书桌了!乐歌E5M电动升降桌,坐立换姿不疲劳...
  2. console.log()的兼容性
  3. 打分排序系统漫谈1 - 时间衰减
  4. 【机器学习基础】逻辑回归 + GBDT模型融合实战!
  5. c++适配器模式adapter
  6. python代码_如何使用 Sphinx 给 Python 代码写文档
  7. 前端样板资源概览及总评
  8. ad17 pcb扇孔_PCB设计中为什么需要先进行扇孔
  9. 第三十三章 机械化印刷
  10. java thread.notify_Java Thread notify()方法
  11. rsync、scp “tab” 卡顿问题
  12. 在vue项目中使用图片浏览组件v-viewer,支持旋转、缩放、翻转等操作
  13. 我是如何入门机器学习的呢
  14. 爬虫小程序 - 翻译君
  15. 中文依存句法结构分析
  16. 控制项目进度的方法之一:里程碑式管理
  17. 事务的隔离级别2 (TRANSACTION ISOLATION LEVEL)
  18. 无线蓝牙耳机什么牌子好?适合学生党的蓝牙耳机性价比排行榜
  19. firefox装在linux_在 Linux 中安装 Firefox
  20. Android面试题总结(三)

热门文章

  1. stm32 独立看门狗时钟配置
  2. odoo 如何解决 由于附件过多 备份超时的现象
  3. 有点小资金想投资,但是没有太多时间花费去关注项目,该怎么投资
  4. 获取微信运动 php,微信修改步数(卡密版)v1.2.1 PHP程序
  5. 透视变换---一点透视和两点透视
  6. 分析国内CRM系统全新排行
  7. 用华为手机一定要关闭这2个功能,越快越好,最好马上关闭!
  8. 前端《别踩白块儿》小游戏 源码分享
  9. 图解 MySQL 索引,清晰易懂,写得太好了…
  10. 华为网络配置(Eth-Trunk)