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元素

你可能感兴趣的:(2022-03-06)