Selenium自动化测试秘籍:解锁常用函数实战指南

目录

1.元素的定位

2.操作测试对象

2.1.点击/提交对象

2.2.模拟按键输入

2.3.清除文本内容

2.4.获取文本信息:

特殊情况:元素属性值

获取当前页面标题和URL方法:

3. 窗口

3.1.切换窗口:

3.2.窗口大小的设置

4.屏幕截图

4.1.一般做法:

4.2.进阶做法(文件名随时间变化)

4.3.关闭窗口

5.弹窗

5.1.警告弹窗+确认弹窗

5.2.提示弹窗

6.等待

6.1.强制等待sleep()

6.2.隐式等待:

6.3.显示等待 

TIP:隐式等待和显示等待不建议一起使用

7.浏览器导航

7.1.打开网址

7.2.浏览器的前进、后退、刷新

8.文件上传

代码:

9.浏览器参数设置

9.1.设置无头模式

9.2.页面加载策略

总结:

1.元素的定位

获取页面单个元素,使用find_element

获取页面多个元素,使用find_elements

实战:获取百度首页中所有热搜的内容

发现当前元素存在6个,在页面中CTRL+F进行查询即可

代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager#元素定位#1.打开浏览器----驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))driver.get('https://www.baidu.com/?tn=68018901_16_pg')
ret = driver.find_elements(By.CSS_SELECTOR,'#hotsearch-content-wrapper > li')
for i in ret:print(i.text)

测试用例:

输出页面所有的热搜文字

测试结果:

正确!

查找元素的方式:

选择器、xpath、id、class_name

常用的主要就是cssSelector和xpath。

driver.find_element(By.CSS_SELECTOR,'#kw')

例如这就是cssSelector的使用方法,那如何确定元素具体的位置呢?

只要赋值selector就可以啦

我们目前就学习手动赋值selector选择器,xpath同理。

2.操作测试对象

获取到了页面的元素之后,接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清楚、获取文本

2.1.点击/提交对象

click()函数用法 注意要用find_element函数 不然会报错!

from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager#元素定位#1.打开浏览器----驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))driver.get('https://www.baidu.com/?tn=68018901_16_pg')
driver.find_element(By.CSS_SELECTOR,'#hotsearch-content-wrapper > li:nth-child(2) > a > span.title-content-title').click()
sleep(3)

2.2.模拟按键输入

代码:

driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('迪丽热巴')

2.3.清除文本内容

如果连续使用send_keys的话,是不会清空文本内容的 需要我们自己clear

代码:

driver.get('https://www.baidu.com/?tn=68018901_16_pg')
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('迪丽热巴')
sleep(2)
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('我爱你')
sleep(10)

代码执行效果:

代码:

driver.get('https://www.baidu.com/?tn=68018901_16_pg')
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('迪丽热巴')
sleep(2)
driver.find_element(By.CSS_SELECTOR,'#kw').clear()
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('我爱你')
sleep(10)

这下屏幕上只有我爱你的内容了

2.4.获取文本信息:

如何判断获取到的元素对应的文本是否符合预期呢?获取元素对应的文本并打印一下~

调用text

获取到元素对应的文本信息之后,通过断言来判断文本信息是否符合预期

发现匹配不上,就会断言错误。

特殊情况:元素属性值

元素属性值 != 文本信息

可以看出百度首页的 百度一下 这4个字就不是文本信息,而是属性!

当然我们也可以获取属性值:

get_attribute(属性)

获取当前页面标题和URL方法:

title current_url

3. 窗口

打开⼀个新的页面之后获取到的title和URL仍然还是前⼀个页面的
当我们手工测试的时候,我们可以通过眼睛来判断当前的窗⼝是什么,但对于程序来说它是不知道当前最新的窗⼝应该是哪⼀个。对于程序来说它怎么来识别每⼀个窗⼝呢?每个浏览器窗⼝都有⼀个唯⼀的属性句柄(handle)来表⽰,我们就可以通过句柄来切换

3.1.切换窗口:

如果不切换,默认还是在第一个窗口(通过url和title可以检测出来,进行验证)

没有切换的场景:

切换窗口的代码:

