打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
selenium2
一、Webdriver API
1、元素定位
<div>
<form action="" id='fm'>
用户:<input type="text" name="user" id="user" class="user">
<a href="http://www.baidu.com">百度链接</a>
</form>
</div>
1. id定位 例如:find_element_by_id('user")
2. name定位 例如:find_element_by_name('user")
3. class定位 例如:find_element_by_class_name('user")
4. tag_name定位 例如:find_element_by_tag_name('user")
5. link定位 例如:find_element_by_link_text('百度链接")
6. partial link 例如:find_element_by_partial_link_text('百度")
7. Xpath定位
1)绝对路径定位
2)元素属性定位
例如:
find_element_by_xpath("//input[@id='user']")
find_element_by_xpath("//input[@maxlength='100']")
find_element_by_xpath("//input[@type='submit']")
3) 层级与属性相结合
本身没有值可用于定位,可以找父元素定位
例如:find_element_by_xpath("//span[@type='text']/input")
4) 使用逻辑运算符
一个元素不足以定位,使用多个元素定位
find_element_by_xpath("//input[@id='user' and @name='ie']")
8. Css定位
选择器
例子
描述
Id选择器:#id
类选择器:.class
标签选择器:element
*
子代选择器:element>element
div>input
Div子代中所有input
后代选择器:element+element
div+input
Div下的所有input
[attrbute=value]
[target=_blank]
target='_blank'的元素
例子:
1)id选择器 例子:find_element_by_css_selector("#user")
2)类选择器 例子:find_element_by_css_selector(".user")
3)标签选择器 例子:find_element_by_css_selector("input")
4)子代选择器 例子:find_element_by_css_selector("span>input")
5)通过属性定位 例子:find_element_by_css_selector("[type='kw']")
6)组合定位
例子:查找class为fm的form表单,下的id为user的input标签
find_element_by_css_selector("form.fm>input#user")
Xpath与css简单对比:
定位方式
Xpaht
Css
标签
//div
div
By id
//input[@id='user']
input#user
By class
//input[@class='user']
input.user
By 属性
//input[@title='move it here']
div[tittle=move it here]
div[tittle^=move]
div[tittle$=here]
div[tittle*=it]
子元素定位
//input[@id='user']/h1
input#user>h1
9. 用by元素定位
针对八种定位,还有另一套写法find_element(),通过By申明定位方法。
如下:
find_element(By.ID,'kw')
find_element(By.NAME,'kw')
find_element(By.CLASS_NAME,'kw')
find_element(By.TAG_NAME,'kw')
find_element(By.LINK_TEXT,'百度链接')
find_element(By.PARTIAL_LINK_TEXT,'百度')
find_element(By.XPATH,'//input[@id='user']')
find_element(By.CSS_SELECTOR,'input#user>h1')
2、控制浏览器
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.get("http://www.news.baidu.com")
driver.set_window(480,800)  #设置窗口大小,宽480像素,高800
driver.back()                   #后退到前一页面
driver.forward()                #前进到之前页面
driver.refresh()                #刷新当前页面
#driver.close()                 #关闭当前窗口
driver.quit()                   #退出驱动关闭所有窗口
3、简单元素操作
element = find_element_by_id('user")
element.clear()             #清空文本
element.send_keys(*value)   #模拟按键输入
element.click()             #点击
element.submit()            #提交表单,模拟回车键
element.size                #获取元素尺寸
element.text                #获取元素文本
element.get_attribute('name') #获取属性值
element.is_idsplayed()    #设置元素是否用户可见,返回True/False
4、鼠标事件
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
driver =webdriver.Firefox()
driver.get("http://www.baidu.com")
element = driver.find_element(By.ID,'kw')
target = driver.find_element(By.ID,'xx')
ActionChains(driver).context_click(element).perform()   #鼠标右击
ActionChains(driver).double_click(element).perform()    #双击
ActionChains(driver).move_to_element(element).perform() #鼠标悬停
ActionChains(driver).drag_and_drop(element,target).perform()#从a拖动到b释放
5、键盘事件
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver =webdriver.Firefox()
driver.get("http://www.baidu.com")
element = driver.find_element(By.ID,'kw')
element.send_keys(Keys.SPACE)           #输入空格
element.send_keys('教程')                #输入“课程”
element.send_keys(Keys.BACK_SPACE)      #删除一个字符
element.send_keys(Keys.TAB)             #输入tab键
element.send_keys(Keys.ESCAPE)          #输入esc键
element.send_keys(Keys.ENTER)           #输入回车键
element.send_keys(Keys.CONTROL,'a')     #全选 Ctrl+a
element.send_keys(Keys.CONTROL,'c')     #复制 Ctrl+c
element.send_keys(Keys.CONTROL,'x')     #剪切 Ctrl+x
element.send_keys(Keys.CONTROL,'v')     #粘贴 Ctrl+v
element.send_keys(Keys.F1)              #输入F1键
6、获得验证信息
通常需要验证的信息分别为title、URL、和text。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver =webdriver.Firefox()
driver.get("http://www.baidu.com")
element = driver.find_element(By.ID,'kw')
title = driver.title        #获取当前页面title
url = driver.current_url    #获取当前页面url
text = element.text         #获取当前元素的文本
7、设置元素等待
1)显式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver =webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver,5,0.5).until(
EC.presence_of_element_located((By.ID,'kw'))
)
element.send_key('selenium')
driver.quit()
WebDriverWait(driver,timeout,poll_frequency,ignoee_exceptions):
Driver:浏览器驱动
Timeout:等待时长
poll_frequency:检测的时间间隔,默认0.5s
ignoee_exceptions:超时抛出的异常,默认NoSuchElementException
Until()和until_not():调用方法提供的驱动作为参数,直到返回True和False
expected_conditions提供的预期条件判断方法
方法
说明
title_is
title是否完全等于(==)预期字符串
title_cintains
title是否包含预期字符串
presence_of_element_located
判断某个元素是否被加到了dom树里,并不代表该元素一定可见
visibility_of_element_located
判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
visibility_of
跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
presence_of_all_elements_located
判断是否至少有1个元素存在于dom树中。举例,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True
text_to_be_present_in_element
判断某个元素中的text是否 包含 了预期的字符串
text_to_be_present_in_element
判断某个元素中的value属性是否 包含 了预期的字符串
frame_to_be_available_and_switch_to_it
判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
invisibility_of_element_located
判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable
判断某个元素中是否可见并且是enable的,这样的话才叫clickable
staleness_of
等某个元素从dom树中移除,注意,这个方法也是返回True或False
element_to_be_selected
判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be
判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be
跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
alert_is_present
判断页面上是否存在alert
2)隐式等待
from selenium import webdriver
from time import ctime,sleep
from selenium.common.exceptions import NoSuchElementException
driver =webdriver.Firefox()
driver.implicitly_wait(10)          #在10秒内,轮询判断是否定位到元素,定位到就向下执行
# sleep(2)                            #固定休眠2秒
driver.get("http://www.baidu.com")
try:
print(ctime())
driver.find_element_by_id('kw').send_keys('selenium')
except NoSuchElementException as e:
print(e)
finally:
print(ctime())
driver.quit()
3)Sleep休眠
见2)隐式等待
8、定位一组元素
定位一组元素的方法和定位单个元素的方法类似,唯一的区别是在单词element的后面多了一个s表示复数。多用于批量操作,或选出一组值,再从中过滤需要的元素。
elements =driver.find_elements_by_id('kw')
elements.pop()      #获取一组元素最后一个
elements.pop(-1)    #同pop()
elements.pop(0)     #获取第一个
elements.pop(1)     #获取第二个
9、多表切换
通过switch_to.frame(el/index)可通过元素或者索引,将当前定位主题切换为frame/iframe表单内嵌的页面中。
from selenium import webdriver
import os
driver =webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('frame.html')
driver.get(file_path)
driver.switch_to.frame('if') #方法一、切换到id为if的iframe
xf = driver.find_element_by_xpath('//*[@class="if"]')
driver.switch_to.frame(xf) #方法二、通过定位切换
driver.switch_to.parent_frame() #跳出当前表单,到最近的frame
driver.switch_to.default_content() #跳出所有frame,到最外层页面
driver.quit()
10、多窗口切换
from selenium import webdriver
driver =webdriver.Firefox()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
search_windows = driver.current_window_handle  #获取当前页面句柄
all_handle = driver.window_handles  #获取全部窗口句柄
for handle in all_handle:
if handle !=search_windows:
driver.switch_to.window(handle) #切换到handle窗口
pass
driver.quit()
11、警告框处理
driver.switch_to.alert.accept() #只有两个按钮确认/取消时,的确认操作
driver.switch_to.alert.dismiss() #只有两个按钮确认/取消,的取消操作
driver.switch_to.alert.send_keys('value')   #向警告框输入文本
print(driver.switch_to.alert.text) #获取alert/confirm/prompt中的文字信息
12、上传文件
1. Send_keys实现上传
对于通过input标签实现的上传功能,可以看做一个输入框,用send_keys()指定文件路径的方式上传。
element = driver.find_element(By.ID,'kw')
element.send_keys('D:\\upload_file.txt')
2. Autolt实现上传
13、下载文件
14、操作cookies
driver.add_cookie({"name" : "foo", "value" : "bar"}) #添加cookie信息到浏览器
driver.get_cookie("foo")    #获取key的值为foo的字段对象,必须有name和value的值
driver.get_cookies()        #获取所有cookie信息
driver.delete_cookie("foo") # delete browser cookie
driver.delete_all_cookies() #delete 所有cookie
15、调用JavaScript
1)控制滚动条
driver.get('http://www.baidu.com')
#通过JavaScript设置浏览器的窗口滚动条位置
js = "window.scrollTo(100,450);"
driver.execute_script(js)
2)向textarea输入内容(该类型不能通过send_keys()方法输入文本)
text = 'input text'
# 将js与text通过 + 进行拼接
js = "var sum = document.getElementById('textarea'); sum.value='" + text + "';"
driver.execute_script(js)
16、处理H5的视频播放
video = driver.find_element(By.XPATH,'//div[@type="video"]')
#使用JavaScript内置的对象arguments,并用currentSrc返回当前音/视频的url,未设置则返回空字符串
url = driver.execute_script("return arguments[0].currentSrc;",video)
driver.execute_script("return arguments[0].load()",video)  #加载
driver.execute_script("return arguments[0].play()",video)  #播放
driver.execute_script("return arguments[0].pause()",video) #暂停
17、窗口截图
driver.get_screenshot_as_file("D:\\pyse\\badu_img.jpg")
18、关闭窗口
#driver.close()                 #关闭当前窗口
driver.quit()                   #退出驱动关闭所有窗口
19、验证码处理
1、去掉验证码
2、设置万能验证码
3、验证码识别技术
4、通过记录并添加cookie绕过登录,直接处于登录状态
driver.add_cookie({'name':'username','value':'zhaoliying'})
driver.add_cookie({'name':'password','value':'zhaoliying12'})
driver.get('http://www.xx.com') #再次访问xx网站,将自动登录
20、Webdriver原理
二、自动化测试模型
1、自动化测试模型介绍
1)线性测试(面向过程):
优点:每个脚本都是单独独立的
缺点:
开发成本高:用例间可能存在重复的操作,不得不去编写这些重复的操作。
维护成本高:当页面代码发生变化时,不得逐一的对它们进行修改,重新定位。
2)模块化驱动测试(面向对象):
优点:
把重复的操作独立成公共模块。
提高了开发效率,不用重复编写相同的操作脚本;
简化了维护的复杂性,只需要对发生变化的相关模块进行维护。
3)数据驱动测试:
就是数据的参数化,目的就是实现参数与数据的分离。
4)关键字驱动测试:
典型的工具为QTP、Robot Framework
2、模块化驱动测试用例
3、数据驱动测试实例
1)读取txt文件
with open ('user_info.txt','r',encoding='utf-8') as file:
file_all = file.read()             #读取全部文本
file_frist_line = file.readline()   #读取第一行
file_all_line = file.readlines() #按行读取,读取所有行
2)读取csv文件
files = csv.reader(open('info.csv','r'))
for file in files:
print(file[1])  #通过索引读取数据
3)读取xml文件
#xml文件示例:
<login usernaem='admin' password='123456'/>
<login usernaem="zhaoliying" password="123"/>
<city>上海</city>
<city>北京</city>
#python 解析
#获取标签的属性值
logins = root.getElementsByTagName('login')
username = logins[0].getAttribute('username')
#获取标签对之间的数据
citys = dom.getElementByTagName('city')
city = citys[1].fristChild.data
三、SeleniumIDE
1、seleniumIDE的安装
2、界面介绍
3、创建测试用例
4、命令
5、断言与验证
6、等待与变量
四、Unittest及pytest
1、概念
Test case:一个测试用例包含测试亲准备环境的搭建(setUp)、测试过程的代码(run)、以及测试之后环境的还原(tearDown)
Test Suite:多个测试用例集合在一起执行
Test runner:
Test fixture:对一个测试环境的搭建和销毁。比如:用例需要使用数据库,那么可以在setUp()中通过建立数据链接来初始化,在tearDown()中清除数据库产生的数据,然后关闭数据库
2、断言方法
方法
描述
assertEqual(a,b,msg=msg)
判断a与b是否一致,msg类似备注,可以为空
assertNotEqual(a,b,msg=msg)
assertTrue(a,msg=none)
判断a是否为True
assertFalse(b,msg=none)
assertIn(a,b)
判断a in b是否成立,正确则True,否则为False
assertNotIn(a,b)
assertIs(a,b)
判断a 与b的对象是否相同,成立则True,否则False
assertIsNot(a,b)
assertDictEqual(a,b)
判断字典a和字典b是否相等,a,b为字典
assertLess(a,b)
判断a<b 成立则通过,否则失败
assertGreater
判断a>b 成立则通过,否则失败
assertIsNone(obj=””)
判断obj=None 成立则通过,否则失败
assertIsNotNone
判断obj=None 成立则失败,否则通过
assertIsInstance(a,b)
判断a的数据类型是否为b,isinstance(a,b) 成立则通过,否则失败
assertNotIsInstance
3、测试用例的组织
1)Testsuit的使用
import unittest
class TestSub(unittest.TestCase):
def setUp(self):
pass
def test_sub(self):
self.assertEqual((2+3),5)
def tearDown(self):
pass
if __name__=="__main__":
#构造测试集
suit = unittest.TestSuite()
suit.addTest(TestSub("test_sub"))
#运行测试集合
runner = unittest.TextTestRunner()
runner.run(suit)
2)封装setUp与tearDown
import unittest
class MyTest(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
class TestSub(unittest.TestCase):
def test_sub(self):
self.assertEqual((2+3),5)
if __name__=="__main__":
unittest.main()
3)Discover的使用
import unittest
#定义测试用例的目录为当前目录
test_dir = './'
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(discover)
discover(start_dir,parttern=’test*.py,top_level_dir=None):
Start_dir:要测试的模块名,或测试用例目录
Parttern:表示测试用例名的匹配原则
top_level_dir:测试模块的顶层目录,如果没有,默认为None
4、用例的执行顺序
Discover()加载测试用例的规则和main()方法相同。unittest框架默认根据ASCII码的编码顺序加载测试用例,数字字母的顺序为:0-9,A-Z,a-z
5、跳过测试用例和预期失败
import unittest
class MyTest(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
@unittest.skip("直接跳过测试")
def test_skip(self):
print("test_skip")
@unittest.skipIf(3>2,"当条件为True时,跳过测试")
def test_skipif(self):
print("test_skipif")
@unittest.skipUnless(3>2,"当条件为False时,跳过测试")
def test_skipunless(self):
print("test_skipunless")
@unittest.expectedFailure() #不管执行结果如何,统一标注为失败
def test_expectedfailure(self):
self.assertEqual(2,3)
if __name__ =="__main__":
unittest.main()
6、Fixture
import unittest
def setUpModule():
print("module start--------------->")
def tearDownModule():
print("module end----------------->")
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("class start======>")
@classmethod
def tearDownClass(cls):
print("class end =======>")
def setUp(self):
print("case start -->")
def tearDown(self) -> None:
print("case end -->")
def test_case1(self):
print("执行用例1")
def test_case2(self):
print("执行用例2")
if __name__ =="__main__":
unittest.main()
setUpModule/tearDownModule: 在整个模块开始和结束时候被执行
setUpClass/tearDownClass:在测试类的开始和结束时被执行,需要通过@classmethod进行装饰,参数为cls(默认写法,类似self)
setUp/tearDown:在每个测试用例的开始和结束时候都会被执行一次
五、自动化测试高级应用
1、HTML测试报告
.下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html
将下载文件放在python安装目录下的Lib目录下,HTMLTestRunner是基于python2开发,需做如下配置。
Python3安装目录:C:\Users\mingd\AppData\Local\Programs\Python\Python311\Lib
1)生成测试报告
import unittest,time
from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner
class Baidu(unittest.TestCase):
"""百度测试"""
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(10)
self.baidu_url = "http://baidu.com"
def tearDown(self):
self.driver.quit()
def test_baidu(self):
"""搜索关键字:selenium"""  #HTMLTestRunner可以读取类和方法下的三引号内的注释
self.driver.get(self.baidu_url)
self.driver.find_element_by_id("kw").send_keys("selenium")
# self.driver.find_element_by_id("su").click()
if __name__ =="__main__":
#构造测试集
testunit = unittest.TestSuite()
testunit.addTest(Baidu("test_baidu"))
#定义报告存放路径
now = time.strftime("%Y-%m-%d %H_%M_%S")
file_name = './' + now +'result.html'
fp = open(file_name,'wb')
#定义测试报告
runner = HTMLTestRunner(stream=fp,title="百度搜索测试报告",description="用例执行状况:")
#stream 指定测试报告文件
#title  指定测试报告标题
#description 指定测试报告副标题
runner.run(testunit)    #运行测试集
fp.close()
2)项目集成测试报告
import unittest, time
from HTMLTestRunner import HTMLTestRunner
# 指定测试用例集为当前文件下的test_case目录
test_dir = './test_case'
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
if __name__ == "__main__":
now = time.strftime("%Y-%m-%d %H_%M_%S")
file_name = './' + now + 'result.html'
fp = open(file_name, 'wb')
runner = HTMLTestRunner(stream=fp, title="百度搜索测试报告", description="用例执行状况:")
runner.run(discover)
fp.close()
2、自动发邮件
from HTMLTestRunner import HTMLTestRunner
from email.header import Header
from email.mime.text import MIMEText
import smtplib
import unittest
import time
import os
def send_email(file_name):
f = open(file_name,'rb')
mail_body = f.read()
f.close()
#
msg = MIMEText(mail_body,'html','utf-8')    #定义邮件正文 文件内容,文本格式,编码方式
msg['Subject'] = Header('自动化测试报告','utf-8') #定义邮件标题
#连接邮箱
smtp = smtplib.SMTP()
smtp.connect("smtp.126.com")    #指定连接的邮箱服务器
smtp.login("username@126.com","123456")     #登录邮箱
smtp.sendmail("username@126.com","recive@126.com",msg.as_string())  #发送人地址,接收人地址,发送的消息
smtp.quit()         #结束SMTP会话,SMTP简单邮件传输协议
print("email has send out !")
#查找测试报告目录
def new_report(testreport):
lists = os.listdir(testreport)
lists.sort(key=lambda  fn:os.path.getmtime(testreport + "\\" + fn))
file_new = os.path.join(testreport,lists[-1])
print(file_new)
return file_new
if __name__ =="__main__":
test_dir = 'D:\\testrepro\\testcase'
test_report = 'D:\\testpro\\report'
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py')
now =time.strftime("%Y-%m-%d %H_%M_%S")
filename = test_report + "\\" + now + 'result.html'
fp = open(filename,'wb')
runner = HTMLTestRunner(stream=fp,title='测试报告',description='用例执行状况:')
runner.run(discover)
fp.close()
new_report =new_report(test_report)
send_email(new_report)             #发送报告
3、Pageobject设计模式
六、Selenium grid2
七、多线程
八、项目实战
自动化测试用例编写原则:
1)一个用例为完整的场景,从用户登录系统到最终退出并关闭浏览器;
2)一个用例只验证一个功能点,不要试图在用户登录系统后把所有功能都验证一遍;
3)尽可能编写逆向逻辑用例。一方面逆向用例很多,另一方面自动化脚本比较脆弱,复杂的逆向逻辑实现起来比较麻烦且容易出错。
4)用例间尽量避免依赖;
5)一条用例完成测试后需要对测试场景进行还原,以免影响其他用例的执行。
九、Bdd框架之lettuce入门
十、Git托管
十一、持续集成Jenkins入门
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Selenium2+python自动化52
自动化搭建环境及基础理论
最完整的自动化测试流程
接口测试基础——第6篇unittest模块(一)
unittest单元测试框架总结
unittest自动化测试框架
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服