自动化测试
线性脚本
导入数据库连接库importpymysql
创建数据库连接对象db=pymysql.connect(host="192.168.2.200",user="root",password="123456",database="bbs",port=3306)
创建游标对象cursor=db.cursor()
给游标对象赋予内容cursor.execute(("select * from pre_common_nav;"))
获取游标对象的所有内容print(cursor.fetchall())
获取第一行的内容print(cursor.fetchone())
插入语句cursor.execute("insert intostudent(id,name,phone,age,class,score)values(6,"name","18088889999",22,9,100);")
将student赋予游标对象cursor.execute(("select * from student;"))
获取游标对象的所有内容print(cursor.fetchall())
谷歌驱动安装
1.查询Chrome版本号在Chrome浏览器中访问地址chrome://version/
2.驱动镜像文件下载进入http://npm.taobao.org/mirrors/chromedriver,下载Chrome对应的Chromedriver.exe
3.驱动安装将下载的压缩包解压到python37目录下的scripts中
selenium
导入webdriver模块from selenium import webdriver
导入time包import time
创建浏览器对象driver=webdriver.Chrome()
调用get方法访问百度driver.get("http://www.baidu.com")
最大化窗口driver.maximize_window()
定位id=kw的元素输入pythondriver.find_element_by_id("kw").send_keys("python")
定位name=wd的元素输入pythondriver.find_element_by_name("wd").send_keys("python")
定位class_name=s_ipt的元素输入pythondriver.find_element_by_class_name("s_ipt").send_keys("python")
链接文本进行定位driver.find_element_by_link_text("hao123").click()
链接文本模糊匹配定位driver.find_element_by_partial_link_text("ao12").click()
通过js定位js='vara=document.getElementById("kw").value="python"'
driver.execute_script(js)
将输入框元素放进列表all=driver.find_elements_by_tag_name("input")
遍历列表取得所有input标签,如果标签的id为kw,就在标签中输入pythonfor i in all:
ifi.get_attribute("id")=="kw":
i.send_keys("python")
xpath定位(打开网页元素,选择标签,右键copy→copyxpath)driver.find_element_by_xpath('//*[@id="kw"]').send_keys("python")
driver.find_element_by_xpath('//*[@class="s_ipt"]').send_keys("python")
父级定位(找到一个比较明显的标签,然后一级一级往下找)driver.find_element_by_xpath('//*[@id="form"]/span/input').send_keys("python")
css定位driver.find_element_by_css_selector("#kw").send_keys("1python")
driver.find_element_by_css_selector(".s_ipt").send_keys("2python")
driver.find_element_by_css_selector("").send_keys("3python")
driver.find_element_by_css_selector("").send_keys("4python")
driver.find_element_by_css_selector("").send_keys("5python") //组合定位
driver.find_element_by_css_selector("form>span>input").send_keys("6python")
selenium实现UI自动化元素定位优先顺序
1.使用id定位
2.使用name或class定位
3.使用xpath、css定位
4.如果是链接,可以使用link_text和partial_link_text定位
5.tag_name和JavaScript(比较少用)
获取上传文件的html文件driver.get("file:///D:upload_file.html")
选择默认上传的文件driver.find_element_by_id("file").send_keys(r"D:\xxx.txt")
页面自动化操作
鼠标点击id为s-usersetting-top的元素driver.find_element_by_id("s-usersetting-top").click()
等待三秒,给网页刷新提供缓冲时间time.sleep(3)
鼠标点击“搜索设置”driver.find_element_by_link_text("搜索设置").click()
给网页提供刷新时间time.sleep(3)
点击“保存设置”driver.find_element_by_link_text("保存设置").click()
调用函数fromselenium.webdriver.common.action_chains import ActionChains
根据Xpath‘//*[@id="s-top-left"]/div/a'创建对象s=driver.find_element_by_xpath('//*[@id="s-top-left"]/div/a')
将鼠标悬停在对象s的位置ActionChains(driver).move_to_element(s).perform()
selenium中的等待
1.线程等待,机械等待for time import sleep
…
sleep(2) //固定将进程延时两秒
driver.implicitly_wait(20) #隐式等待,在规定时间内等待页面全部加载完成,加载完成后不需继续等待,可直接进行下一步
#显式等待,在规定时间内等到某个元素加载完成,就进行下一步
...
2.隐式等待driver.implicitly_wait(20) //规定时间内等待页面元素全部加载完成,什么时候加载完,什么时候进行下一步
3.显式等待在规定时间内等到某个元素加载完成。就进行下一步
from selenium.webdriver.common.by import By
from selenium.webdriver.support importexpected_conditions asEC
fromselenium.webdriver.support.uiimportWebDriverWait
WebDriverWait(driver,20,poll_frequency=0.5).until(EC.presence_of_element_located((By.ID,"kw")))
获取网页的title名称title=driver.title
print(title)
断言判断运行的结果和你预期的结果是否一致
获取元素的文本信息a=driver.find_element_by_xpath('//*[@id="s-top-left"]/a').text
第一种断言ifa=="新闻":
print("获取成功!")
else:
print("获取失败!")
第二种断言asserta=="新闻"
切换窗口
导入webdriver模块from selenium import webdriver
创建浏览器对象driver=webdriver.Chrome()
调用get方法访问百度driver.get("http://www.baidu.com")
最大化窗口driver.maximize_window()
新开一个窗口win="window.open('http://www.jd.com')" //js 脚本,新开一个窗口
执行新开一个窗口的命令driver.execute_script(win)
获取当前页面的titletitle=driver.title
print(title)
获取当前页面的句柄handle=driver.current_window_handle
print(handle)
切换窗口方式1all_handle=driver.window_handles # 获取当前页面所有的窗口句柄
driver.switch_to.window(all_handle[-1]) #将句柄切换到 所有句柄的最后一个句柄
print(driver.title)
切换窗口方式2all_handle=driver.window_handles
for i in all_handle:
if i !=handle: #如果当前窗口不等于 百度一下的句柄。 意味着i就是京东
driver.switch_to.window(i) #切换到i的句柄,就是切换到京东的句柄
print(driver.title) #打印当前的title,会得到京东页面的title
刷新当前窗口driver.refresh()
返回上一步driver.back()
关闭当前窗口driver.close()
关闭所有窗口driver.quit()
选择框取值
导入webdriver模块fromseleniumimport webdriver
导入sleep模块from timeimport sleep
导入类Selectfrom selenium.webdriver.support.select import Select
创建浏览器对象driver=webdriver.Chrome()
调用get方法访问网页driver.get("https://www.ctrip.com/")
最大化窗口driver.maximize_window()
创建选择框对象s=driver.find_element_by_xpath('//*[@id="J_roomCountList"]')
取值方式1:索引取值Select(s).select_by_index(3) //选择索引位为3的选项
取值方式2:value取值Select(s).select_by_value("5")
取值方式3:文本信息取值Select(s).select_by_visible_text("6间")
iframe框的操作:
导入webdriver模块from selenium import webdriver
创建浏览器对象driver=webdriver.Chrome()
调用get方法访问网页driver.get("https://mail.163.com/")
方式一:通过元素定位切换iframe框iframe=driver.find_element_by_xpath('//*[@id="loginDiv"]/iframe')
driver.switch_to.frame(iframe)
方式二:用索引位切换driver.switch_to.frame(0)
方式三(有多个ifram框时不能使用此方法)s=driver.find_elements_by_tag_name("iframe")
driver.find_element_by_name("email").send_keys("18617162994")
driver.find_element_by_name("password").send_keys("qweqwe123")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content() #退出ifram框
页面滚动条操作from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("http://www.jd.com")
driver.maximize_window()
time.sleep(2)
定义一个js脚本js="window.scrollTo(0,20000)"
执行js脚本driver.execute_script(js) #用driver调用execute_script方法执行js脚本
滑动滚动条for i inrange(0,20000,50):
js="window.scrollTo(0,%s)"%i
driver.execute_script(js)
time.sleep(0.1)
回到页首js1="window.scrollTo(0,0)"
driver.execute_script(js1)
Keys类的使用进行键盘操作
调用Keysfrom selenium.webdriver.common.keys import Keys
调用wbedriver模块fromselenium import webdriver
调用sleep模块from time import sleep
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("pythonn")
使用删除键driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
使用ctrl+adriver.find_element_by_id("kw").send_keys(Keys.CONTROL,"a")
使用ctrl+xdriver.find_element_by_id("kw").send_keys(Keys.CONTROL,"x")
使用ctrl+vdriver.find_element_by_id("kw").send_keys(Keys.CONTROL,"v")
使用回车键driver.find_element_by_id("kw").send_keys(Keys.ENTER)
driver.close()
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,Keys.ALT,"a")
alter弹框from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
多次确认的弹框driver.get("file:///D:/alert.html")
alter=driver.switch_to.alert
alter.dismiss()
alter.accept()
确认型弹框driver.get("file:///D:/enter.html")
sleep(1)
driver.find_element_by_class_name("alert").click()
sleep(1)
driver.switch_to.alert.accept()
输入型弹框driver.get("file:///D:/prompt.html")
driver.find_element_by_class_name("alert").click()
driver.switch_to.alert.send_keys("http://www.baidu.com")
driver.switch_to.alert.accept()
print(driver.switch_to.alert.text)
unittest单元测试框架需要执行的用例类继承unittest框架
导入unittest模块import unittest
unittest单元测试框架classCms(unittest.TestCase): #创建一个Cms类,继承于Testcase
@classmethod
defsetUpClass(cls) -> None: #类的开始:会在所有的方法之前运行,并且只运行一次
print("我是一个类的开始")
@classmethod
deftearDownClass(cls) -> None: #类的结束:会在所有的方法之后运行,并且只运行一次
print("我是一个类的结束")
defsetUp(self) -> None: # 运行每一条以test开头的方法,就会先运行一次setUp这个方法
print("我是一个方法的开始!")
deftearDown(self) -> None: #每运行结束一条以test开头的方法,就会先运行一次teardown这个方法
print("我是一个方法的结束!")
deftest_3(self): # 框执行顺序根据asc码的值进行排列执行 0~9 A~Za~z
print("我是第三条用例")
deftest_001(self):
print("我是第一条用例")
defcmstest_002(self): #unittest框架内,只会执行以test开头的用例
print("我是第二条用例")
执行unittest测试if __name__ == '__main__': #主函数,函数的入口
unittest.main() # 会执行框架内的所有以test开头的用例
unittest测试运行方式
第一种unittest.main() #执行框架内所有的用例
第二种:suit套件runner=unittest.TextTestRunner() #创建一个runner对象
runner.run(run_case()) #用runner对象调用run方法来执行
第三种from UI_autoimport HTMLTestRunner3_New #创建一个按照指定路径指定规则去查询py文件的对象
discover=unittest.defaultTestLoader.discover(start_dir=start_dir,pattern="lesson*.py") #pattern 规则
filename=r"C:\Users\liujian\PycharmProjects\dcs\UI_auto"+'\\cms_UIauto.html'
f=open(filename,"wb") #wb使用二进制的形式写入并且覆盖
runner=HTMLTestRunner3_New.HTMLTestRunner(stream=f, #stream叫做数据流
title="cmsui自动化测试",
description="用例执行情况如下:",
tester="小明")
runner.run(discover)
ui自动化框架设计:python +selenium 结合unittest框架来编写我们的自动化脚本。
为了方便后期管理,我们一般会将框架设计为6层封装。
1.config==》配置项目的各个路径
2.data==》存放数据
3.case ==》装测试用例
4.public ==》装公共的方法和基类
pages//页面元素的操作
utils//装公共的工具
5.run_case==》执行用例,介绍unittest:1.特性;2.运行的方式
6.report ==》用来存放报告
config.py用来装配置文件,或者配置项目的路径
import os
base_path=os.path.dirname(os.path.dirname(__file__)) #当前文件的上两级,就是项目路径
case_path=os.path.join(base_path,"case") #定义case的路径
data_path=os.path.join(base_path,"data") #定义data的路径
public_path=os.path.join(base_path,"public") #定义public的路径
pages_path=os.path.join(base_path,"public","pages") #定义public下的pages的路径
utils_path=os.path.join(base_path,"public","utils") #定义public下utils的路径
report_path=os.path.join(base_path,"report") #定义report的路径
run_case_path=os.path.join(base_path,"run_case") #定义run_case的路径
data.ini用来存放数据
url=http://cms.duoceshi.cn/cms/manage/login.do
username=admin
userpassword=123456
test_login01.py测试用例,放在case包中
导入需要用到的函数frompublic.pages.basepage importBasepage
from seleniumimport webdriver
from time importsleep
frompublic.utils.read_ini importRead_Ini
from config.config import *
import os
import unittest
取出data.ini的绝对路径file=os.path.join(data_path,"data.ini")
创建数据流对象read=Read_Ini(file) //数据流,表示打开file文件这个过程
取值:取出网址和账号密码url=read.read_ini_value("test_data","url") //调用read数据流打开file文件,然后取出test_data标签中url的值并赋值给url
userName=read.read_ini_value("test_data","username") //取出test_data标签中username的值
userpwd=read.read_ini_value("test_data","userpassword")//取出test_data标签中userpassword的值
classLogin_test(Basepage):
@classmethod
defsetUpClass(cls) -> None:
driver=webdriver.Chrome() #webdriver.Chrome() 赋值给driver
Basepage.set_driver(driver) #将driver 传到Basepage的类属性中去
@classmethod
deftearDownClass(cls) -> None:
sleep(3)
def test_login(self):
driver=Basepage.get_driver() #拿到Basepage中的driver对象
driver.get(url) #用返回的diver打开一个地址
输入账号 elem=Basepage.find_element(login_name) #定位元素
Basepage.sendkeys(elem,userName)
输入密码 elem1=Basepage.find_element(login_pwd) #定位元素
Basepage.sendkeys(elem1,userpwd)
点击登录 elem2=Basepage.find_element(login_buton) #定位元素
Basepage.click(elem2)
basepage.py放在public下的pages中,用来装基础的定义和页面元素的操作
import unittest
classBasepage(unittest.TestCase):
@classmethod
defset_driver(cls,driver):#设置一个driver
cls.driver=driver
# return cls.driver
@classmethod
defget_driver(cls): #定义一个函数,获取driver
returncls.driver
#element=("id","kw")
@classmethod
deffind_element(cls,element):
type=element
value=element
iftype=="id":
elem= cls.driver.find_element_by_id(value)
eliftype=="name":
elem= cls.driver.find_element_by_name(value)
eliftype=="class":
elem= cls.driver.find_element_by_class_name(value)
eliftype=="xpath":
elem= cls.driver.find_element_by_xpath(value)
eliftype=="linktext":
elem= cls.driver.find_element_by_link_text(value)
eliftype=="css":
elem= cls.driver.find_element_by_css_selector(value)
eliftype=="tag":
elem= cls.driver.find_elements_by_tag_name()
else:
raiseValueError("pleaseinput correctparameter")
return elem
@classmethod
defsendkeys(cls,elem,text):
return elem.send_keys(text)
@classmethod
def click(cls,elem):
returnelem.click()
@classmethod
defmax(cls):
returncls.driver.maximize_window()
read_ini.py放在public下的utils中,用来读取ini文件(pipinstall configparser下载安装)(python-m pip install configparser升级)
classRead_Ini(ConfigParser): #ConfigParser专门用来读取ini文件,通过继承ConfigParser 这个类获得读取ini文件的方法
def__init__(self,file):
super(Read_Ini,self).__init__()#super,继承父类的构造函数
self.read(file) #读取ini文件
defread_ini_value(self,section,option):
returnself.get(section,option) #get方法是根据文件中的section里面的option取出对应的值
if __name__ == '__main__':
file=os.path.join(data_path,"data.ini") #获取data.ini 的路径
read=Read_Ini(file) # 创建一个对象,对象此时是已经读取了文件的对象
url=read.read_ini_value("test_data","url")#用此对象 ,调用
print(url)
run_case.py放在run_case包中,用来执行用例
导入模块、方法import unittest
from config.config import case_path,report_path
from report.HTMLTestRunner3_New import HTMLTestRunner
import os
import time
strat_dir=case_path
discover=unittest.defaultTestLoader.discover(strat_dir,pattern="test*.py")
now=str(time.strftime("%Y-%m-%d-%H-%M-%S"))
file=now+"_UI自动化测试报告.html"
filename=os.path.join(report_path,file)
f=open(filename,"wb")
runner=HTMLTestRunner(stream=f,
title="cmsUI自动化测试报告",
description="用例情况执行如下:",
tester="小明")
runner.run(discover)
页:
[1]