title = driver.title
url = driver.current_urlprint('before:'+title)
print('before:'+url)driver.find_element(By.CSS_SELECTOR,'#hotsearch-content-wrapper > li:nth-child(3) > a > span.title-content-title').click()
sleep(3)#获取当前页面的句柄---第一个标签页
curHandle = driver.current_window_handle
#获取所有句柄
allHandle = driver.window_handles
#遍历所有的句柄,切换到新的页面
for handle in allHandle:if handle != curHandle:#切换句柄driver.switch_to.window(handle)print('after:'+driver.title)
print('after:'+driver.current_url)
driver.quit()

效果展示:切换成功!

若页面发生跳转后未打开新的标签页,则不需要进行窗口的切换

3.2.窗口大小的设置

#窗⼝最⼤化
driver.maximize_window()
#窗⼝最⼩化
driver.minimize_window()
#窗⼝全屏
driver.fullscreen_window()
#⼿动设置窗⼝⼤⼩
driver.set_window_size(1024,768)

4.屏幕截图

我们的自动化脚本⼀般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景,能更好的定位问题和解决问题

4.1.一般做法:

filename = "D:\\PythonProject\\image\\test.png"
driver.save_screenshot(filename)

注意这里需要我们提前将image文件创建好,然后图片存放的就在这个路径下

代码:

#1.打开浏览器----驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))driver.get('https://www.baidu.com/?tn=68018901_16_pg')
# driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('迪丽热巴')
# sleep(2)
# driver.find_element(By.CSS_SELECTOR,'#kw').clear()
# driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('我爱你')
# sleep(10)title = driver.title
url = driver.current_urlprint('before:'+title)
print('before:'+url)#屏幕截图进阶做法:每次生成的图片文件名不一样
#百度首页
filename = "D:\\PythonProject\\image\\test.png"
driver.save_screenshot(filename)

这里我们来截图百度首页,效果:成功!

问题:

由于图片给定的名称是固定的,当我们多次运行自动化脚本时,历史的图片将被覆盖。

那如何将历史的图片文件都保存下来呢?让每次生成的图片文件名称都不一样

4.2.进阶做法(文件名随时间变化)

代码:

filename = 'autotest-'+datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')+'.png'
driver.save_screenshot('./images/'+filename)

代码解析:

  1. datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S'):这部分代码使用了Python的datetime模块来获取当前的日期和时间,并通过strftime方法将其格式化为字符串。格式'%Y-%m-%d-%H%M%S'表示年份-月份-日期-小时-分钟-秒,例如2023-04-01-123045

  2. 'autotest-'+...+'.png':这里将上一步得到的日期时间字符串与'autotest-'前缀和.png后缀组合起来,形成完整的文件名,例如autotest-2023-04-01-123045.png

  3. filename = ...:将上述组合好的文件名赋值给变量filename

  4. driver.save_screenshot('./images/'+filename):这行代码调用了WebDriver的save_screenshot方法来保存当前网页的截图。截图文件被保存在./images/目录下(./表示当前工作目录),文件名是前面通过变量filename确定的。如果images目录不存在,你可能需要先创建它,否则这段代码会抛出一个错误

实战:

我们首先打开百度首页,然后截图,接着再打开第一条热搜再截一张图(注意这里要切换窗口!!!),我们的预期是在images路径下生成两个不同的图片,不会被覆盖,开始测试!

注意要切换窗口不然默认还是在百度首页上进行截图

成功!!!

4.3.关闭窗口

driver.close()退出一个窗口

driver.quit ( )  退出浏览器,当执行driver.quit()后,所有的标签页都会被关闭

注意点:

关闭窗口!=关闭浏览器,因此在执行driver。close()之后仍然还需要调用driver.quit()

5.弹窗

弹窗是在页面是找不到任何元素的,这种情况怎么处理?使用selenium提供的Alert接口

处理一般步骤:

  1. 切换到弹窗
  2. 关闭弹窗(点击确定/取消)

5.1.警告弹窗+确认弹窗

  1. 页面上定位不到弹窗元素
  2. 出现了弹窗,页面其他元素也无法定位
  3. 即页面出现了弹窗,必须先处理弹窗之后才能定位到页面的元素
