2022-03-06

十八单元 自动化持续继承

1.概念

1.持续集成:持续的将分支集成到主干

2.持续交付:持续将此版本提交给质量团队

3.持续部署:持续将代码部署到生产环境

2.Jenkins介绍

1.概念:Jenkins 是一个开源软件项目,是基于Java开发的一种可拓展持续集成工具,主要用于持 续、自动 地构建 / 测试 / 集成软件项目以及监控一些定时执行的任务

2.部署:配置java环境→安装Tomcat→jenkins.war放在webapps下→启动Tomcat→访问:

(127.0.0.1)localhost:8080/jenkins

3.使用:创建条目 自动构建

3.搭建Jmeter+Jenkins+Ant持续化

第十九单元 web端自动化

1.什么是自动化

使用测试工具 或者其他手段对软件进行测试

2.自动化测试好处

1.缩短测试周期  2.避免人为出错  3.测试信息存储  4.轻易获取覆盖率  5.实现自动或者定时执行

3.使用自动化的前提条件

1)手动测试已经完成,后期再不影响进度的前提下逐渐实现自动化

2)项目周期长,重复性的工作都交给机器去实现

3)需求稳定,项目变动不大

4)自动化测试脚本复杂度比较低

5)可重复利用

4.使用自动化测试的场景

1)频繁的回归测试

2)冒烟测试

3)传统行业需求变化不大,应用频繁

4)性能测试

5.常用工具

QTP、Selenium、RFT

6.为什么要学习元素定位

1)计算机没有智能到人的程度。

2)计算机不能像手动测试人员一样通过眼看,手操作鼠标点击,操作键盘输入。

3)计算机通过一系列计数手段找到元素(按钮、输入框、模拟键盘等)

7.元素定位的工具或手段有哪些

css选择器、xpath

8.环境搭建

1. 下载浏览器插件

2. 菜单 → 添加附件 → 设置图标 → 从文件中添加附件

9.什么是xpath

XPath即为XML路径语言,它是一种用来(标准通用标记语言的子集)在 HTML\XML 文档中查找信息的语言

10.什么是xml

XML 指可扩展标记语言(EXtensible Markup Language)

XML 是一种标记语言,很类似 HTML

XML 的设计宗旨是传输数据,而非显示数据

11.xml和html 的区别

html是用来显示数据、xml是用来传输和存储数据

12.获取元素

①/:从根节点选取  #/html/head/meta[1]第一个;[last()]最后一个元素;[last()-1]倒数第二个元素;                    [position()<3] 前两个元素

②//:从匹配选择的当前节点选择文档中的节点 #//link

③.选取当前节点

④..选取当前节点的父节点

⑤@:选取属性 #//meta[@name] 或者//meta[@name="referrer"]

⑥//meta[@*]:所有带有属性的meta元素

⑦//head/meta | //head/title:选取head元素的所有meta元素和title元素

⑧//meta | //title:选取文档中的所有title和meta元素

13.css选择器

13.1什么是css选择器

CSS 中,选择器是一种模式,用于选择需要添加样式的元素

13.2css选择器语法

①.info: 选择class=“info”的所有元素

②#name: 选择id=“name”的所有元素

③* :选择所有的元素

④元素1,元素2: 选择元素1和元素2的所有元素

⑤元素1 元素2: 选择元素1内部的所有元素2的元素

⑥元素1>元素2: 选择父元素为元素1的元素的所有元素2的元素

⑦[target]: 选择带有target属性的所有元素

⑧[target=blank]: 选择target="blank"的所有元素

Web自动化测试进阶

什么是框架框架(framework)是一个框子 -- 指其约束性,也是一个架子 -- 指其支撑性,是一个基本概念上的结构,用于去解决或者处理复杂的问题。

为什么使用框架1)自己从头实现太复杂

  2)使用框架能够更专注于业务逻辑,加快开发速度

  3)框架的使用能够处理更多细节问题

  4)使用人数多,稳定性,扩展性好

selenium工作原理

  4.selenium对浏览器操作

1)库的导入

from selenium import webdriver

2)创建浏览器对象

必须为大写

driver = webdriver.Firefox()

driver = webdriver.Chrome()

3)浏览器尺寸相关操作

maximize_window() 最大化

get_window_size()    获取浏览器尺寸,打印查看

set_window_size()    设置浏览器尺寸,400*400

4)浏览器位置相关操作

get_window_position() 获取浏览器位置

set_window_position(x,y)    设置浏览器位置

5)浏览器的关闭操作

close()关闭当前标签/窗口

quit()关闭所有标签/窗口

6)页面请求操作

driver.get(url)请求某个url对应的响应

refresh()刷新页面操作

back()回退到之前的页面

forward()前进到之后的页面

fromselenium import webdriver

import time

driver = webdriver.Chrome()#不可以找到,必须导入对应的驱动器

driver=webdriver.Firefox()

url1="http://www.baidu.com"

url2="https://zhuanlan.zhihu.com/"

请求第一个接口

driver.get(url1)

time.sleep(3)

刷新

driver.refresh()

