1.selenium1与selenium2的区别
Selenium1(selenium remote control,简称Selenium RC)具体流程:
Selenium2:
https://www.jianshu.com/p/226d655426c6
https://blog.csdn.net/Yve_Mei/article/details/46530661
2.selenium2主要组成?
Selenium本身并不是一个单独的工具,它包含IDE、Gird、Webdriver等几个部分
3.分层自动化
分层的自动化测试:UI、Service、Unit
分层自动化测试倡导的是从黑盒(UI)单层到黑白盒多层的自动化测试体系,从全面黑盒自动化测试到对系统的不同层次进行自动化测试。
在金字塔中每一层测试的投入比例则要根据实际的产品特征来划分。在《google测试之道》一书中提到,google对产品测试类型划分为:小测试、中测试和大测试,采用70%/20%/10%的比例,大体对应测试金字塔中的Unit,Service和UI层。
4.前端工具介绍:
FireBug在2017年已经停止更新了,需要调试html/css等可以使用FireFox dev tools
5.WebDriver
WebDriver属于Selenium体系中设计出来操作浏览器的一套API
6.selenium几种定位方式
①Id定位:
find_element_by_id(“kw”)
HTML规定id属性在HTML文档中必须是唯一的。
②name定位:
find_element_by_name(“wd”)
Name的属性值,在当前页面中可以不唯一
③class定位:
find_element_by_class_name(“s_ipt”)
HTML规定class来指定元素的类名。
④tag定位:
find_element_by_tag_name(“input”)
一个tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。
⑤link定位:
find_element_by_link_text(“新闻”)
专门用来定位文本链接
⑥partial link定位:
find_element_by_partial_link_text(“一个很长的”)
取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接。
注:在实际项目中,有时候一个元素并没有id , name属性,或者页面上多个元素的id和name属性值相同,又或者每一次刷新页面,id值都会随机变化。
⑦XPath定位
绝对路径定位:find_element_by_xpath(“/html/body/div/div[2]/div/div/div/from/span/input”)
用标签名的层级关系来定位元素的绝对路径,最外层为html语言。Div[2]表示当前层级下的第二个div标签。
利用元素属性定位:find_element_by_xpath(“//input[@id=’kw’]”)
//表示当前页面某个目录下,input表示定位元素的标签名,[@id=’kw’]表示这个元素的id属性值等于kw。
如果不想指定标签名,则也可以用星号(*)代替。
层级与属性结合:find_element_by_xpath(“//span[@class=’bgs_ipt_wr’]/input”)
如果一个元素本身没有可以唯一表示这个元素的属性值,那么我们可以找其上一级元素,如果它的上一级元素有可以唯一标识属性的值,也可以拿来使用。
使用逻辑运算符:find_element_by_xpath(“//input[@id=’kw’ and @class=’su’]/span/input”)
一个属性不能唯一地区分一个元素,我们还可以使用逻辑运算符连接多个属性来查找元素。
⑧CSS定位
选择器 | 例子 | 描述 |
.class | .intro | Class选择器,选择class=”intro”的所有元素 |
#id | #firstname | Id选择器,选择id=”firstname”的所有元素 |
* | * | 选择所有元素 |
element | p | 元素所有<p>元素 |
element>element | div>input | 选择父元素为<div>的所有<input>元素 |
element+element | div+input | 选择同一级中紧接在<div>元素之后的所有<input>元素 |
[attribute=value] | [target=_blank] | 选择target=”_blank”的所有元素 |
通过class属性定位:find_element_by_css_selector(“.s_ipt”)
通过id属性定位:find_element_by_css_selector(“#kw”)
通过标签名:find_element_by_css_selector(“input”)
通过父子关系定位:find_element_by_css_selector(“span>input”)
通过属性定位:find_element_by_css_selector(“autocomplete=off”)
组合定位:find_element_by_css_selector(“span.bg s_ipt_wr>input.s_ipt”)
⑨用By定位元素
使用之前需要将By类导入:from seleniuim.webdriver.common.by import By
7.控制浏览器
控制浏览器窗口大小:set_window_size()
Maximize_window()
控制浏览器后退、前进:back()、forward()
模拟浏览器刷新:refresh()
简单元素操作:clear() 清除文本
send_keys(*value) 模拟按键输入
click() 单击元素
WebElement接口常用方法:
submit() 提交表单
size 返回元素的尺寸
text 获取元素的文本
get_attribute(name) 获得属性值
is_displayed() 设置该元素是否用户可见
鼠标事件:
actionChains提供了鼠标操作的常用方法:
perform() 执行所有ActionChains中存储的行为
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停
键盘事件:
keys()类提供了键盘上几乎所有按键的方法
send_keys(Keys.BACK_SPACE) 删除键
send_keys(Keys.SPACE) 空格键
send_keys(Keys.TAB) 制表键
send_keys(Keys.ESCAPE) 回退键
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) 键盘F1
获得验证信息:
title 用于获得当前页面的标题
current_url 用户获得当前页面的URL
设置元素等待:
显式等待
WebDriverWait(driver,5,0.5).until(expected_conditions.presence_of_element_located((By.ID),”kw”))
显式等待使WebDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常
隐式等待
implicitly._wait()
隐式等待是通过一定的时长等待页面上某元素加载完成。
sleep休眠方法
sleep()
固定时间的休眠
定位一组元素:
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elemetns_by_xpath()
find_elements_by_css_selector()
一般用于以下场景:
-批量操作元素,例如勾选页面上所有的复选框
-先获取一组元素,再从这组对象中过滤出需要操作的元素。例如定位出页面上所有的checkbox,然后选择其中的一个选择操作。
多表单切换:
switch_to.frame()
默认可以直接取表单的id或name属性。
#切换到iframe(id=”if”)
driver.switch_to.frame(“if”)
如果iframe没有可用的Id和name属性,可以这样:
xf=driver.find_element_by_xpath(‘//*[@class=”if”]’)
driver.switch_to.frame(xf)
switch_to.parent_content()跳出当前一级表单
switch_to.default_content()跳回最外层的页面
多窗口切换:
switch_to_window()
current_window_handle 获得当前窗口句柄
window_handles 获得当前所有打开的窗口的句柄
警告框处理:
switch_to_alert() 定位到alert/confirm/prompt
text 返回alert/confirm/prompt中的文字信息
accept() 接受现有警告框
dismiss() 解散现有警告框
send_keys(keysToSend) 发送文本至警告框
上传文件:
send_keys实现上传,这样可以避免操作windows控件
driver.find_element_by_name(“file”).send_keys(‘D:\\upload_file.txt’)
AutoIt实现上传
下载文件:
火狐浏览器通过FirefoxPorfile()对其做一些设置。
不同浏览器设置方法会有所不同。通用的方法还是借助AutoIt来操作windows控件进行下载。
操作cookie:
get_cookies()
get_cookie(name)
add_cookie(cookie_dict)
delete_cookie(name,optionsString)
delete_all_cookies()
调用JavaScript:
#通过javascript设置浏览器窗口的滚动条位置
js=”window.scrollTo(100,450);”
driver.execute_script(js)
处理HTML5的视频播放:
video=driver.find_element_by_xpath(“body/Setion[1]/div/video”)
url=driver.execute_script(“return arguments[0].currentSrc;”,video) 返回播放地址
driver.execute_script(“return arguments[0].play()”,video) 播放视频
driver.execute_script(“arguments[0].pause()”,video) 暂停视频
窗口截图:
如:driver.get_screenshot_as_file(“D:\\pyse\\baidu_img.jpg”)
关闭窗口:
quit() 退出相关的驱动程序和关闭所有窗口
close() 关闭当前窗口
验证码的处理:
让开发去掉验证码;
设置万能验证码;
验证码识别技术;
记录cookie,可以用get_cookies()方法获取登录的所有的cookie信息,从中找到用户名和密码的key;再通过add_cookie()方法将用户名和密码写入浏览器cookie