一、自动化测试是什么?
自动化测试是指通过自动化测试工具或其他手段,按照测试人员的测试计划进行自动测试,目的是减轻手工测试的工作量。
二、操作
1.环境搭建
1.为python安装selenium模块:pip install selenium
2.下载相应浏览器驱动:Chromedriver;Firefoxdriver
2.selenium知识点汇总
一、selenium之元素定位
正常情况下优先级:id>name>CSS selector>xpath
优先选择CSS selector的原因
1.css配合html工作,xpath配合xml工作
2.相对xpath,更简洁
3.前端开发主要使用css
除了find_element_by_xxx(),find_element()函数也可以定位
需要导入By即from selenium.webdrive.common.by import By.
from selenium import webdriver
from time import sleep
"""
测试demon是http://sahitest.com/demo/
"""
class Dwelement(object):
#初始化
def __init__(self):
#实例化浏览器
self.drive=webdriver.Chrome()
#URl
self.drive.get('http://sahitest.com/demo/')
#全屏
self.drive.maximize_window()
#find_element_by_id
def Dw_by_id(self):
self.drive.find_element_by_link_text('Link Test').click()
sleep(1)
self.drive.find_element_by_id('linkById').click()
#返回
self.drive.back()
#返回主界面
self.drive.back()
#find_element_by_name
def Dw_by_name(self):
self.drive.find_element_by_link_text('Form Test').click()
#弹框
al=self.drive.switch_to.alert
sleep(1)
al.accept()
self.drive.find_element_by_name('t1').send_keys('hello selenium')
sleep(1)
self.drive.back()
#find_element_by_css
def Dw_by_css(self):
self.drive.find_element_by_link_text('Form Test').click()
#处理弹框
al=self.drive.switch_to.alert
al.accept()
self.drive.find_element_by_css_selector('body > form > table > tbody > tr:nth-child(3)\
> td:nth-child(2) > input[type=text]').send_keys('hello')
#find_element_by_xpth
def Dw_by_xpth(self):
self.drive.find_element_by_link_text('Form Test').click()
#处理弹框
al=self.drive.switch_to.alert
sleep(1)
al.accept()#/html/body/form/table/tbody/tr[3]/td[2]/input
# self.drive.find_element_by_xpath('/html/body/form/table/tbody/tr[3]/td[2]/input').send_keys('hello')
self.drive.find_element_by_xpath('.//tr[3]/td[2]/input').send_keys('hello')
#find_element_by_clssname
def Dw_by_class(self):
self.drive.find_element_by_link_text('Element On Top Test').click()
sleep(1)
element=self.drive.find_elements_by_class_name('parent')
print(element)
if name=="main":
e=Dwelement()
e.Dw_by_id()
sleep(1)
e.Dw_by_name()
sleep(1)
e.Dw_by_xpth()
e.Dw_by_css()
e.Dw_by_class()
二、selenium之浏览器控制
1.控制浏览器大小
2.浏览器前进、后退、刷新
3.webdriver常用方法和其它方法
from selenium import webdriver
from time import sleep
class Browser(object):
#初始化
def __init__(self):
#实例化浏览器
self.driver=webdriver.Chrome()
#以必应为demo
self.driver.get('https://cn.bing.com/')
def Set_window(self):
#控制浏览器大小 设置宽800像素 高600像素
self.driver.set_window_size(800,600)
#全屏显示
self.driver.maximize_window()
#最小浏览器
self.driver.minimize_window()
def Control(self):
#定位搜索框
s=self.driver.find_element_by_id('sb_form_q')
s.send_keys('自动化测试')
s.submit()#submit()方法用于提交表单。 在搜索框输入关键字之后的“回车” 操作,
# self.driver.find_element_by_id('sb_form_go').click()
#后退
self.driver.back()
#前进
self.driver.forward()
#刷新
self.driver.refresh()
def Other(self):
"""
size;返回元素大小
text:返回元素文本
get_attribute:获得属性值
is_displayed():检测元素是否用户可见
:return:
"""
get_att=self.driver.find_element_by_id('id_a').get_attribute(name='aria-label')
print(get_att)
txt=self.driver.find_element_by_id('id_s').text
print(txt)
if name == 'main':
e=Browser()
# e.Set_window()
# e.Control()
e.Other()
三、selenium之iframe切换
iframe,称为浮动帧标记,可以将一个html文件嵌入到另一个html文件中
常用的方法:
switch_to.frame() 切换到iframe上
switch_to.default_content() 切回到原主页面上
通过定位或者索引进行切换
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
class Iframes(object):
#初始化
def init(self):
self.drive=webdriver.Chrome()
self.drive.get('http://sahitest.com/demo/')
self.drive.maximize_window()
def Frames(self):
#切入第一个frame
self.drive.find_element_by_link_text('Frames Test').click()
sleep(1)
self.drive.switch_to.frame(0)
self.drive.find_element(By.LINK_TEXT,'Link Test').click()
self.drive.switch_to.default_content()
self.drive.switch_to.frame(1)
self.drive.find_element(By.LINK_TEXT,'Link Test').click()
self.drive.quit()
def IFrame(self):
self.drive.find_element(By.LINK_TEXT, "IFrames Test").click()
sleep(1)
self.drive.switch_to.frame(0)
self.drive.find_element(By.LINK_TEXT, "Link Test").click()
self.drive.switch_to.default_content()
self.drive.switch_to.frame(1)
self.drive.find_element(By.LINK_TEXT, "Link Test").click()
if name == 'main':
e=Iframes()
# e.Frames()
e.IFrame()
四、selenium之多标签页切换
current_window_handle:获取当前标签页句柄
window_handles:返回所有标签页句柄
switch_to.window(标签页句柄):切换到对应的标签页
from selenium import webdriver
from time import sleep
class BQ(object):
#初始化 以百度e为demo
def __init__(self):
self.driver=webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
def bq(self):
#点击更多
self.driver.find_element_by_link_text('更多').click()
#当前页面句柄
current_handle=self.driver.current_window_handle
#所有页面句柄
handles=self.driver.window_handles
for handle in handles:
if handle!=current_handle:
#切换句柄
self.driver.switch_to.window(handle)
#搜索框定位
s=self.driver.find_element_by_id('kw')
s.send_keys('python')
s.submit()
if name == 'main':
e=BQ()
e.bq()
五、selenium之鼠标和键盘事件
——————————————————————————
鼠标事件:提供了ActionChains
常用方法:
perform()执行操作;context_click():右击;
double_click():双击;drag_and_drop():拖动;
move to element():鼠标悬停
——————————————————————————
键盘事件:Keys()
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,'c') 复制(Ctrl+C)
......
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
class Ac(object):
#以http://sahitest.com/demo/为demo
def init(self):
#实例化
self.driver=webdriver.Chrome()
self.driver.get('http://sahitest.com/demo/')
self.driver.maximize_window()
#鼠标拖动
def ac_td(self):
#进入该页面
self.driver.find_element_by_link_text('Drag Drop Test').click()
#定位原位置
source=self.driver.find_element_by_id('dragger')
#目标位置
target=self.driver.find_element_by_css_selector('body > div:nth-child(4)')
ActionChains(self.driver).drag_and_drop(source,target).perform()#perform不要忘记
#鼠标悬停
def ac_xt(self):
#进入该页面
self.driver.find_element_by_link_text('Mouse over').click()
#元素定位
lo=self.driver.find_element_by_css_selector('body > a:nth-child(2) > span')
ActionChains(self.driver).move_to_element(lo).perform()
if name == 'main':
e=Ac()
# e.ac_td()
e.ac_xt()
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
class Kb(object):
#以百度demo为例
def init(self):
self.driver=webdriver.Chrome()
self.driver.get('https://www.baidu.com/')
self.driver.maximize_window()
def demo(self):
s=self.driver.find_element_by_id('kw')
s.send_keys('在吗')
#输入一个空格
s.send_keys(Keys.SPACE)
#再次输入
s.send_keys('我在')
#键盘输入回车
s.send_keys(Keys.ENTER)
if name == 'main':
Kb().demo()
六、selenium之其它操作
·下拉框
·警告框处理
·断言
·设置元素等待
·窗口截图
·文件上传
from selenium import webdriver
from time import sleep
import time,os
from selenium.webdriver.support.select import Select
class Othermethed(object):
#http://sahitest.com/demo/为demo
def __init__(self):
self.driver=webdriver.Chrome()
self.driver.get('http://sahitest.com/demo/')
self.driver.maximize_window()
"""
两种类型:显式等待和隐式等待
from selenium.webdriver.support.ui import WebdriverWait
from selemium.webdriver.support import expected_contions as Ec
#默认0.5s 最多等5s
WebDriverWait(driver,5,0.5).util()
"""
#设置元素隐式等待
self.driver.implicitly_wait(10)
def sl(self):
#进入slect页面
self.driver.find_element_by_link_text('Select Test').click()
#下拉框定位
lo=self.driver.find_element_by_id('s1Id')
#选择的方法有多种 value index text
Select(lo).select_by_value('o1')
def al(self):
"""
text:返回信息
accept()接受
dismiss()取消
send_keys()发送文本
:return:
"""
#进入alert页面
self.driver.find_element_by_link_text('Alert Test').click()
#触发alert
self.driver.find_element_by_name('b1').click()
self.driver.switch_to.alert.accept()
def upload(self):
#进入文件上传页面
self.driver.find_element_by_link_text('File Upload Test').click()
#input标签直接send_keys()
self.driver.find_element_by_id('file').send_keys(r'F:\Desktop\hamlet.txt')
self.driver.find_element_by_name('submit').click()
#截图
t=time.time()
path=os.path.dirname(os.path.dirname(__file__))+'\\screenshot'
picture_name=path+"\\"+str(t)+'.png'
self.driver.save_screenshot(picture_name)
if name == 'main':
e=Othermethed()
# e.sl()
# e.al()
e.upload()
总结
以上内容都是基础,在真实的项目上会遇到很多问题,我们可以通过脚本录制等多种方法再次进行元素定位从而解决。