driver.get(url2)

回退

driver.back()time.sleep(3)

前进driver.forward()

time.sleep(3)

driver.close()

5.selenium获取断言信息1)什么是断言

断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。

2)获取断言信息的操作

current_url 获取当前访问页面url

title 获取当前浏览器标题

page_source 获取网页源码

print(driver.current_url)

print(driver.title)

print(driver.page_source)

截图:

get_screenshot_as_png() 保存图片

data=driver.get_screenshot_as_png()

withopen("a.png","wb")asf:

f.write(data)

get_screenshot_as_file(file) 直接保存

driver.get_screenshot_as_file("b.png")

6.selenium八大元素定位from selenium import webdriver

driver=webdriver.Firefox()

url = "http://www.baidu.com"

driver.get(url)

第一种 id

ele = driver.find_element_by_id("kw")

ele.send_keys(12306) # 输入数据

from selenium.webdriver.common.by import By

ele = driver.find_element(By.ID,"kw")# ele.send_keys(12306) # 输入数据

第二种  标签名字

ele = driver.find_element_by_name("wd")

ele.send_keys(12306) # 输入数据

第三种  class

ele = driver.find_element_by_class_name("s_ipt")

ele.send_keys(12306) # 输入数据

第四种  Xpath

ele = driver.find_element_by_xpath("//*[@id='kw']")

ele.send_keys(12306) # 输入数据

第五种  css class

ele = driver.find_element_by_css_selector("#kw")

ele.send_keys(12306) # 输入数据

第六种  text

ele = driver.find_element_by_link_text("地图")

ele.click() # 输入数据

第七种:类似于模糊匹配

ele = driver.find_element_by_partial_link_text("地")

ele.click()

第八种:标签名定位,必须得保证只有一个这种名字的标签,使用下面这个搜索

url = "http://cn.bing.com/"

driver.get(url)# ele = driver.find_element_by_tag_name("input")

ele.send_keys(12306) # 输入数据

7.元素的操作对元素的相关操作,一般要先获取到元素,再调用相关方法

element = driver.find_element_by_xxx(value)

1)点击和输入

点击操作---------->element.click()

清空/输入操作:

element.clear()---------------------->清空输入框

element.send_keys(data)-------->输入数据

2)提交操作

element.submit()

8.多标签之间的切换场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。

1)获取所有窗口的句柄

handles = driver.window_handlers

调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的值存放在里面。

2)通过窗口的句柄进入的窗口

driver.switch_to_window(handles[n])

driver.switch_to.window(handles[n])

通过窗口句柄激活进入某一窗口

案例:

58同城租房信息:http://bj.58.com

使用句柄driver.get("http://bj.58.com")

print("点击之前句柄:",driver.window_handles)

ele=driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")ele.click()

list_windowns=driver.window_handles

print("点击之后句柄:",driver.window_handles)

driver.switch_to.window(list_windowns[1])

eleDaxing=driver.find_element_by_link_text("大兴")

eleDaxing.click()

9.多表单

    el = driver.find_element_by_xxx(value)

    driver.switch_to.frame(el)/driver.switch_to_frame(el)

案例:

fromseleniumimportwebdriver

#打开游览器

driver=webdriver.Firefox()

#登录QQ

url="https://qzone.qq.com/"

driver.get(url)

#获取元素

#定位表单元素

ele_bd=driver.find_element_by_id("login_frame")

driver.switch_to.frame(ele_bd)

ele=driver.find_element_by_xpath(".//*[@id='switcher_plogin']")

ele.click()

#输入账号

ele2=driver.find_element_by_id("u")

ele2.send_keys()

#输入密码

ele3=driver.find_element_by_id("p")

ele3.send_keys("")

ele4=driver.find_element_by_id("login_button")

ele4.click()

弹出框操作

# 进入到弹出框中

driver.switch_to.alert

#接收警告

accept()

#解散警告

dismiss()

#发送文本到警告框

send_keys(data)

用法:driver.switch_to.alert.accept()

下拉框

案例:

fromseleniumimportwebdriver

importtime

driver=webdriver.Firefox()

driver.get("http://www.baidu.com")

ele=driver.find_element_by_id("s-usersetting-top")

ele.click()

ele1=driver.find_element_by_xpath(".//*[@id='s-user-setting-menu']/div/a[2]")

ele1.click()

time.sleep(2)

ele2=driver.find_element_by_xpath(".//*[@id='yadv-setting-gpc']/div/div[1]/i[1]")

ele2.click()

list_ele=driver.find_elements_by_class_name("c-select-item")

print(list_ele)

list_ele[2].click()

# for list_i in list_ele:

#     print(list_i.text)

#     if list_i.text =="最近一周":

#         list_i.click()

鼠标和键盘操作

鼠标

1.先导入动作链类:

fromselenium.webdriverimportActionChains

ActionChains(driver)

2.常用鼠标动作:

ActionChains(driver).context_click(ele).perform()点击鼠标右键

ActionChains(driver).double_click(ele).perform()点击鼠标左键

