自动化初始
一、初识WEB-selenium自动化测试
针对bing网站的搜索功能进行自动化测试
# 从谷歌公司的一个项目selenium导入webdriver这段代码来驱动浏览器
chrome = webdriver.Chrome()
# 2、打开bing网站
chrome.get('http://cn.bing.com/')
# 3、输入关键词
chrome.find_element_by_id('sb_form_q').send_keys('51tesing')
# 4、点击搜索按钮
chrome.find_element_by_id('search_icon').click()
如今,大多数软件应用都是跑在浏览器中网站应用。不同公司和组织之间的测试效率迥异。在这个富交互和响应示处理随处可见的时代,很多组织都使用敏捷的方式来开发,因此测试自动化也称为软件项目的必备部分。测试自动化意味着使用软件工具来反复运行项目中的测试,并为回归测试提供反馈。
测试自动化有很多优点,大多数都与测试的可重复性和高执行率相关。市面上有一些商业或开源的工具来辅助测试自动化开发。Selenium应用是最广泛使用的开源方案。
二、针对海盗商城的登录功能进行自动化测试
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
# 1、登录
chrome = webdriver.Chrome()
chrome.implicitly_wait(10) # 由于页面稳定性较差,所以添加了一个隐式等待
chrome.maximize_window() # 窗口最大化
chrome.get('http://129.211.129.101:9007/index.php?m=user&c=public&a=login')
# chrome.find_element_by_id('username').send_keys('XieChuang') 该命令的输入方式已经过期
chrome.find_element(By.ID, 'username').send_keys('XieChuang')
chrome.find_element(By.ID, 'password').send_keys('123456')
# chrome.find_element_by_class_name('login_btn fl').click() # 登录的类名是复合类名,不能同时使用,fl只是一个左对齐的作用
chrome.find_element(By.CLASS_NAME, 'login_btn').click()
# 2、点击'进入商城购物'
# 登录成功后不是立马进行页面的,所以此处添加一个时间等待
time.sleep(3)
# 第三种元素定位方式,linktext
chrome.find_element(By.LINK_TEXT, '进入商城购物').click()
# 3、搜索'iphone'
chrome.find_element(By.NAME, 'keyword').send_keys('小米6')
chrome.find_element(By.CLASS_NAME, 'btn1').click()
# 4、点击商品图片
chrome.find_element(By.XPATH, '/html/body/div[3]/div[2]/div[3]/div[2]/div[1]/a/img').click()
# 5、窗口切换
# 1、找到新窗口的名字
new_window = chrome.window_handles[-1]
# 2、切换到新窗口
chrome.switch_to.window(new_window)
# 6、把选择的商品加入购物车
chrome.find_element(By.ID, 'joinCarButton').click() # 此时由于跳转了新窗口,所以无法进行操作
# 7、去购物车结算
chrome.find_element(By.CLASS_NAME, 'other_join').click()
# 8、点击结算 css selector 定位方式:在两个class之前需要加.
chrome.find_element(By.CSS_SELECTOR, '.shopCar_btn_03.fl').click()
# 9、添加新地址
chrome.find_element(By.CLASS_NAME, 'add-address').click()
# 10、填写收货人信息
chrome.find_element(By.NAME, 'address[address_name]').send_keys('XC')
chrome.find_element(By.NAME, 'address[mobile]').send_keys('15910100202')
# 11、选择地区的下拉框
sheng=chrome.find_element(By.ID,'add-new-area-select')# 将省这个下拉框进行实例化
Select(sheng).select_by_visible_text('北京市')# 将实例化的下拉框进行类型强制转换成Select型,再使用下拉框的属性进行选择
# 12、选择收货地区--市 由于下拉框中的ID是动态变化的,且class name又是同名的,所以使用find_elements来找到相同class name,再使用标签名来组合
shi=chrome.find_elements(By.CLASS_NAME,'add-new-area-select')[1]
Select(shi).select_by_visible_text('北京市')
qu=chrome.find_elements(By.TAG_NAME,'select')[2] # 使用标签名来定位
Select(qu).select_by_visible_text('海淀区')
chrome.find_element(By.NAME, 'address[address]').send_keys('迈行大厦')
chrome.find_element(By.NAME, 'address[zipcode]').send_keys('100000')
chrome.find_element(By.CLASS_NAME,'aui_state_highlight').click()
1、隐式等待
driver.implicitly_wait(10)
和time.sleep(10)的区别
隐式等待是一种智能等待,可以自动判断需要等待时间。括号中的时间代表最大等待时间
隐式等待只需要在声明driver之后,书写一次即可影响后面的所有代码
time.sleep()则需要在每次等待之前进行书写
2、窗口最大化
chrome.maximize_window()
3、窗口切换
找出新窗口的名字
new_window = driver.window_handles[-1]
切换到新窗口
driver.switch_to.window(new_window)
4、下拉框选择
定位下拉框
element=driver.find_element(By....)
把找到的页面元素,转换为下拉框的类型Select
select = Select(element)
调用Select类中的select_by_*方法
.select_by_value(选项的value属性的值)
.select_by_index(第几个选项)
.select_by_visible_text(选项的文本值)
5、find_element_by_*的形式提示代码已过期
现对原有的定位方式进行修改为find_element(By.*)
注意:使用By之前需要导包from selenium.webdriver.common.by import By
6、find_elements和find_element的区别
find_elements可以找到相同标签名的全部信息,再通过序号的形式找到对应的值
find_element只能默认找到第一个标签名的信息
driver.find_elements(...)[0]==diver.find_element(...)
三、针对海盗商城的修改个人信息功能进行自动化测试
# 1、登录
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
chrome = webdriver.Chrome()
chrome.implicitly_wait(5)
chrome.maximize_window()
chrome.get("http://129.211.129.101:9007/index.php?m=user&c=public&a=login")
chrome.find_element(By.ID, 'username').send_keys('XieChuang')
chrome.find_element(By.ID, 'password').send_keys('123456')
# submit方法:类似于click(),只能用于form表单中
# 当无法定位到按钮时,可以使用同一表单中的任意元素进行submit提交
chrome.find_element(By.ID, 'password').submit()
# 使用submit代替了定位登录按钮进行提交
# 2、修改个人信息
# 2.1 点击"账户设置"
chrome.find_element(By.LINK_TEXT, '账号设置').click()
# 2.2 点击"个人资料" 当link_text中的文字信息被其他数据阻挡时,可以使用partial_link_text使用部分的文字信息进行定位
chrome.find_element(By.PARTIAL_LINK_TEXT, '人资').click()
# 2.3 修改"真实姓名"
chrome.find_element(By.ID, 'true_name').clear()
chrome.find_element(By.ID, 'true_name').send_keys('小谢')
# 2.4 选择"性别"
# 通过CSS_SELECTOR的方式,可以采用任意的属性来定位元素。只需要在属性的两边加一对中括号即可
chrome.find_element(By.CSS_SELECTOR, '[value="1"]').click()
# 2.5 输入"出生年月"
# 日历控件
# 传统的方法是一次一次的点击,选择年月日
# 新方法:1、删除readonly属性 2、直接向日历控件中输入日期
# 问题:selenium无法实现删除一个元素的属性,但是JavaScrip可以实现
# 2.5.1编写JavaScript命令脚本
script = 'document.getElementById("date").removeAttribute("readonly")'
# 2.5.2浏览器执行这段JavaScript命令,进行属性的删除
chrome.execute_script(script)
# 2.5.3 清除默认值——由于日历控件中有默认值,直接输入日期无法完成覆盖,所以进行删除操作
chrome.find_element(By.ID, 'date').clear()
# 2.5.4 直接在输入框中输入生日
chrome.find_element(By.ID, 'date').send_keys('1980-02-02')
# 2.6 输入"QQ"
chrome.find_element(By.ID, 'qq').clear()
chrome.find_element(By.ID, 'qq').send_keys('123456789')
# 2.7 点击"确定"
chrome.find_element(By.CSS_SELECTOR, '[value="确认"]').click()
# 3、弹出框的处理
# 弹出框Alert,不是HTML的页面元素,而是JavaScript的控件
# 由于不能右键检查,所以不能用传统的方法操作
# selenium提供了三个常用处理Alert的方法
# chrome.switch_to.alert.accept() ——点击确定按钮
# chrome.switch_to.alert.dismiss() ——点击取消按钮
# chrome.switch_to.alert.text ——获取弹出框提示的文本信息
# time.sleep(3) # 处理弹出框时,隐式等待不起作用
# 隐式等待判断的是页面的加载,而弹出框出来后,页面没有刷新过,所以隐式等待在这里不起作用
# 由于time.sleep()的等待时间过长,这里引用第三种等待方式
WebDriverWait(chrome, 30, 0.5).until(expected_conditions.alert_is_present())
# WebDriverWait需要传入三个属性,diver ,timeout(最大等待时间),poll_frequency(多少时间检查一次)
# expected_conditions 条件检查,需要导包
# alert_is_present 有Alert弹出
update_status = chrome.switch_to.alert.text
print(update_status)
chrome.switch_to.alert.accept()
1、当对submit按钮无法定位时
可以通过submit方法提交表单中的任何一个元素。在form表单中,所有数据都是存在一个表单中的,对其中的一个元素进行提交都可造成所有数据一起提交的效果。
chrome.find_element(By.ID, 'password').submit()
2、css_selector定位方式
浏览器中copy。在元素上鼠标右键检查元素,选择copy再选择copy selector
手工书写selector
标签名可以直接写在css selector中使用
使用任意元素的属性来进行定位,只需要在属性的两边加一对中括号
class属性前面加一个小数点.
ID属性前面加一个井号#
[]用来表示所有属性
属性间>(大于号),表示大于号前面的元素是后面元素的父元素
属性间 (空格),表示前面的元素是后面元素的祖先元素
例如:
chrome.find_element(By.CSS_SELECTOR, '[value="确认"]').click()
chrome.find_element(By.CSS_SELECTOR,'.uploadBtn.state-finish.state-ready').click()
chrome.find_element(By.CSS_SELECTOR,'#filePicker label').click()
3、如何操作日历控件
传统的方法就是一次一次的点击,选择年月日。但是很容易出现错误
在这个日历控件中可以看到,在其属性中有一个readonly属性,这就造成了这个日历控件输入框具有只读的特性。
我们可以通过删除readonly属性,再直接输入日期的方式完成日期输入的操作
问题:
Selenium不具有删除一个元素属性的功能
JavaScript具有这个功能
# 编写一段JavaScript命令,并实例化
script = 'document.getElementById("date").removeAttribute("readonly")'
# 通过浏览器执行这段JavaScript命令,完成删除readonly属性的操作
chrome.execute_script(script)
问题:
日历控件中的readonly属性删除了,日期也输入了,但是日历控件存在默认值怎么办呢?
借助Selenium的clear动作来删除默认值
chrome.find_element(By.ID, 'date').clear()
4、弹出框的处理
页面的弹出框Alert,是JavaScript的控件,而非是HTML的页面元素。
Selenium提供了三种常用处理Alert的方法:
driver.switch_to.alert.accept()——点击确定
driver.switch_to.alert.dismiss()——点击取消
driver.switch_to.alert.text——获取弹出框提示的文本信息
注意:
在处理弹出框时,隐式等待时不起作用的
隐式等待判断的是页面加载,当Alert弹出框出现后,页面是没有刷新的,所以隐式等待无效
5、显示等待
WebDriverWait(driver,timeout=程序需要等待的最长时间,poll_frequency=每隔几秒执行until中的方法).until(method='执行什么方法,具体来做什么事情')
例如:
WebDriverWait(chrome, 30, 0.5).until(expected_conditions.alert_is_present())
其中expected_conditions表示条件检查
alert_is_present()表示有Alert弹框出现
四、针对海盗商城的后台管理系统
# 1、登录海盗商城的后台管理系统
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
# 1.1 打开后台登录界面
chrome = webdriver.Chrome()
chrome.implicitly_wait(5)
chrome.maximize_window()
chrome.get('http://localhost/pirate/admin.php')
# 1.2 输入用户名、密码、验证码
chrome.find_element(By.NAME, 'username').send_keys('admin')
chrome.find_element(By.NAME, 'userpass').send_keys('password')
chrome.find_element(By.NAME,'userverify').send_keys('1234')
# 1.3 点击登录按钮
chrome.find_element(By.CLASS_NAME,'Btn').click()
# 2、添加商品
# 2.1 在后台管理中心,点击商品管理
chrome.find_element(By.LINK_TEXT,'商品管理').click()
# 2.2 点击添加商品
chrome.find_element(By.LINK_TEXT,'添加商品').click()
# 2.3 输入商品名称
# 此处存在HTML嵌套,需要进行子页面切换
chrome.switch_to.frame('mainFrame')
chrome.find_element(By.NAME,'name').send_keys('iPone xs max')
# 2.4 选择商品分类
chrome.find_element(By.ID,'1').click()
chrome.find_element(By.ID,'2').click()
chrome.find_element(By.ID,'3').click()
# chrome.find_element(By.ID,'4')
# 元素的高级操作 ActionChains中封装了所有可以对页面元素进行的高级操作
# Action——动作
# Chains——链表
# chrome——当前浏览器
# 合起来就是,把当前浏览器转换为一个可以执行各种操作的行为链
# perform()作为结束标志
ActionChains(chrome).double_click(chrome.find_element(By.ID,'4')).perform()
# 2.5 选择商品品牌
brand = chrome.find_element(By.NAME,'brand_id')
Select(brand).select_by_value('1')
# 2.6 添加商品图片
chrome.find_element(By.LINK_TEXT,'商品图册').click()
'''
在前端点击的按钮不是真正复制上传文件的控件,真正负责上传文件的控件是<input type='file' ....>
我们要做的是,找到这个控件。然后直接对这个控件进行send_keys,发送图片或文件的路径即可
'''
chrome.find_element(By.NAME,'file').send_keys('//Mac/Home/Desktop/1643087781227.jpg')
# 注意:图片路径处的'\'要进行转义,也就是写为'/'
chrome.find_element(By.CSS_SELECTOR,'.uploadBtn.state-finish.state-ready').click()
# 处理“上传成功”弹出框
WebDriverWait(chrome, 30 ,0.5).until(expected_conditions.alert_is_present())
chrome.switch_to.alert.accept()
# 2.6 点击提交按钮
chrome.find_element(By.CLASS_NAME,'button_search').click()
1、验证码的处理
常见的验证码处理方式:
借助第三方图片识别文字的工具
缺点:准确率较低
借助第三方网站识别验证码
优点:准确率很高,几乎可以达到100%
缺点:收费
设置万能验证码
当我们在测试环境中时,求助开发人员帮忙设置一个万能验证码,以便使用
问题:如何查看系统是否存在万能验证码呢?以海盗商城为例
1、明确开发人员为海盗商城写的源代码位置
2、为了看懂开发人员的代码,必须了解MVC设计模型
M——模型层,主要用于和数据库打交道
V——视图层,主要和前端打交道,用于收集和显示用户数据
C——控制器,主要用于处理业务逻辑
判断验证码是否正确就属于业务逻辑层
3、也可以通过网址来分析功能的源代码位置
http://172.31.14.251/pirate/index.php?m=admin&c=public&a=login
网址中主要分为5个部分:
http:协议
172.31.14.251:域名或者IP地址
/index.php:路径
m=admin&c=public&a=login:参数
m=admin——m代表模块,一个模块就是一个文件夹
c=public——c代表控制器(controller),一个控制器就是一个类,一个文件
a=login——a代表动作(action),一个action就是代码中的一个方法
4、在测试环境中屏蔽掉验证码
5、绑定IP地址
有些公司,在测试环境中,如果绑定IP地址是可以不显示验证码的
6、读取cookie和缓存
7、在输入验证码前,添加一个固定的时间等待,手动输入验证码
2、frame标签的处理
在输入商品名称时,明明元素属性存在,但是定位失败,这是为什么呢?
chrome.find_element(By.XPATH,'/html/body/div[2]/div[2]/dl/form/dd[1]/ul/li[1]/input').send_keys('ipone xs max')
把鼠标放在根节点<body>标签上,检查页面高亮部分是否覆盖全屏
如果覆盖全屏,说明页面中不存在frame标签
如果不能覆盖全屏,说明页面中存在frame标签
检查后发现,页面中存在一个frame标签,且商品名称等信息都在该标签中
使用driver.switch_to.frame('frame的name属性名')来切换到frame标签中,再进行定位
3、元素的高级操作
如何实现鼠标左键的双击呢?
Selenium中提供了一个ActionChains的方法,可以对页面元素进行高级操作
context_click():鼠标右击
double_click():鼠标左键双击
drag_and_drop:拖动
move_to_element:鼠标悬停在一个元素上
click_and_hold():按下鼠标左键在一个元素上,一般配合release()释放使用
key_down():在一个元素上按住一个键不松,只能与修改键(控制,Ctrl、Alt和Shift)一起使用
key_up():松开按键,释放修改键
move_by_offset():鼠标移动
perform():执行所有ActionChains中存储的行为,在命令最后添加
4、如何上传图片
一般在前端点击的按钮都不是真正的上传文件控件,而是为了符合整体页面布局的<label>标签
在这个<label>标签的上方还存在一个<input type='file'...>标签,且class属性为不可见。我们要做的就是找到这个控件,然后直接对这个控件进行send_keys,发送图片的路径
chrome.find_element(By.NAME,'file').send_keys('//Mac/Home/Desktop/1643087781227.jpg')
5、元素定位的8种方式
ID :使用ID进行定位
NAME:使用name进行定位
使用id和name定位的优缺点:
优点:易于定位元素,大多数时其属性值时唯一的
缺点:很多元素不具备id和name属性
CLASS_NAME :使用classname进行定位
TAG_NAME :使用tagname(标签名)进行定位
使用class_name和tag_name定位的优缺点:
优点:几乎所有的元素都具备class_name和tag_name的属性
缺点:class和tag的值往往不是唯一的,很难精准找到一个元素
LINK_TEXT :使用超链接文本定位
PARTIAL_LINK_TEXT :使用部分超链接文本定位
使用link_text和partial_link_text特点:只能用于<a>标签
XPATH :使用xpath定位
CSS_SELECTOR :使用css_selector定位
使用xpath和css_selector几乎可以用于定位所有页面元素
都有工具可以直接生成,但是工具生成的不一定100%管用,有些情况仍然需要手工书写
6、几种常用定位元素后的操作方式
click() :鼠标左键单击
send_keys:模拟键盘输入
submi():提交表单
clear():清除
五、自动化测试框架unittest2
1、unittest2介绍
unittest2是unittest的升级版,都是Python自带测试库,是单元测试框架,提供了丰富的断言方法
unittest2的四大特点:
TestCase:测试案例,所有的用例都是直接继承于Unittest2.TestCase类
TestFixture:SetUp和TearDown,作为前置条件和后置条件
TestSuite:测试套件,一组测试案例,运行套件,则运行套件中所有的测试案例
TestRunner:测试运行器,与TestSuite结合一起使用
断言:在Unittest2中封装了很多成熟断言,可以直接被调用
2、unittest2的使用
Unittest2环境搭建
import unittest2
Unittest2语法规则
Unittest2中测试用例定义都是以test_开头
注意:用例排序与写的顺序无关,排序遵循A-Z,a-z,0-9
class前置条件
在类中所有方法前,需要进行的前置条件
@classmethod
def setUpClass(cls):
class后置条件
在类中所有方法后,需要进行的后置条件
@classmethod
def tearDown(cls):
前置条件
在每条测试用例方法开始前,需要进行的前置条件
def setUp(self):
后置条件
在每条测试用例方法结束后,需要进行的后置条件
def tearDown(self):
3、BaseTestCase的封装
因为所有的测试用例都需要进行浏览器的相关操作
import time
import unittest2
from selenium import webdriver
class BaseTestCase(unittest2.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
@classmethod
def tearDownClass(cls):
# time.sleep(10)
cls.driver.quit()
4、数据驱动测试
基础步骤:
创建一个Excel表格进行测试数据准备
username password confirm_password mobile_num email
changcheng2121 123456 123456 13456788765 changcheng2121@163.com
changcheng2122 123456 123456 13456788766 changcheng2121@164.com
changcheng2123 123456 123456 13456788767 changcheng2121@165.com
changcheng2124 123456 123456 13456788768 changcheng2121@166.com
编写代码读取csv表中的内容
csvFileManager.py
# 进行csv文件的读取,以进行数据驱动
# 1、导入代码库
import csv
# 2、指定csv文件所在的路径
path = r'/Users/chuangxie/Desktop/学习课件/SeleniumTest/test_data/login_test_cases.csv'
'''当路径中存在反斜线时,需要在字符串前面加一个字母r
这时系统会将反斜线默认为字符串的一部分'''
# 3、打开csv文件
file = open(path)
# 4、进行csv中数据读取
table = csv.reader(file)
# 5、打印csv文件中的内容
for i in table:
print(i)
上方代码中的弊端:
文件始终处于打开状态,会验证影响运行效率
csvFileManager2.py
import csv
import os.path
def reader(filename):
list = []
# path = '../test_data/' + filename 由于文件路径可能会变化,故舍弃
base_path = os.path.dirname(__file__) # 表示当前文件所在路径
path = base_path.replace('func','test_data/'+filename) # 将func路径替换成test_data文件夹
# file = open(path)
with open(path) as file:
table = csv.reader(file)
i = 0 # 用于剔除首行标题
for row in table:
if i == 0:
pass
else:
list.append(row)
i = i + 1
return list
把读取到的内容分别传入测试用例中,循环执行
register2Test.py
from selenium.webdriver.common.by import By
from func.csvFilemanager2 import reader
from test_case.BaseTestCase import BaseTestCase
class register2Test(BaseTestCase):
def test_register(self):
table = reader('register_test_cases.csv')
for row in table:
self.driver.get('http://129.211.129.101:9007/index.php?m=user&c=public&a=reg')
self.driver.find_element(By.NAME, 'username').send_keys(row[0])
self.driver.find_element(By.NAME, 'password').send_keys(row[1])
self.driver.find_element(By.NAME, 'userpassword2').send_keys(row[2])
self.driver.find_element(By.NAME, "mobile_phone").send_keys(row[3])
self.driver.find_element(By.NAME, 'email').send_keys(row[4])
上方代码中的弊端:
当使用for循环时,如果有一组数据运行失败了,后面的代码都不会被执行
改进方法:使用ddt代码库
csvFileManager3.py
import ddt
from selenium.webdriver.common.by import By
from func.csvFilemanager2 import reader
from test_case.BaseTestCase import BaseTestCase
@ddt.ddt
class register3Test(BaseTestCase):
table = reader('register_test_cases.csv')
@ddt.data(*table)
def test_register(self, row):
self.driver.get('http://129.211.129.101:9007/index.php?m=user&c=public&a=reg')
self.driver.find_element(By.NAME,'username').send_keys(row[0])
self.driver.find_element(By.NAME, 'password').send_keys(row[1])
self.driver.find_element(By.NAME, 'userpassword2').send_keys(row[2])
self.driver.find_element(By.NAME, "mobile_phone").send_keys(row[3])
self.driver.find_element(By.NAME, 'email').send_keys(row[4])
问题:类上面的修饰器的作用是什么?
@ddt.ddt class register3Test(BaseTestCase):
用来表示该类是一个数据驱动测试类
问题:方法上面的修饰器的作用是什么?
@ddt.data(*table) def test_register(self, row):
用来指定测试数据源,要求数据源格式为多个参数
*table 是将table 列表中的数据进行了拆分,每一行即为一个参数
5、生成测试报告(HTMLTestRunner)
HTMLTestRunner提供了一个可以生成美观的测试报告的模板
使用方法:
下载并复制HTMLTestRunner.py文件到我们的项目中
使用HTMLTestRunner这个类来执行测试用例
run_all_cases.py
import unittest2
from lib.HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
# 1、找到所有需要执行的测试用例
suite = unittest2.defaultTestLoader.discover('./test_case', '*Test.py')
# 2、执行找到的测试用例集
# unittest2.TextTestRunner().run(suite)
# 3、生成测试报告
# 指定测试报告生成位置
path = 'report/TestReport.html'
file = open(path, 'wb') # w表示写,b表示二进制,
HTMLTestRunner(stream=file, verbosity=1, title='自动化测试报告', description='测试环境:Chrome', tester='谢闯').run(suite) # 实例化HTMLTestRunner
在实例化HTMLTestRunner时需要传入五个参数
HTMLTestRunner(stream=二进制文件, verbosity=1(日志的详细程度,默认即可),title=报告的标题,description=报告的正文, tester = 测试人员的名字)
文件file = open(path, 'wb')的保存:
默认是以只读的方式打开文件
w表示以写的方式打开文件
b表示以二进制的方式进行写入
6、断言
作用:自动判断测试用例执行的结果是否成功
一般情况使用的检查点包括:
页面级别的检查
网页的标题
网址的变化
页面元素级别的检查
元素的文本
元素的某个属性
以海盗商城的登录为例
# 对比网页的title
self.assertEqual('我的会员中心 - 道e坊商城 - Powered by Haidao', self.driver.title)
# 对比网址的变化
self.assertEqual('http://129.211.129.101:9007/index.php?m=user&c=index&a=index', self.driver.current_url)
# 对比登录成功后,是否有登录用户名显示
# a:nth-child(1)——表示为第一个<a>子标签,n=1
welcome = self.driver.find_element(By.CSS_SELECTOR, '.site-nav-right.fr > a:nth-child(1)').text
self.assertEqual('您好 XieChuang', welcome)
# 对比页面跳转后的搜索value属性是否相同
search = self.driver.find_element(By.CSS_SELECTOR, '.btn1').get_attribute('value')
self.assertEqual('搜索', search)
实际运行代码如下:
import time
import ddt
from selenium.webdriver.common.by import By
from TestCases.BaseTestCases import BaseTestCases
from TestCases.csvFileManager2 import reader
@ddt.ddt
class loginTest(BaseTestCases):
table = reader('login_test_cases.csv')
@ddt.data(*table)
def test_login(self, row):
self.chrome.get('http://129.211.129.101:9007/index.php?m=user&c=public&a=login')
self.chrome.find_element(By.NAME, 'username').send_keys(row[0])
self.chrome.find_element(By.NAME, 'password').send_keys(row[1])
self.chrome.find_element(By.NAME, 'password').submit()
time.sleep(3)
welcome = self.chrome.find_element(By.CSS_SELECTOR, '.site-nav-right.fr>a:nth-child(1)').text
self.assertEqual('您好 '+row[0]+'', welcome)
六、持续集成
目标:
实现定时执行测试用例
测试报告邮件提醒
1、安装环境
安装jdk
配置环境变量JAVA_HOME:安装路径
解压tamcat文件
解压tomacat文件夹,一般存放在D盘根目录中
Jenkins文件处理
将Jenkins.war文件复制到到tomacat\webapps文件夹中
2、启动Jenkins
运行tomacat\bin下面的startup.bat文件
当出现jenkins is fully up and running后
在浏览器上输入网址
或者在webapps目录下使用dos命令:java -jar jenkins.war
3、定时执行测试任务
在构建中选择window批处理命令
cd 项目路径
Python 测试用例执行脚本.py
编辑日程表
5个时间单位
分钟
小时
日期
月份
星期
6个符号
空格 :时间单位的间隔,有且只能有4个
*星号:表示有可能的取值
例:0 21 * * * 每天21点分别执行一次
-横线:表示区间
例:0 21 * * 1-5 每周一到周五的21点自动执行一次
,逗号:表示枚举
例: 0 8,12,20 * * * 每天的8点、12点、20点自动执行一次
/斜线:表示间隔
例:*/30 * * * * 每隔30分钟执行一次
H:用于分散负载
例:H/30 * * * * 同样是每隔30分钟执行一次,但不一定是整点和半点执行,可能在任何一个时间点。会自动找服务器的空闲时间执行,更推荐使用
4、设置邮件提醒
安装插件
HTML Publisher
Email Extension Plugin
Email Extension Template Plugin
修改配置信息
系统管理员邮件地址
改成发邮件的邮箱
注意:要求是一个设置过客户端授权码的邮箱(我的授权码TALEENGMSITQLWAQ)
Extended E-mail Notification
SMTP server:smtp.163.com
SMTP Port:465
点击高级:添加jenkins
用户名:邮箱账号
密码:授权码,不能使用邮箱密码
ID:空
描述:空
勾选USE SSL
Default user e-mail suffix(默认邮箱后缀):@163.com
点击高级:
Admin Account Address:填写发件箱
SMTP server:smtp.163.com
SMTP Port:25
Default Content Type:HTML(text/html)
Default Recipients:默认的收件人地址
Default Content:默认的邮件正文
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
本邮件由系统自动发出,无需回复!<br/>
各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br>
<td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>测试报告: <a href="${PROJECT_URL}HTML_20Report">测试报告</a></li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>触发原因: ${CAUSE}</li>
<li>构建状态: ${BUILD_STATUS}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
<h4><font color="#0B610B">失败用例</font></h4>
<hr size="2" width="100%" />
$FAILED_TESTS<br/>
<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>
</td>
</tr>
</table>
</body>
</html>
————————————————
版权声明:本文为CSDN博主「闯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_49274450/article/details/122791047
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 【设计模式】UML类图关系与符号
文章目录一、UML简介1.1 UML类图常用关系1.2 UML模型结构1.3 UML类的表示二、类之间的关系2.1 泛化(Generalization)2.2 实现(Realization)2.3 关联(Association)(1)单项关联(2)双向关联(3)自关联2.4 聚合(…...
2024/4/8 19:46:25 - 建木持续集成平台v2.2.2发布
建木持续集成平台基于建木,致力于为国内开发者与DevOps人员提供极致用户体验,提升开发、上线、运维的效率,让软件用户专注于提供业务价值。 建木持续集成平台v2.2.2现已发布 主要更新:修复若干已知bug fixed: 日志太大导致页面…...
2024/4/24 15:53:06 - C++PrimerPlus 学习笔记 | 第十章 类和对象|3.实现类的成员函数 4.使用类 5.小结
实现类的成员函数 实现类的第二个步骤就是为在类声明中的函数原型提供代码,成员函数定义与常规函数非常类似,它们有函数头与函数体,也有返回类型和参数,但是它们还包含两个特殊的特征 定义成员函数使用作用域解析符(::::::)来标…...
2024/4/25 22:59:27 - 专利申请人数有什么限制
一、专利申请人数有什么限制 专利申请人数量没有限制的。第一发明人的位置最重要,第二、第三有一些意义,后面的就只剩下名义上参加过项目的意义了。申请人的数量会影响申请费的多少,一个人申请,申请费减免85%,两个或者…...
2024/4/13 3:45:57 - CentOS7安装ODBC DRIVER连接SQL Server
1.安装UnixODBC yum install unixODBC unixODBC-develodbc_config --version --longodbcversion --cflags --ulen --libs --odbcinstini --odbciniodbcinst -jisql --version2.安装ODBC Driver 17 for SQL Server wget https://packages.microsoft.com/rhel/7/prod/msodbcsql…...
2024/4/26 4:17:17 - 高频面试真题答案 -java后端 -java框架篇
原贴:2022届秋招高频面试真题汇总,千题奉送!!!- 后端篇_笔经面经_牛客网 整理答案: SpringAOP的底层原理 51 SpringBean的生命周期 31 Spring中IOC的底层原理 28 Spring如何解决循环依赖 22 spring的动…...
2024/4/23 2:17:37 - 绝对中位差Median Absolute Deviation
文章目录 绝对中位差Median Absolute Deviation 示例 用途 MAD与标准差的关系 总体MAD R语言MAD函数 绝对中位差Median Absolute Deviation 参考维基百科中的MAD定义 在统计学中,绝对中位数MAD是对单变量数值型数据的样…...
2024/4/14 19:24:09 - 造轮子-简易版spring
自研框架文档: 新建一个maven项目命名为simpleFramework 在java目录下新建com.bear包 main同级新建webapp/WEB-INF/jsp hello.jsp文件 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>Ti…...
2024/4/24 23:51:22 - 技术解读:实时数仓Hologres如何支持超大规模部署与运维
简介:在本次评测中,Hologres是目前通过中国信通院大数据产品分布式分析型数据库大规模性能评测的规模最大的MPP数据仓库产品。通过该评测,证明了阿里云实时数仓Hologres能够作为数据仓库和大数据平台的基础设施,可以满足用户建设大…...
2024/4/13 3:45:42 - Golang hijack 劫持
简介Hijack type Hijacker interface {// Hijack lets the caller take over the connection.// After a call to Hijack the HTTP server library// will not do anything else with the connection.//// It becomes the callers responsibility to manage// and close the c…...
2024/4/18 2:42:06 - 2022年软件测试行业的现状和前景?
2022年,软件测试这个行业又将如何发展呢?我来谈一下我眼中软件测试行业发展的几个点,如果你处在这个行业,一定能体会到我说的对不对。 1、表面"衰落"的测试行业 鉴于过去的大形势变化, 不懂技术的测试工程…...
2024/4/13 3:46:07 - 2022-2028全球垫片金属板式换热器行业调研及趋势分析报告
据恒州诚思调研统计,2021年全球垫片金属板式换热器市场规模约 亿元,2017-2021年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2028年市场规模将接近 亿元,未来六年CAGR为 %。 本文调研和分析全球垫片金属…...
2024/4/19 17:48:29 - WordPress添加文章置顶、密码保护、私密标记
笔者想给WordPress文章添加置顶、密码保护、私密的标记,以便于识别,并有两种方法 作为文章标题前缀显示单独显示 作为文章标题前缀显示 我们知道,WordPress默认会给密码保护的文章、私密的文章添加“密码保护:”和“私密&#…...
2024/4/15 0:10:41 - Windows窗体应用(.NET Framework)项目记录(1)
2022.2.11 问题一 :拿到的这个程序具体是什么? 答 :根据"项目属性"得知,改程序属于"WinForms"; Question: 1.1"xaml"是什么?(Get,做"桌面端UI"时&am…...
2024/4/18 20:56:45 - 《Android入门到精通》第一章学习笔记总结
📒 博客首页:✎﹏ℳ๓敬坤的博客 🎈 😊 我只是一个代码的搬运工 🎃 🎉 欢迎来访的读者关注、点赞和收藏 🤞 😉有问题可以私信交流 😆 📃 文章标题:…...
2024/4/20 16:14:39 - python高级编程总结
Python中一切皆对象 一切皆对象得含义就是每一个都有自己得属性,每一个都有自己得继承关系,你看到没有继承得,其实它隐式继承了object或者type。关于type可以看看元类。是对象意味着它可以随时随地得使用,比如赋值给一个变量&…...
2024/4/27 2:45:44 - 【情人节】--可变色爱心,可写下爱人名字
快来试试吧! #include<stdio.h> #include <windows.h> int main() {system("mode con cols80 lines35"); double x,y,a;printf(" XXX , 我爱你!\n"); for(y1.5;y>-1.5;y-0.1){for(x-1.5;…...
2024/4/26 13:51:49 - 2022-2028全球垫片板式换热器行业调研及趋势分析报告
据恒州诚思调研统计,2021年全球垫片板式换热器市场规模约 亿元,2017-2021年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2028年市场规模将接近 亿元,未来六年CAGR为 %。 本文调研和分析全球垫片板式换热…...
2024/4/13 3:46:17 - 全球与中国实验室砂浆研磨机行业现状调研及趋势分析报告
2021年全球实验室砂浆研磨机市场销售额达到了 亿美元,预计2028年将达到 亿美元,年复合增长率(CAGR)为 %(2022-2028)。地区层面来看,中国市场在过去几年变化较快,2021年市场规模为 百…...
2024/4/25 4:38:18 - javaSE中HashMap对null的处理
package collection;import java.util.HashMap; import java.util.Map;public class HashMapTest03 {public static void main(String[] args) {Map map new HashMap();// HashMap集合允许key为nullmap.put(null, null);System.out.println(map.size()); // 1// key重复&#…...
2024/4/25 0:36:35
最新文章
- Matlab|交直流混合配电网潮流计算(统一求解法)
目录 1 主要内容 算例模型 统一求解法迭代方程 算法流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序为matlab代码,采用统一求解法对交直流混合配电网进行潮流计算,统一迭代法又称统一求解法,其思路是将混联系统中的交流网…...
2024/4/27 15:11:12 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - A股企业数据要素利用水平数据集(2001-2022年)
参照史青春(2023)的做法,团队对上市公司-数据要素利用水平进行测算。统计人工智能技术、区块链技术、云计算技术、大数据技术、大数据技术应用五项指标在企业年报中的披露次数,求和后衡量数据要素投入水平。 一、数据介绍 数据名…...
2024/4/27 8:53:14 - JVM学习笔记
文章目录 一、内存模型1. 程序计数器2. 栈3. 本地方法栈4. 堆5. 方法区方法区位置字符串常量池位置 6. 直接内存 二、虚拟机参数设置三、类的生命周期1. 加载2. 连接1)验证2)准备3)解析 3. 初始化4. 卸载 四、类加载器1. 启动类加载器2. 扩展…...
2024/4/23 14:15:51 - 大数据学习十三天(hadhoop基础2)
一: MapReduce概述(了解) MapReduce是hadoop三大组件之一,是分布式计算组件 Map阶段 : 将数据拆分到不同的服务器后执行Maptask任务,得到一个中间结果 Reduce阶段 : 将Maptask执行的结果进行汇总,按照Reducetask的计算 规则获得一个唯一的结果 我们在MapReduce计算框架的使用过…...
2024/4/21 15:56:12 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/25 18:39:22 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/26 16:00:35 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57