#点击调起弹窗
driver.find_element(By.CSS_SELECTOR,"tooltpip").click()
alert = driver.switchTo.alert
//确认
alert.accept()
//取消
alert.dismiss()

5.2.提示弹窗

alert = driver.switchTo.alert
alert.send_keys("hello")
alert.accept()
alert.dismiss()

注意转义字符:

报错信息:

InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified

所以需要再加一个/

测试代码:

driver.get('https://www.baidu.com/?tn=68018901_16_pg')
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('迪丽热巴')
driver.find_element(By.CSS_SELECTOR,'#su').click()
sleep(3)
driver.find_element(By.CSS_SELECTOR,'#\\31  > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center').click()driver.quit()

页面明明存在元素,但是代码执行报错:

但是代码中添加了sleep(3),就可以成功执行!

脚本的执行速度非常快,而页面要加载的资源比较多,因此当脚本执行到改行代码时页面还没有渲染完成,因此找不到该元素,当添加了time.sleep(3)之后,页面已经在3秒内加载完成,此时再去查找该元素就可以找到~

6.等待

通常代码执行的速度比页面渲染的速度要快,如果避免因为渲染过慢出现的自动化误报的问题呢?可以使用selenium中提供的三种等待方法:

6.1.强制等待sleep()

单位是秒

强制等待的原理:

当调用该方法时,程序会直接阻塞,等待指定秒数后继续执行后面的代码

优点:使用简单,调试的时候比较有效

缺点:影响运行效率,浪费大量的时间

1个或数量较少的测试脚本的时候,添加强制等待消耗的时间不过数秒

实际在工作中,业务场景比较复杂,要添加的自动化脚本非常多,通常来说自动化测试脚本数量可达到上百

假如200个脚本,每个脚本添加若于个等待时间,假设平均等待时间为6秒200 *6=1200s 大约20min,这个时间在程序运行时间里算是非常久的,而实际可接受的自动化运行时间为几秒或者几分钟之内

6.2.隐式等待:

#隐式等待5秒
driver.implicitly_wait(5)

隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错

代码:

#隐式等待
driver.implicitly_wait(3)driver.get('https://www.baidu.com/?tn=68018901_16_pg')
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('迪丽热巴')
driver.find_element(By.CSS_SELECTOR,'#su').click()

隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放掉( driver.quit() ),隐
式等待就⼀直生效。
优点:智能等待,作用于全局

若等待指定秒数后还是查找不到元素,就会报错

6.3.显示等待 

显示等待也是⼀种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码

WebDriverWait(driver,sec).until(functions)
functions :涉及到selenium.support.ui.ExpectedConditions包下的 ExpectedConditions

ExpectedConditions下涉及到的方法(网址):
selenium.webdriver.support.expected_conditions — Selenium 4.29.0.202501201850 documentation

测试检查元素的可见性

显示等待可以等待隐式等待无法处理的问题,但是仍然无法等待弹窗,因为弹窗不是页面的元素,无法通过页面元素来定位到弹窗

源码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from selenium.webdriver.support import expected_conditions as EC #给一个别名
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager#元素定位#1.打开浏览器----驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))driver.get('https://www.baidu.com/?tn=68018901_16_pg')
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('迪丽热巴')
driver.find_element(By.CSS_SELECTOR,'#su').click()
#强制等待
#sleep(3)
#time.sleep()
#driver.find_element(By.CSS_SELECTOR,'#\\31  > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center').click()
#显示等待
wait = WebDriverWait(driver,3)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'#\\31  > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center')))driver.quit()

显示等待代码成功创建,测试成功!

优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活

缺点:写法复杂

TIP:隐式等待和显示等待不建议一起使用

结果:重试多次,设置10秒的隐式等待和15秒的显示等待导致20秒后发生超时!

小提示:
不要混合隐式和显式等待,可能会导致不可预测的等待时间
强制等待可以任意配合隐式等待或者显示等待来使用!

7.浏览器导航

7.1.打开网址

这里测试用的是百度的网站

driver.get("hhttps://www.baidu.com/?tn=68018901_16_pg") 

7.2.浏览器的前进、后退、刷新

driver.back()
driver.forward()
driver.refresh()