ActionChains(driver).move_to_element(el).perform()鼠标悬停

3.perform()对前面的方法执行

#案例:

fromselenium.webdriverimportActionChains

fromseleniumimportwebdriver

importtime

driver=webdriver.Firefox()

driver.get("http://www.baidu.com")

ele=driver.find_element_by_xpath(".//*[@id='s-top-left']/div/a")

# ele.click()

ActionChains(driver).double_click(ele).perform()

键盘

1.导入

fromselenium.webdriver.common.keysimportKeys

2.常用键盘操作

send_keys(Keys.BACK_SPACE)    删除键(BackSpace)

send_keys(Keys.SPACE)         空格键(Space)

send_keys(Keys.TAB)           制表键(Tab)

send_keys(Keys.ESCAPE)        回退键(Esc)

send_keys(Keys.ENTER)         回车键(Enter)

send_keys(Keys.CONTROL,‘a’)   全选(Ctrl+A)

send_keys(Keys.CONTROL,‘a’)   全选(Ctrl+A)

send_keys(Keys.CONTROL,‘x’)   剪切(Ctrl+X)

send_keys(Keys.CONTROL,‘v’)   粘贴(Ctrl+V)

send_keys(Keys.F1)            键盘F1

send_keys(Keys.F12)           键盘F12

浏览器等待

1.为什么要进行等待

1.网速慢 2.网站内容过多 3.如果不进行等待而直接定位元素,可能会抛出异常

2.selenium中等待的分类

1.固定等待

2.显示等待

WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(

(By.CLASS_NAME,"g-hu")))

3.隐式等待 

driver.implicitly_wait(n)

PO模型

1.介绍

在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与 面向对象的特征相同),通常PO模型可以大大提高测试用例的维护效率

优点:重用,业务和对象分离,代码结构清晰,方便代码维护

2.核心要素

1.在PO模式中抽离封装集成一个BasePage类,该基类应该拥有一个只实现 webdriver实例的属性

2.每一个page都继承BasePage,通过driver来管理本page中元素,将page中 的操作封装成一个个方法

3.TestCase继承unittest.Testcase类,并依赖page类,从而实现相应的测试步 骤

3.实现BasePage

fromseleniumimportwebdriver

fromselenium.webdriver.common.action_chainsimportActionChains#鼠标操作

classBasePage():

'''BasePage封装所有界面都公用的方法。例如driver,find_element等'''

'''实例化BasePage类时,事先执行的__init__方法,该方法需要传递参数'''

def__init__(self,driver,url):

self.driver=driver

self.base_url=url

# 进入网址

defget(self):

self.driver.get(self.base_url)

#元素定位,替代八大定位

defget_element(self,*locator):

returnself.driver.find_element(*locator)

#点击

defleft_click(self,*locator):

ActionChains(self.driver).click(self.get_element(*locator)).perform()

#输入

defsend_text(self,text,*locator):

self.driver.find_element(*locator).send_keys(text)

#清除

defclear_text(self,*locator):

self.driver.find_element(*locator).clear()

实现SearchPage

'''

实现步骤:(1)继承basepage,(2)元素传参,(3)调取方法

'''

fromselenium.webdriver.common.byimportBy

frompomodel.Base.base_pageimportBasePage

classSearch(BasePage):

def__init__(self,driver,url):

BasePage.__init__(self,driver,url)

#进入百度

defopen_baidu(self):

self.get()

#输入搜索内容

definput_search_content(self,text):

self.send_text(text,By.ID,"kw")

#点击按钮

defclick_baidu_search(self):

self.left_click(By.ID,"su")

实现TestCase

importunittest

fromseleniumimportwebdriver

frompomodel.Pages.search_pagesimportSearch

classBaiBu(unittest.TestCase):

defsetUp(self)->None:

self.driver=webdriver.Firefox()

self.driver.implicitly_wait(10)

deftest_serach(self):

url="http://www.baidu.com"

s=Search(self.driver,url)

s.open_baidu()

s.input_search_content("jack")

s.click_baidu_search()

deftearDown(self)->None:

self.driver.quit()

if__name__=='__main__':

unittest.main()

4.总结

PO设计模式中的BasePage基类对应案例中的BasePage.py文件 PO模式中的pages中的案例显示Search.py PO模式设计中TestCase对应案例中的TestCase.py

5.po模式的优点

1.PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰

2.页面对象与用例分离,使得我们更好的复用对象

3.可复用的页面方法代码会变得更加优化

4.更加有效的命令方式使得我们更加清晰的知道方法所操作的UI元素

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • 一、什么是框架 1.框架 框架(framework)是一个框子 -- 指其约束性,也是一个架子 -- 指其支撑性,...
    艺术家123阅读 188评论 0 0
  • 一、概念 互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous in...
    __65a0阅读 802评论 0 4
  • 一、Python介绍 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python...
    成啦过客的青春阅读 447评论 0 0
  • 多标签之间的切换 场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算...
    老友_9e40阅读 295评论 0 0
  • 自动化 一、概念 互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuou...
    G_eebd阅读 329评论 0 0