【Selenium课程】
1、delenium定义:
用程序控制自动化浏览器的一个工具
2、selenium2与selenium3差别:
前者selenium公司自己写的webDriver模块
后者浏览器公司自己出的webDriver模块
3、selenium Grid:
可以在多台机器上同时执行Selenium自动测试
4、selenium IDE使用时机:
(1)利用它来生成自动化脚本的大体流程;
(2)利用Selenium IDE里面的按钮帮助定位元素;
5、查找元素一般分两种:
webDriver—全html中查找
webElement-范围中查找
6、html
html DOM(页面渲染引擎或叫浏览器内核)
DOM是W3C制定的标准,由一个个的node(节点)组成<a>称作一个element(元素)
CSS
W3C的CSS是定义html页面样式的语言,决定元素显示的效果
xpath
在xml文档中选择node(节点)
7、通过属性查找:
id(唯一标识)-
driver.find_element_by_id('值')
获得属性的值:ele.print(ele.get_attribute('href'))
name-
driver.find_element_by_name('值')【返第一个namewebelement对象】
driver.find_elements_by_name('值')【返所有符合对象list】
class-
driver.find_element_by_class_name('值')【返第一个namewebelement对象】
driver.find_elements_by_class_name('值')【返所有符合对象list】
tag-
driver.find_element_by_tag_name(‘元素头')【返第一个namewebelement对象】
driver.find_elements_by_tag_name('元素头')【返所有符合对象list】
链接文本-
driver.find_element_by_link_text(u"值")【匹配查找】
driver.find_elements_by_partial_link_text(u"值")【关键字查找】
8、通过css查找:
driver.find_element_by_css_selector("css elector")
["css elector"="#id值 元素排头.class值"]
(1)根据tag名字
p{color:red;}
(2)根据id,id=‘food’元素
#food{color:red;}
(3)根据class,class=‘vegetable’
.vegetable{color:red;}
(4)根据tag名和class组合写(如果多个)
span.vegetable{color:red;}
[span.vegetable]查找span中,class=‘vegetable’的元素
[span .vegetable]查找span下,子元素tag名中class=‘vegetable’的元素
span.vegetabale#ok 查找span,class=‘vegetabale’且id = ‘ok’的元素
(5)后代元素与子元素
【li em】-tag包li下的tag包名em(隔很多代用空格)
【li>em】-tag包li下一级的tag报名em(隔一代用>)
查找-不好找的CSS elector,打开F12选中元素,鼠标右键copy=>copy seletor
测试-F12切换console界面,输入$$("css elector")
(6)组(group)选择
[1]组选择同时选择多个元素,逗号隔开
语法<s1>,<s2>(lg:#food,.cheese)
[2]组合使用
选择id为food的所有span子元素和所有的p(包含非food的子元素)
#food >span,p
选择id为food的所有span子元素和所有的p子元素
#food >span,#food>p
选择id为food的所有子元素
#food >*
(7)兄弟元素选择
选择紧接在另一个元素后的元素,二者有相同的父元素
#food + div(获取后面的兄弟元素)
#food +div+p(获取后面的后面的兄弟元素)
#food > div >p.special + p(选择在另一个元素后的元素,二者有相同的父元素)
#food ~ div(获取后面的兄弟,不管第几个兄弟)
(8)属性选择
可以根据元素的属性及属性值来选择元素
*[style]
p[spec=len2]
p[spec='len2 len3']
p[spec*='len2']#包含
p[spec^='len2']#开头结尾
p[spec$='len2']#以什么什么结尾
p[class=special][name=p1]#同时满足多个属性值
(9)伪类
#food>p:nth-child(n)[注意n为tag包food名下第几个元素]
#food>p:nth-of-type(n)[注意n为tag包food名下第几个p元件元素]
(10)找到一个输入框,清楚默认的提示文字
webelement.clear()
webelement.text(text两个标签中的文本)
9、通过Xpath查找:
Xpath(XML Path Language)
(1)和css一样,xpath也有通配符*
//div/* 选择div下面所有的元素
等价与css $$('div > *')
(2)根据属性选择
//*[@style] 选择所有元素类型下的属性
//*[@id = 'food']
//p[@style]选择p元素类型下的属性
(3)子元素选择器
//div[@style]/p[2]选择老王的第二个女儿娶
选择属于其父元素的第N个某个类型的子元素
//*[@style]/p[1]等价于#food >p:nth-of-style(1)
选择属于其父元素的倒数第N个某个类型的子
//span[last()-1] 属于其父元素的倒数第二个span【注释:下标是从1开始的】
//*[@id="food"]/span[last()]
//*[last()-1] 所有元素中倒数第二个子元素
(4)现在只能选择前几个或后几个,不能选区域
//select/*[position()=2]现在第二个元素
//select/*[position()>=2]第二个及其后面的元素
//select/*[position()=last()]最后一个元素
(5)循环选择元素
xpath = “//select/*[%s]”%i,将position()值设定为一个变量,利用循环可实现选中带入奇偶个元素
(6)组选择
用多个表达式一起css用,隔开比如:p,button
xpath用|隔开,比如//p|//button
(7)兄弟节点
//div[@id="food"]/following-sibling::div————相当与css中的#food ~ div
//div[@id="food"]/following-sibling::div[2]————相邻的第二个
(8)查找拥有id元素上一级元素的内容]
ele = driver.find_element_by_xpath("//span[@id='beff']/..")
print(ele.text.split('#')[1])
//..//..上级的上级
(9)不适用与webelement里寻找规则
webelement.find_element_by_xpath('//p')——依旧是全局查找
webelement.find_element_by_xpath('./p')——webelement下寻找
(10)某个元素的值等于什么什么
/tr[contains(@id,'ticket')]
10、通过Javascript查找:
kw = driver.execute_script("return $('kw')[0]")
kw.send_keys(u'松勤\n')
11、web元素操作:
(1)innerText-DOM节点的属性
element = driver.find_element_by_id("div1")
print()element.text)
(2)编辑框输入字符
ele.send_keys(u'值')
(3)等待web元素的出现
方法1、
import time
time.wait(1)
方法2、显式
方法3、隐式
[参考书本146页]
(4)单选框
webelement = driver.find_element_by_css_selector(''input[value=male]")
webelement.click()
(5)多选框
webelement.is_selected()——返回值为true或false,以此来判定是否选中
(6)复选框
from selenium.webdriver.support.ui import Select——导入select类
select = Select(driver.find_element_by_id(''multi))——实例化webelement对象,具有对应方法
select.deselect_all()——取消所有选中
select.select_by_visibnle_text('雅阁')——选中雅阁
select.deselect_by_visibnle_text('雅阁')——取消选中雅阁
[参看书本147~150页]
(7)点击按钮、链接
driver.find_element_by_id("submit").click()
(7)获取当前窗口title
driver.title
(8)获取当前窗口的地址栏url地址
driver.current_url
(9)关闭当前窗口
driver.close()
driver.quit()-关闭web浏览器和webdriver
(10)截屏
*driver.get_screenshot_as_file("d:/ssl.png")——有路径保存在对应路径下,无路径保存在当前目录下
*webelement找到对应的元素,然后再进行
webelement.screenshot('button.png')
(11)获取tag对应的属性值
job.get_attribute('class')[job为对应的namewebelement对象]
(12)切换webdriver控制的窗口
循环遍历driver.window_handles
driver.switch_to.window(handle)方法切入新窗口
检查该窗口特点,是否为要切入的那个
main_handle = driver.current_window_handle 记录初始网页界面,方便后续切回
(13)close方法
close关闭的一个窗口,quit关闭浏览器
1、在frame、iframe里面操作:
driver.swithch_to.frame('baidu')【进】(id与name或索引数值0等)
driver.swithch_to.default_conteent()【出】
2、在window之间切换:
[参看书本153~154页]
3、等待元素出现:
隐式等待-driver.implicitly_wait(10)【注:全局调用,找不到每隔0.5s会再次找一次】
driver.implicitly_wait(60)
ele1 = driver.find_element_by_id('1')
driver.implicitly_wait(10)
现式等待-
4、console中搜索
$$——css的搜索
$x——xpath的搜索
抄袭别人总结的键盘按钮
send_keys(Keys.BACK_SPACE) 删除键
send_keys(Keys.SPACE) 空格键
send_keys(Keys.TAB) 制表键
send_keys(Keys.ESPACE) 回退键
send_keys(Keys.ENTER) 回车键
send_keys(Keys.CONTROL,'a') 全选
send_keys(Keys.CONTROL,'c') 复制
send_keys(Keys.CONTROL,'x') 剪切
send_keys(Keys.CONTROL,'v') 粘贴
send_keys(Keys.F1)
1、对话框
(1)driver.switch_to.alert.accept()——alert对话框——切换到对应对话框界面,仅包含确定(F12定位不到)
(2)driver.switch_to.alert.dismiss()——confirm对话框——点击取消
(3)driver.switch_to.alert.send_keys('dsgfs')——prompt对话框——相对向前多了输入框
(4)——其他按钮对话框——
(5)driver.switch_to.alert.text——读取对话框中的提示信息
(6)driver.switch_to.alert.clear()——无该中方法
(7)F12-console中输入:setTimeout(function(){debugger},3000)来实现临时冻结会消失的tips
(8)最后一次作业解决鼠标悬停,网上查找
2、上传文件的操作
(1)练习网站(https://tinypng.com)
(2)安装使用
pip install pypiwin32
import win32com.client
shell = win32com.clint.Dispatch("wScript.Shell")
(3)刷新、前往、后退
driver.refresh()
driver.forward()
driver.back()
1、dos界面批量关闭进程
taskkill /?
taskkill /f /im chromedriver.exe
2、
try:
a
except:#异常后执行
print(traceback.format_exc())#打印对象信息finally:#无论是否异常,均会执行
driver.quit()
3、特殊动作,鼠标选中元素,可执行其他操作
ac = ActionChains(driver)
ac1 = ac.click(t1)
ac2 = ac1.send_keys('1').click(t2).send_keys('2').click(t3).perform#调用会返回本身
4、页面元素不可见——改变窗口大小、移window动界面
size = driver.get_window_size()
driver.set_window_size(800,size['height'])
driver.maximize_window()
(conslose界面模拟js代码移动操作)window.scrollBy(0,5000)
searchbox = driver.find _element_by_tag_name('id')
for i in range(10):
driver.execute_script('window.scrollBy(0,220)')
time.sleep(0.5)
searchbox.send_keys('你好啊\n')
5、前端代码动态
6、合理使用半自动化
(1)图形界面自动化的难度是比较大的:模拟难、检查难
(2)用半自动化的方法:
难自动化的操作,都提示(beep)让人去做
import winsound
winsound.Beep(1500,3000)声音频率、声音时间
其余部分:自动化 去做
自动化的目的-提高测试效率