何为前进、后退、刷新?

8.文件上传

点击文件上传的场景下会弹窗系统窗口,进行文件的选择。selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素。但是可以使用sendkeys来上传指定路径的文件,达到的效果是⼀样的

代码:

driver.get("file:///D:/file/%E6%AF%94%E7%89%B9%E6%95%99%E5%8A%A1/%E6%B5%8B%E8%A
F%95/selenium4html/selenium-html/upload.html")
ele = driver.find_element(By.CSS_SELECTOR,"body > div > div >
input[type=file]")
ele.send_keys("D:\\file\\test.txt")

注意文件路径分隔要用转移字符\\,不能只有一个\,这样就会造成错误!

通过send_keys()方法,可以实现将本地文件夹中的文件上传上来(注意要写完整的文件的路径+文件名)

9.浏览器参数设置

9.1.设置无头模式

无头模式的概念:

程序在后端运行,界面看不到页面的表现。

注意自动化打开浏览器默认是有头模式,因此需要我们手动进行无头模式的设置

options = webdriver.ChromeOptions()
options.add_argument("-headless")
driver =
webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),options
=options)

9.2.页面加载策略

options.page_load_strategy = '加载方式'

页面加载主要有3种模式:

  1. normal:默认值,等待所有资源下载完毕
  2. eager:DOM访问已经准备就绪,但诸如图像的其他资源可能仍在加载
  3. none:完全不会阻塞webdriver(不建议!)

下面就是eager状态:

driver.get()默认情况下等待所有的资源加载完成之后才能继续往下执行,但是实际上主页面加载完成之后我们就可以继续执行自动化,若一直等待的话可能造成页面超时、元素找不到的问题

总结:

selenium自动化一般步骤:

  1. 初始化浏览器
  2. 打开一个网页
  3. 对该网页进行自动化测试操作
  4. 打印标题
  5. 关闭浏览器
from selenium import webdriverfrom selenium.webdriver.chrome.service import Service as ChromeServicefrom webdriver_manager.chrome import ChromeDriverManager# 初始化 Chrome 浏览器driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))# 打开一个网页driver.get("https://www.google.com")# 打印标题print(driver.title)# 关闭浏览器driver.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25604.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统5-进程信号1(信号基础)

上篇文章:Linux操作系统4-进程间通信5(共享内存实现两个进程通信)-CSDN博客 本篇Gitee仓库:myLerningCode/l25 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重点:信号的概念 一. 信号基…

【博资考4】网安学院-硕转博考试内容

