文章目录
- 自动化测试学习笔记
自动化测试学习笔记
1、元素查找(实训1-9)
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://10.1.30.75/pams/front/login.do')
driver.implicitly_wait(10)
driver.find_element_by_id('loginName').send_keys('id')
# id定位
driver.find_element_by_name('loginName').send_keys('name')
# name定位
driver.find_element_by_xpath('//*[@id="loginName"]').send_keys('xpath')
# xpath定位
driver.find_element_by_css_selector('#loginName').send_keys('css')
# css选择器定位
driver.find_elements_by_class_name('form-control')[1].send_keys('class_name')
# 复数元素定位
driver.find_element_by_tag_name('button').click()
# 标签名定位
time.sleep(2)
driver.quit()
2、鼠标操作(实训10)
1.导入包
from selenium.webdriver import ActionChains
from selenium import webdriver
import time
2.基本用法
当调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,按照队列里面的顺序进行执行。其中调用的perform()方法必须放在ActionChains方法最后。
3.方法列表
-
click(on_element=None) ——单击鼠标左键
-
click_and_hold(on_element=None) ——点击鼠标左键,不松开
-
context_click(on_element=None) ——点击鼠标右键
-
double_click(on_element=None) ——双击鼠标左键
-
drag_and_drop(source, target) ——拖拽到某个元素然后松开
-
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某 个坐标然后松开
-
key_down(value, element=None) ——按下某个键盘上的键
-
key_up(value, element=None) ——松开某个键
-
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
-
move_to_element(to_element) ——鼠标移动到某个元素
-
move_to_element_with_offset(to_element, xoffset, yoffset) — —移动到距某个元素(左上角坐标)多少距离的位置
-
perform() ——执行链中的所有动作
-
release(on_element=None) ——在某个元素位置松开鼠标左键
-
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
-
send_keys_to_element(element, *keys_to_send) ——发送某个键到 指定元素
4.调用方法
driver = webdriver.Chrome()
driver.get('http://10.1.30.75/pams/front/login.do')
driver.implicitly_wait('10')
a = driver.find_element_by_id('loginName')
b = driver.find_element_by_id('password')
a.send_keys('student')
b.send_keys('student')
a.分布写法
'''分布写法'''
action = ActionChains(driver)
action.double_click(a).perform()
time.sleep(1)
action.context_click(a).perform()
time.sleep(1)
action.double_click(b).perform()
b.链式写法
'''链式写法'''
ActionChains(driver).double_click(a).context_click(a).double_click(b).perform()
5.注意
- Selenium的Action有不支持HTML5的拖拽的问题
3、键盘操作(实训11)
1.导入包
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time
2.基本用法
-
先使用ActionChains类将鼠标移动到需要进行键盘操作的位置,然后进行键盘操作。
-
先通过元素定位方式进行元素定位,然后通过send_keys()进行键盘操作。
3.方法列表
回车键 Keys.ENTER
删除键 Keys.BACK_SPACE
空格键 Keys.SPACE
TAB键 Keys.TAB
回退键 Keys.ESCAPE
刷新键 Keys.F5
Shift键 Keys.SHIFT
ECS键 Keys.ESCAPE
上键 Keys.ARROW_UP
下键 Keys.ARROW_DOWN
左键 Keys.ARROW_LEFT
右键 Keys.ARROW_RIGHT
'='键 EQUALS
全选(Ctrl+A) Keys.CONTROL,'a'
复制(Ctrl+C) Keys.CONTROL,'c'
剪切(Ctrl+X) Keys.CONTROL,'x'
粘贴(Ctrl+V) Keys.CONTROL,'v'
4.调用方法
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://10.1.30.6/pams/front/login.do')
driver.implicitly_wait(10)
driver.find_element_by_id('loginName').send_keys('student')
driver.find_element_by_id('password').send_keys('student')
driver.find_element_by_tag_name('button').click()
# 登陆成功
driver.find_element_by_link_text('供应商').click()
driver.find_element_by_name('title').send_keys('信息')
time.sleep(1)
driver.find_element_by_name('title').send_keys(Keys.CONTROL,'a')
driver.find_element_by_name('title').send_keys(Keys.CONTROL,'c')
driver.find_element_by_name('title').send_keys(Keys.CONTROL,'v')
driver.find_element_by_name('title').send_keys(Keys.CONTROL,'v')
time.sleep(2)
driver.quit()
4、时间等待(实训12)
1.显式等待WebDriverWaits()
显式等待指等待页面加载完成,找到某个条件发生后再继续执行后续代码,如果超过设置时间检测不到则抛出异常。
使用WebDriverWait首先需要导入此模块。代码如下:
from selenium.webdriver.support.ui import WebDriverWait
使用格式:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver:WebDriver的驱动程序(Ie、Firefox、Chrome)。
timeout:最长超时时间,默认以秒为单位。
poll_frequency:休眠时间的间隔(步长)时间,默认为 0.5 秒。
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException 异常。
例如:
element=WebDriverWait(driver,10).until(lambda x: x.find_element_by_id(“someId”))
is_disappeared=WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“someId”).is_displayed())
注意:until是固定格式,可以理解为直到元素定位到为止,lambda x:x是一个匿名函数构建的方法,这里不太好理解,可以理解为固定格式,最后接定位方法。
说明:
WebDriverWai()一般由 unit()或 until_not()方法配合使用。
until(method, message=’’)调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。
until_not(method, message=’’)调用该方法提供的驱动程序作为一个参数,直到返回值为 False。
2.强制等待time.sleep()
设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,不管它什么情况,让程序暂停运行一定时间,时间过后继续运行。缺点是不智能,设置的时间太短,元素还没有加载出来,那照样会报错。设置的时间太长,则会浪费时间,不要小瞧每次几秒的时间,case多了,代码量大了,很多个几秒就会影响整体的运行速度了,所以尽量少用这个。
3.隐性等待 implicitly_wait()
隐性的等待就是我们设置了一个等待时间范围,这个等待的时间是不固定的,最长的等待也莫过于我们设置的最大值。
隐性等待,也叫智能等待,是selenium提供的一个超时等待。等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。
5、窗口切换(实训13)
1.主要方法
(1)获取第一个窗口的名字
print(driver.current_window_handle)
(2)获取所有窗口的名字
print(driver.window_handles)
(3)获取到第二个窗口的名字
print(driver.window_handles[1])
(4)※ 进行窗口切换
driver.swtich_to.window(driver.window_handles[1])
(5)关闭浏览器当前窗口
driver.close()
2.基本用法
from selenium import webdriver
import time
d = webdriver.Chrome()
d.get('http://10.1.30.75/ams/front/login.do')
d.implicitly_wait(10)
d.find_element_by_id('taskId').send_keys('2')
# 输入ID
print('第一个窗口名字:',d.current_window_handle)
d.find_element_by_class_name('font-blue.right').click()
print('第二个窗口名字:',d.current_window_handle)
# # 此时窗口名字还是第一个窗口,故需要切换
d.switch_to_window(d.window_handles[1])
# switch_to_window方法已过期,使用switch_to.window方法来代替
print('所有窗口名字',d.window_handles)
# 所有窗口名字
print('第二个窗口名字:',d.current_window_handle)
# 成功切换
d.close()
# 关闭当前窗口
# d.find_element_by_id('taskId').send_keys('2')
# 报错 因为上个窗口即使已被关闭,也要将窗口切换至当前窗口,才能操作当前窗口的元素
d.switch_to.window(d.window_handles[0])
# 切换至当前窗口
print('当前窗口:',d.current_window_handle)
d.find_element_by_id('taskId').send_keys('2')
# 操作成功
time.sleep(2)
d.quit()
# 关闭浏览器
3.注意
- 上个窗口即使已被关闭,也要将窗口切换至当前窗口,才能操作当前窗口的元素
- switch_to_window方法已过期,使用switch_to.window方法来代替
6、页面属性删除(14)
1.主要步骤
(1)用Selenium定位“目标”链接。
login_link=driver.find_element_by_XX(“目标”)
(2)删除已找到的页面元素的target属性。
driver.execute_script(“arguments[0].removeAttribute(‘target’)”,login_link)其中arguments[0]的意思就是去字符串后面的第一个参数login_link的真正的值。
(3)点击删除target属性后的这个页面元素。
login_link.click()
2.基本用法
from selenium import webdriver
import time
d = webdriver.Chrome()
d.get('http://www.baidu.com')
d.implicitly_wait(10)
b = d.find_elements_by_class_name('mnav.c-font-normal.c-color-t')[0]
# 定位元素
# b.click() # 弹出新窗口
d.execute_script("arguments[0].removeAttribute('target')",b)
b.click()
# 不弹出新窗口,覆盖旧窗口
time.sleep(2)
d.quit()
# 关闭浏览器
7、submit(15)
在html中,关于form表单的部分,其中按钮类型就有button与submit,简单的来理解,button就是一个单纯的点击,submit就不是单纯的单击,它会涉及到前后台的交互,在Selenium自动化测试中,点击使用的方法就是click(),同时有另外一个方法为submit(),click()方法就是单纯的点击下,但是submit()方法一般使用在有form标签的表单中
8、下拉滚动条(16)
主要方法
ActionChains(d).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).perform()
# 1.通过ActionChains,Keys方法连续按方向箭头
d.execute_script("window.scrollTo(0,3000)")
# 2.用javascript知识中的语句实现滚动条移动,代码中的(0,0)代表页面横向和纵向的坐标。
9、下拉框处理(17)
1.主要方法
(1)使用Select模块的方法
(2)使用选项元素标签定位。
(3)直接通过x path层级标签定位。
2.主要步骤
基本流程
from selenium.webdriver.support.select import Select
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://10.1.30.75/pams/front/login.do')
driver.implicitly_wait(10)
driver.find_element_by_id('loginName').send_keys('student')
driver.find_element_by_id('password').send_keys('student')
driver.find_element_by_tag_name('button').click()
driver.find_element_by_link_text('供应商').click()
方法一:使用Select模块的方法
(需导包:from selenium.webdriver.support.select import Select)
select = driver.find_element_by_name('providerTypeId')
# 定位下拉框
Select(select).select_by_visible_text('其他')
方法二:使用选项元素标签定位
driver.find_elements_by_tag_name('option')[7].click()
方法三:直接通过xpath层级标签定位
driver.find_element_by_xpath('//*[@id="fmsearch"]/div/div[2]/select/option[5]').click()
10、文件上传处理(18)
1.主要步骤
只要定位上传按钮,找到input标签属性,通过send_keys添加本地文件路径就可以了。
2.基本用法
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://10.1.30.75/pams/front/login.do')
driver.implicitly_wait(10)
driver.find_element_by_id('loginName').send_keys('student')
driver.find_element_by_id('password').send_keys('student')
driver.find_element_by_tag_name('button').click()
driver.find_element_by_link_text('资产入库').click()
driver.find_element_by_xpath('//*[@id="content"]/div[2]/div/div/table/tbody/tr[1]/td[11]/a').click()
driver.find_element_by_name('file').send_keys('F:/test.png')
time.sleep(1)
driver.find_element_by_id('submitButton').click()
# 提交成功
time.sleep(2)
# driver.quit()
3.注意
(1)要将复制的文件路径中的反斜线变成正斜线,可以使用3种方法
a. 在字符串中用两个反斜线表示一个正斜线。
b. 在字符串前面加一个字母r,表示将所有的反斜线变为正斜线。
c. 把字符串中所有的反斜线改成正斜线。
(2)路径不要有中文
11、页面截图处理(19)
1.主要方法
get_screenshot_as_file(self, filename)
2.主要步骤
driver.get_screenshot_as_file("F:/denglu.png")
12、alert弹出框处理(20)
1.主要方法
(1)获取对话框文本值
d.switch_to.alert.text
(2)相当于点击”确认“
d.switch_to.alert.accept()
(3)相当于点击”取消“
d.switch_to.alert.dismiss()
(4)输入值,这个alert和confirm没有输入对话框,所以这里不能用,只能用于prompt,否则会报错
d.switch_to.alert.sendkeys()
13、python方法介绍(21)
1.基本形式
def 方法名(参数)。
注意:执行语句方法名为调用的表示名,参数则是传入的参数,可以根据需要定义,也可以没有。
2.简单规则
方法体中的语句都要比方法声明缩进4 个空格。方法只有被调用才会被执行,否则不执行方法里面的脚本。
3.实例
def read():
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://10.1.30.75/pams/front/login.do")
# 进入到资产管理系统登录页面
driver.find_element_by_id('loginName').send_keys("student")
# 输入用户名
driver.find_element_by_id('password').send_keys("student")
# 输入密码
driver.find_element_by_tag_name('button').click()
# 点击登录按钮
if __name__ == '__main__':
read()
#方法调用
14、unittest测试框架(22)
1.导包
import unittest # 导入测试框架
2.框架使用说明
-
定义一个继承自等的测试用例类。
-
定义**setUp()**方法、**tearDown()**方法、**setUpClass()**方法、**tearDownClass()方法,其中setUp()**方法指在每个测试用例方法执行前,都会执行一次;**tearDown()**方法指在每次测试用例方法执行结束,都会执行一次;**setUpClass()**方法指在一个测试用例集执行前只执行一次;**tearDownClass()**方法指在一个测试用例集执行后只执行一次。
-
定义测试用例,名字以test开头。
-
一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要调用assertEqual、assertRaises断言方法判断程序执行结果和预期值是否相符。
-
调用**unittest.main()**启动测试。
3.1案例一
import unittest
from selenium import webdriver
import time
'''案例一
案例步骤:
1、分别定义4个方法setUp()、tearDown()、test_denglu()、test_denglu1();
2、setUp()方法启动浏览器;
3、tearDown()方法关闭浏览器;
4、test_denglu()方法进入资产管理系统登录页面,输入账号和密码,点击登录按钮;
5、test_denglu1()方法进入资产管理系统登录页面,输入账号和密码,点击登录按钮,在资产管理系统页面点击个人信息按钮。
'''
# 定义一个继承自unittest.TestCase的测试用例类。
class Denglu(unittest.TestCase):
def setUp(self):
self.d = webdriver.Chrome()
self.d.implicitly_wait(10)
self.d.get('http://10.1.30.75/pams/front/login.do')
def test_denglu(self):
d = self.d
d.find_element_by_id('loginName').send_keys('student')
d.find_element_by_id('password').send_keys('student')
d.find_element_by_tag_name('button').click()
def test_denglu1(self):
d = self.d
d.find_element_by_id('loginName').send_keys('student')
d.find_element_by_id('password').send_keys('student')
d.find_element_by_tag_name('button').click()
d.find_element_by_link_text('个人信息')
def tearDown(self):
time.sleep(0.5)
self.d.quit()
if __name__ == '__main__':
unittest.main()
3.2案例二
'''案例二
案例步骤:
1、分别定义4个方法setUpClass()、tearDownClass()、test_denglu()、test_denglu1();
2、setUpClass()方法启动浏览器;
3、tearDownClass()方法关闭浏览器;
4、test_denglu()方法进入资产管理系统登录页面,输入账号和密码,点击登录按钮;
5、test_denglu1()方法进入资产管理系统页面,在资产管理系统页面点击个人信息按钮。
'''
# 定义一个继承自unittest.TestCase的测试用例类。
class Denglu(unittest.TestCase):
@classmethod
def setUpClass(cls): # 定义setUPClass方法
cls.d = webdriver.Chrome()
cls.d.implicitly_wait(10)
@classmethod
def tearDownClass(cls): # 定义tearDownClass方法
time.sleep(0.5)
cls.d.quit()
def test_denglu(cls): # 定义test_denglu方法
d = cls.d
d.get('http://10.1.30.75/pams/front/login.do')
d.find_element_by_id('loginName').send_keys('student')
d.find_element_by_id('password').send_keys('student')
d.find_element_by_tag_name('button').click()
# 登陆成功
d.find_element_by_link_text('部门管理').click()
time.sleep(0.5)
def test_denglu1(cls):
cls.d.find_element_by_link_text('个人信息').click()
# 点击个人信息按钮
time.sleep(0.5)
if __name__ == '__main__':
unittest.main()
# 调用unittest.main()启动测试
15、csv文件读取(23)
1.读取步骤
1、导入csv代码库;
2、以只读形式打开文件;
3、由于打开文件的数据不能够直接查看,所以要将打开文件的数据进行格式转换;
4、使用for循环将所有的数据进行打印,但是不包括第一行标题数据。
2.案例
'''案例描述
在自己的电脑新建一个csv文件,
文件里面存在数据,然后通过代码进行读取,
读取的时候去除第一行的标题数据。'''
import csv # 导入csv代码库
def read(): # 将数据读取存在一个方法中,方便后面被调用
path = r"D:\JetBrains\rczidonghua\zdhcs.csv"
stream = open(path,'r')
# 以只读的形式打开文件
data = csv.reader(stream)
# 进行数据格式转换
list = [] # 将读取的数据存放到list中
i = 0
for row in data:
if i != 0 :
list.append(row)
i = i + 1
return list
if __name__ == '__main__':
data = read()
for row in data:
print(row)
16、数据驱动(24)
1.数据驱动步骤
(1)、首先在头部导入ddt代码库,import ddt;
(2)、在测试类前添加一个装饰器,表示这个类采用ddt代码库的方式实现数据驱动(@ddt.ddt);
(3)、在测试方法前使用@ddt.data()指定数据来源。
2.代码编写思路
先将测试数据单独存在,然后再编写脚本的时候调用存放的数据,逐条进行数据的读取
3.案例
readxnr.py
'''案例步骤:
1、进入资产管理系统登录页面;
2、输入任务ID、用户名和密码,点击登录按钮;
3、点击供应商按钮;
4、在供应商页面中的供应商名称输入框中输入多组数据进行查询。
'''
import csv
def readxnr():
stream = open(r"D:\JetBrains\rczidonghua\shujuqudong.csv",'r')
data = csv.reader(stream)
list=[]
i=0
for row in data:
if i != 0:
list.append(row)
i = i+1
return list
# if __name__ == '__main__':
# data = readxnr()
# for row in data:
# print(row)
Pxnr.py
import unittest
import ddt
import time
from selenium import webdriver
from shiXun_Test.shujuqudong.readxnr import readxnr
@ddt.ddt
# ddt装饰器
class Pxnr(unittest.TestCase):
def setUp(self):
self.d = webdriver.Chrome()
self.d.implicitly_wait(10)
def tearDown(self):
time.sleep(1)
self.d.quit()
stream_info = readxnr()
# 创建一个变量来接收数据
@ddt.data(*stream_info)
def test_pxnr(self,list):
d = self.d
d.get("http://10.1.30.75/pams/front/login.do")
# 进入到资产管理系统登录页面
d.find_element_by_name('loginName').send_keys("student")
# 输入用户名
d.find_element_by_name('password').send_keys("student")
# 输入密码
d.find_element_by_tag_name('button').click()
# 点击登录按钮
d.find_element_by_link_text("供应商").click()
# 点击供应商按钮
d.find_element_by_xpath('//*[@id="fmsearch"]/div/div[3]/input').send_keys(list[0])
# 在供应商名称输入框中分别输入读取的数据
d.find_element_by_xpath('//*[@id="fmsearch"]/div/div[4]/button').click()
# 点击查询按钮
time.sleep(2)
if __name__ == '__main__':
unittest.main()
# 调用unittest.main()启动测试
17、数据断言(25)
1.主要方法
self.assertEqual(element, list[1])
2.对比方法
1、比对页面元素的文本信息;
Find_element().text--------这个是获取页面中的文本。
2、通过页面标题;
Driver.title---------可以通过标题做页面调整的验证。
3、通过网址;
Driver.current_url-------通过网址做页面跳转的验证。
4、比对页面元素的属性。
FindElement().get_attribute(“value”)
3.案例
案例步骤:
1、进入资产管理系统登录页面;
2、输入任务ID、用户名和密码;
3、点击登录按钮;
4、点击部门管理按钮;
5、点击新增按钮;
6、在部门名称输入框输入信息,点击保存按钮;
7、在输入名称输入框进行数据驱动和断言代码编写,并进行异常错误处理和对异常错误进行截图。
readdenglu.py
import csv
def readdenglu():
data = csv.reader(open(r"D:\JetBrains\rczidonghua\zdhcs.csv",'r'))
list =[]
i = 0
for row in data:
if i !=0:
list.append(row)
i=i+1
return list
if __name__ == '__main__':
data = readdenglu()
for row in data:
print(row)
Denglu.py
import ddt
import os
import time
import unittest
from selenium import webdriver
from shiXun_Test.shujuduanyan.readdenglu import readdenglu
@ddt.ddt
# ddt修饰器
class Denglu(unittest.TestCase):
def setUp(self):
self.d = webdriver.Chrome()
self.d.implicitly_wait(10)
def tearDown(self):
time.sleep(1)
self.d.quit()
stream_info=readdenglu()
@ddt.data(*stream_info)
def test_denglu(self,list):
try:
d = self.d
d.get('http://10.1.30.75/pams/front/login.do')
d.find_element_by_id('loginName').send_keys('student')
d.find_element_by_id('password').send_keys('student')
d.find_element_by_tag_name('button').click()
d.find_element_by_link_text('部门管理').click()
d.find_element_by_xpath('//*[@id="content"]/div[2]/div/div[1]/button').click()
d.find_element_by_id('title').send_keys(list[0])
d.find_element_by_id('submitButton').click()
time.sleep(1)
d.switch_to.alert.accept()
# 弹出框处理
element = d.switch_to.alert.text
# print(element)
# 定位实际结果
self.assertEqual(element, list[1])
# 对数据进行断言
time.sleep(2)
except:
current_time = time.strftime('%Y-%m-%d_%H_%M_%S')
# 获取当前系统时间
current_path = os.path.dirname(__file__)
# 获取当前绝对路径
path = current_path+'\\'+current_time+'.png'
# 路径转换
print(path)
# print('页面标题:',d.title)
# print('页面网址',d.current_url)
d.get_screenshot_as_file(path)
# 截图
if __name__ == '__main__':
unittest.main()
18、discover方法(26)
1.主要用途
将这些用例按照测试功能进行拆分,分散到不同的测试文件中。这时候我们可以通过discover方法来执行所有的测试用例。
2.使用格式
discover(start_dir,pattern='test*.py')
找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。
start_dir:要测试的模块名或测试用例目录
pattern='test*.py':表示用例文件名的匹配原则。此处匹配文件名以“test”开头的“.py”类型的文件,星号“*”表示任意多个字符
3.案例
案例步骤:
设计用例1,新建test_01.py:
1、进入到资产管理系统登录页面(http://192.168.X.XXX);
2、输入用户名和密码;
4、点击登录按钮。
设计用例2,新建test_02.py:
1、进入到资产管理系统登录页面
2、输入用户名和密码;
3、点击登录按钮。
4、点击“个人信息”按钮;
新建runtest.py:
通过discover方法来执行所有的测试用例。
test01.py
import unittest
from selenium import webdriver
import time
class Login(unittest.TestCase):
def setUp(self):
self.d=webdriver.Chrome()
self.d.implicitly_wait(10)
def tearDown(self):
self.d.quit()
def test_denglu(self):
d = self.d
d.get('http://10.1.30.75/pams/front/login.do')
d.find_element_by_id('loginName').send_keys('student')
d.find_element_by_id('password').send_keys('student')
d.find_element_by_tag_name('button').click()
# 登陆成功
time.sleep(2)
test_02.py
import unittest
from selenium import webdriver
import time
class Grxx(unittest.TestCase):
def setUp(self):
self.d=webdriver.Chrome()
self.d.implicitly_wait(10)
def tearDown(self):
self.d.quit()
def test_grxx(self):
d = self.d
d.get('http://10.1.30.75/pams/front/login.do')
d.find_element_by_id('loginName').send_keys('student')
d.find_element_by_id('password').send_keys('student')
d.find_element_by_tag_name('button').click()
# 登陆成功
d.find_element_by_link_text('个人信息').click()
# 点击个人信息
time.sleep(2)
runtest.py
import unittest
test_dir='./test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
if __name__ == '__main__':
runner = unittest.TextTestRunner() # 默认不加括号,需要加括号
runner.run(discover)
19、测试报告(27)
1.下载模块
下载地址:
http://tungwaiyip.info/software/HTMLTestRunner.html
下载后需要做一些修改让他来支持python3(附带文件中有修改好可直接使用的文件):
•94行引入的名称要改,import StringIO 改成import io。
•539行 self.outputBuffer = StringIO.StringIO() 改成self.outputBuffer=io.StringIO()
•631行 print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)
改成:print (sys.stderr, '\nTime Elapsed: %s' %(self.stopTime-self.startTime))
•642行,if not rmap.has_key(cls): 改成 if not cls in rmap:
•766行的uo = o.decode('latin-1'),改成 uo=o
•772行,把 ue = e.decode('latin-1') 改成 ue = e
存放路径
将修改完成的模块存放在Python路径下Lib目录里面即可
2.案例
案例步骤
在test_case下新建test_01.py:
1、进入到资产管理系统登录页面(http://192.168.X.XXX);
2、输入任务ID、用户名和密码;
3、点击登录按钮;
新建runtest.py:
通过discover方法执行test_01.py并且引入HTMLTestRunner模块来自动生成测试报告
项目目录
test_01.py
import unittest
import time
from selenium import webdriver
class Login(unittest.TestCase):
def setUp(self):
self.d = webdriver.Chrome()
self.d.implicitly_wait(10)
def tearDown(self):
self.d.quit()
def test_login(self):
d = self.d
d.get('XX')
d.find_element_by_id('XX').send_keys('XX')
d.find_element_by_id('XX').send_keys('XX')
d.find_element_by_tag_name('XX').click()
# 登陆成功
time.sleep(2)
runtest.py
import unittest
from HTMLTestRunner import HTMLTestRunner
import time
test_dir = './test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
if __name__ == '__main__':
report_dir='./test_report'
# 测试报告存放位置
now = time.strftime('%Y-%m-%d_%H_%M_%S')
# 时间戳
report_name = report_dir+'\\'+now+'result.html'
# 文件命名
with open(report_name,'wb') as f:
runner = HTMLTestRunner(stream=f,title="Test Report",description="test HR")
runner.run(discover)
f.close()
20、 PageObject模式(30)
1.PO模式介绍
Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变化时,需要改测试页面代码的情况。 当页面元素id变化时,只需要更改测试页Class中页面的属性即可。 获取页面中元素的属性可以通过id,class或者XPath获取,在id唯一的情况下,可以使用id获取页面元素,否则可以使用XPath定位页面元素。
2.案例
案例步骤
1、进入资产管理系统登录页面;
2、输入用户名和密码;
3、点击登录按钮。
在Page文件中新建文件BasePage.py:
from time import sleep
class Page():
"""基础类,用于所以页面对象类继承"""
def __init__(self,driver):
self.driver=driver
self.base_url='http://10.1.30.75/pams/front/login.do'
self.timeout=10
# 初始化
def _open(self,url):
url_=self.base_url+url
print("Test page is %s" %url_)
self.driver.maximize_window()
self.driver.get(url_)
sleep(2)
assert self.driver.current_url==url_ ,'Did not land on %s' %url_
# 打开不同的子页面,并对URL地址添加断言
def open(self):
self._open(self.url)
def find_element(self,*loc):
return self.driver.find_element(*loc)
# 元素定位方法封装
在Page文件中新建文件LoginPage.py:
from selenium.webdriver.common.by import By
from BasePage import *
class LoginPage(Page):
url=""
username_loc=(By.ID,'loginName')
# 定位用户名输入框
password_loc=(By.ID,'password')
# 定位密码输入框
submit_loc=(By.TAG_NAME,'button')
# 定位登录按钮
def type_username(self,username):
self.find_element(*self.username_loc).clear()
self.find_element(*self.username_loc).send_keys(username)
# 输入用户名
def type_password(self, password):
self.find_element(*self.password_loc).clear()
self.find_element(*self.password_loc).send_keys(password)
# 输入密码
def type_submit(self):
self.find_element(*self.submit_loc).click()
# 点击登录按钮
def test_user_login(driver,username,password):
login_page=LoginPage(driver)
login_page.open()
login_page.type_username(username)
login_page.type_password(password)
login_page.type_submit()
# 登录功能模块封装
在test文件中新建文件test_Login.py:
from selenium import webdriver
from LoginPage import *
driver = webdriver.Chrome()
test_user_login(driver,'student','student')
# 输入用户名和密码
sleep(3)
driver.quit()