成都9班-肖竹 发表于 2021-11-29 21:49:26

自动化测试


   线性脚本
导入数据库连接库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]
查看完整版本: 自动化测试