【博资考4】硕转博考试内容 - 网络安全与基础理论 写在最前面一. **21年硕转博面试内容回顾**网络、逆向、操作系统、攻防、漏洞1. **网络安全常见攻击方式及其防范措施**1.1 **DDoS攻击(分布式拒绝服务)**1.2 **SQL注入攻击**1.3 **XSS攻击(…

考研/保研复试英语问答题库(华工建院)

华南理工大学建筑学院保研/考研 英语复试题库,由华工保研er和学硕笔试第一同学一起整理,覆盖面广,助力考研/保研上岸!需要👇载可到文章末尾见小🍠。 以下是主要内容: Part0 复试英语的方法论 Pa…

TCP基本入门-简单认识一下什么是TCP

部分内容来源:小林Coding TCP的特点 1.面向连接 一定是“一对一”才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的 2.可靠的 无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个…

使用Uni-app实现语音视频聊天(Android、iOS)

使用Uni-app开发手机端APP已经变得很普遍,同一套代码就可以打包成Android App 和 iOS App,相比原生开发,可以节省客观的人力成本。那么如何使用Uni-app来开发视频聊天软件或视频会议软件了?本文将详细介绍在Uni-app中,…

mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽

问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键,然后点击屏幕顶部的Wi-Fi图标;2.从下拉菜单中选择 “打开无线诊断”(Open Wireless Diagnostics);3.你可能会看到一个提示窗口,…

Flutter - StatefulWidget (有状态的 Widget) 和 生命周期

StatefulWidget /*** 需求:* 两个按钮,一个计数器* 这里要用到 StatefulWidget,因为 StatelessWidget 通常用来展示固定不变的数据*/ main() > runApp(MyApp());class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {…

(八)趣学设计模式 之 装饰器模式!

目录 一、 啥是装饰器模式?二、 为什么要用装饰器模式?三、 装饰器模式的实现方式四、 装饰器模式的优缺点五、 装饰器模式的应用场景六、 装饰器模式 vs 代理模式七、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢…

如何使用 Ollama 的 API 来生成文本

如何使用 Ollama 的 API 来生成文本 简介 生成文本 生成文本的示例 加载模型 卸载模型 简介 Ollama 提供了一个 RESTful API,允许开发者通过 HTTP 请求与 Ollama 服务进行交互。这个 API 覆盖了所有 Ollama 的核心功能,包括模型管理、运行和监控。本…

Matlab地图绘制教程第2期—水陆填充图

上一期分享了海岸线图的绘制方法: 本着由浅入深的理念,本期再来分享一下水陆填充图的绘制方法。 先来看一下成品效果: 特别提示:Matlab地图绘制教程系列,旨在降低大家使用Matlab进行地图类科研绘图的门槛,…

8.Dashboard的导入导出

分享自己的Dashboard 1. 在Dashboard settings中选择 JSON Model 2. 导入 后续请参考第三篇导入光放Dashboard,相近

计算机毕设-基于springboot的融合多源高校画像数据与协同过滤算法的高考择校推荐系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

SpringBoot 整合mongoDB并自定义连接池,实现多数据源配置

要想在同一个springboot项目中使用多个数据源,最主要是每个数据源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是负责对数据源进行交互的并管理链接的。 spring提供了一个注解EnableMongoRepositories 用来注释在某些路径下的MongoRepo…

2025年信息科学与工程学院科协机器学习介绍——conda环境配置

机器学习——环境的安装 目录 机器学习——环境的安装安装pycharm安装miniconda安装需要的库Miniconda如何使用?镜像网站 下载需要的软件包和库这里着重介绍一下怎么下载pytorch 推荐一个python编辑器 ## 安装python python官网:Welcome to Python.org …

【操作系统】处理机调度

处理机调度 一、调度的概念、层次1.1 三个层次1.2 七状态模型 二、调度算法的评价指标2.1 CPU利用率2.2 系统吞吐率2.3 周转时间2.4 等待时间2.5 响应时间 三、进程调度(低级调度)的时机3.1 需要进程调度的情况3.2 不能进程调度的情况3.3 闲逛进程 四、进…

特斯拉 FSD 算法深度剖析:软件层面全解读

一、引言 特斯拉的 FSD(Full Self-Driving)系统作为自动驾驶领域的前沿成果,其软件层面的算法设计至关重要。本文将从软件的角度,深入探讨特斯拉 FSD 所采用的算法,包括感知、规划、控制等多个方面,以期为…

Flutter - 布局Widget

Flutter的布局主要分为 单子组件 和 多子组件 两大类: Container、Padding、Align这些属于单子组件,而Row、Column、ListView这些则是多子组件。 单子组件 Align组件 Align 是一个用于控制子组件位置的单子布局组件。它通过指定对齐方式&#xff08…

WorldQuant Brain的专属语言——Fast Expression

使用brain需要的编程语言 在使用BRAIN平台时往往不需要事先有编码背景,因此小白也能很快对其上手,但有经验的程序员来讲,该平台暂时没有禁止API通信低强度进行时的程序化访问(但是非常不好意思😣怎么访问我没找到&…

MySQL—使用binlog日志恢复数据

一、binlog日志恢复数据简介 在 MySQL 中,使用二进制日志(binlog)恢复数据是一种常见的用于故障恢复或数据找回的方法。以下是详细的使用步骤: 确认 binlog 已启用:首先需要确认 MySQL 服务器已经启用了二进制日志功…

解决 ERROR 1130 (HY000): Host is not allowed to connect to this MySQL server

当使用 MySQL 时,您可能会遇到错误信息“ERROR 1130 (HY000): Host ‘hostname’is not allowed to connect to this MySQL server”这是 MySQL 用于防止未经授权的访问的标准安全特性。实际上,服务器还没有配置为接受来自相关主机的连接。 Common Caus…