赞
踩
让有意义的事情变的有意思,让有意思的事情变的有意义。
自动化测试是指通过自动化测试工具或其他手段,按照测试人员的测试计划进行自动测试,目的是减轻手工测试的工作量。
1.为python安装selenium模块:pip install selenium
2.下载相应浏览器驱动:Chromedriver;Firefoxdriver
一、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()
以上内容都是基础,在真实的项目上会遇到很多问题,我们可以通过脚本录制等多种方法再次进行元素定位从而解决。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。