selenium本身是一个自动化测试工具,缺点是慢,优点是获取动态请求的数据比较容易。
Selenium 轻松自动化—selenium-webdriver(python) (一) | selenium中文网 
Selenium提供了8种定位方式: 
id 
name 
class name 
tag name 
link text 
partial link text 
xpath 
css selector 
 
2.定位元素的8种方式
定位一个元素 定位多个元素 含义  
 
find_element_by_id 
find_elements_by_id 
通过元素id定位 
 
find_element_by_name 
find_elements_by_name 
通过元素name定位 
 
find_element_by_xpath 
find_elements_by_xpath 
通过xpath表达式定位 
 
find_element_by_link_text 
find_elements_by_link_tex 
通过完整超链接定位 
 
find_element_by_partial_link_text 
find_elements_by_partial_link_text 
通过部分链接定位 
 
find_element_by_tag_name 
find_elements_by_tag_name 
通过标签定位 
 
find_element_by_class_name 
find_elements_by_class_name 
通过类名进行定位 
 
find_elements_by_css_selector 
find_elements_by_css_selector 
通过css选择器进行定位 
 
 
 
3.实例演示
假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。
1 2 3 4 5 6 7 8 <html >   <head >    <body  link ="#0000cc" >      <a  id ="result_logo"  href ="/"  onmousedown ="return c({'fm':'tab','tab':'logo'})" >      <form  id ="form"  class ="fm"  name ="f"  action ="/s" >        <span  class ="soutu-btn" > </span >          <input  id ="kw"  class ="s_ipt"  name ="wd"  value =""  maxlength ="255"  autocomplete ="off" >  
通过id定位:
1 dr.find_element_by_id("kw" ) 
通过name定位:
1 dr.find_element_by_name("wd" ) 
通过class name定位:
1 dr.find_element_by_class_name("s_ipt" ) 
通过tag name定位:
1 dr.find_element_by_tag_name("input" ) 
通过xpath定位,xpath定位有N种写法,这里列几个常用写法:
1 2 3 4 5 6 7 dr.find_element_by_xpath("//*[@id='kw']" ) dr.find_element_by_xpath("//*[@name='wd']" ) dr.find_element_by_xpath("//input[@class='s_ipt']" ) dr.find_element_by_xpath("/html/body/form/span/input" ) dr.find_element_by_xpath("//span[@class='soutu-btn']/input" ) dr.find_element_by_xpath("//form[@id='form']/span/input" ) dr.find_element_by_xpath("//input[@id='kw' and @name='wd']" ) 
通过css定位,css定位有N种写法,这里列几个常用写法:
1 2 3 4 5 6 dr.find_element_by_css_selector("#kw" ) dr.find_element_by_css_selector("[name=wd]" ) dr.find_element_by_css_selector(".s_ipt" ) dr.find_element_by_css_selector("html > body > form > span > input" ) dr.find_element_by_css_selector("span.soutu-btn> input#kw" ) dr.find_element_by_css_selector("form#form > span > input" ) 
接下来,我们的页面上有一组文本链接。
1 2 <a  class ="mnav"  href ="http://news.baidu.com"  name ="tj_trnews" > 新闻</a > <a  class ="mnav"  href ="http://www.hao123.com"  name ="tj_trhao123" > hao123</a > 
通过link text定位:
1 2 dr.find_element_by_link_text("新闻" ) dr.find_element_by_link_text("hao123" ) 
通过partial link text定位:
1 2 3 dr.find_element_by_partial_link_text("新" ) dr.find_element_by_partial_link_text("hao" ) dr.find_element_by_partial_link_text("123" ) 
Selenium.webdriver模块 1.控制浏览器操作的一些方法 
方法 说明  
 
set_window_size() 
设置浏览器的大小 
 
back() 
控制浏览器后退 
 
forward() 
控制浏览器前进 
 
refresh() 
刷新当前页面 
 
clear() 
清除文本 
 
send_keys (value) 
模拟按键输入 
 
click() 
单击元素 
 
submit() 
用于提交表单 
 
get_attribute(name) 
获取元素属性值 
 
is_displayed() 
设置该元素是否用户可见 
 
size 
返回元素的尺寸 
 
text 
获取元素的文本 
 
 
 
2.鼠标事件 在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。
方法 说明  
 
ActionChains(driver) 
构造ActionChains对象 
 
context_click() 
执行鼠标悬停操作 
 
move_to_element(above) 
右击 
 
double_click() 
双击 
 
drag_and_drop() 
拖动 
 
move_to_element(above) 
执行鼠标悬停操作 
 
context_click() 
用于模拟鼠标右键操作, 在调用时需要指定元素定位 
 
perform() 
执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作 
 
 
 
实例演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 from  selenium import  webdriverfrom  selenium.webdriver.common.action_chains import  ActionChainsdriver = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver" ) driver.get("https://www.baidu.com" ) element= driver.find_element_by_link_text("设置" ) ActionChains(driver).move_to_element(element).perform() elem1=driver.find_element_by_link_text("搜索设置" ) elem1.click() elem2=driver.find_element_by_id("sh_1" ) elem2.click() elem3=driver.find_element_by_class_name("prefpanelgo" ) elem3.click() 
3.键盘事件 Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_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) 
 
send_keys(Keys.CONTROL,‘x’) 
剪切(Ctrl+X) 
 
send_keys(Keys.CONTROL,‘v’) 
粘贴(Ctrl+V) 
 
send_keys(Keys.F1…Fn) 
键盘 F1…Fn 
 
 
 
4.获取断言信息 不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言。
属性 说明  
 
title 
用于获得当前页面的标题 
 
current_url 
用户获得当前页面的URL 
 
text 
获取搜索条目的文本信息 
 
 
 
5.设置元素等待 6.定位一组元素 定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数。
7.多表单切换 在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
方法 说明  
 
switch_to.frame() 
将当前定位的主体切换为frame/iframe表单的内嵌页面中 
 
switch_to.default_content() 
跳回最外层的页面 
 
 
 
switch_to.frame() 默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。
1 2 3 4 5 6 7 8 …… xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]' ) driver.switch_to.frame(xf) …… driver.switch_to.parent_frame() 
8.多窗口切换 在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。
方法 说明  
 
current_window_handle 
获得当前窗口句柄 
 
window_handles 
返回所有窗口的句柄到当前会话 
 
switch_to.window() 
用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。 
 
 
 
实例演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from  selenium import  webdriverimport  timedriver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver" ) driver.implicitly_wait(10 ) driver.get("http://www.baidu.com" ) sreach_windows = driver.current_window_handle driver.find_element_by_link_text('登录' ).click() driver.find_element_by_link_text("立即注册" ).click() all_handles = driver.window_handles for  handle in  all_handles:    if  handle != sreach_windows:         driver.switch_to.window(handle)         print ('跳转到注册窗口' )         driver.find_element_by_name("account" ).send_keys('123456789' )         driver.find_element_by_name('password' ).send_keys('123456789' )         time.sleep(2 )      driver.quit() 
9.警告框处理 在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作。
方法 说明  
 
text 
返回 alert/confirm/prompt 中的文字信息 
 
accept() 
接受现有警告框 
 
dismiss() 
解散现有警告框 
 
send_keys(keysToSend) 
发送文本至警告框。keysToSend:将文本发送至警告框。 
 
 
 
实例演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from  selenium import  webdriverfrom  selenium.webdriver.common.action_chains import  ActionChainsimport  timedriver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver" ) driver.implicitly_wait(10 ) driver.get('http://www.baidu.com' ) link = driver.find_element_by_link_text('设置' ) ActionChains(driver).move_to_element(link).perform() driver.find_element_by_link_text("搜索设置" ).click() time.sleep(2 ) driver.find_element_by_class_name("prefpanelgo" ).click() time.sleep(2 ) driver.switch_to.alert.accept() driver.quit() 
10.下拉框选择操作 导入选择下拉框Select类,使用该类处理下拉框操作。
1 from  selenium.webdriver.support.select import  Select
Select类的方法
方法 说明  
 
select_by_value(“选择值”) 
select标签的value属性的值 
 
select_by_index(“索引值”) 
下拉框的索引 
 
select_by_visible_testx(“文本值”) 
下拉框的文本值 
 
 
 
实例演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from  selenium import  webdriverfrom  selenium.webdriver.support.select import  Selectfrom  time import  sleepdriver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver" ) driver.implicitly_wait(10 ) driver.get('http://www.baidu.com' ) driver.find_element_by_link_text('设置' ).click() sleep(1 ) driver.find_element_by_link_text("搜索设置" ).click() sleep(2 ) sel = driver.find_element_by_xpath("//select[@id='nr']" ) Select(sel).select_by_value('50' )   sleep(3 ) driver.quit() 
11.文件上传 对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传。
通过send_keys()方法来实现文件上传:
1 2 3 4 5 6 7 8 9 10 11 from  selenium import  webdriverimport  osdriver = webdriver.Firefox() file_path = 'file:///'  + os.path.abspath('upfile.html' ) driver.get(file_path) driver.find_element_by_name("file" ).send_keys('D:\\upload_file.txt' ) driver.quit() 
1 2 3 4 5 6 driver.get('<http://www.baidu.com>' ) driver.find_element('css selector' , '.soutu-btn' ).click() time.sleep(3 ) el = driver.find_element('xpath' , '//input[@type="file"]' ) driver.execute_script('arguments[0].style.visibility=\'visible\'' , el) el.send_keys(r'C:\\Users\\muji\\Desktop\\avatar.png' ) 
12.cookie操作 有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息。
WebDriver操作cookie的方法:
方法 说明  
 
get_cookies() 
获得所有cookie信息 
 
get_cookie(name) 
返回字典的key为“name”的cookie信息 
 
add_cookie(cookie_dict) 
添加cookie。“cookie_dict”指字典对象,必须有name 和value 值 
 
delete_cookie(name,optionsString) 
删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域” 
 
delete_all_cookies() 
删除所有cookie信息 
 
 
 
实例演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 from  selenium import  webdriverimport  timebrowser = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver" ) browser.get("http://www.youdao.com" ) print ('=====================================' )print ("打印cookie信息为:" )print (browser.get_cookies)dict ={'name' :"name" ,'value' :'Kaina' }browser.add_cookie(dict ) print ('=====================================' )print ('添加cookie信息为:' )for  cookie in  browser.get_cookies():    print ('%s----%s\n'  %(cookie['name' ],cookie['value' ]))      browser.delete_cookie('name' ) print ('=====================================' )print ('删除一个cookie' )for  cookie in  browser.get_cookies():    print ('%s----%s\n'  %(cookie['name' ],cookie['value' ])) print ('=====================================' )print ('删除所有cookie后:' )browser.delete_all_cookies() for  cookie in  browser.get_cookies():    print ('%s----%s\n'  %(cookie['name' ],cookie['value' ])) time.sleep(3 ) browser.close() 
13.调用JavaScript代码 虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。
用于调整浏览器滚动条位置的JavaScript代码如下:
1 2 <!-- window .scrollTo(左边距,上边距); --> window .scrollTo(0 ,450 );
window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from  selenium import  webdriverfrom  time import  sleepdriver=webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver" ) driver.get("http://www.baidu.com" ) driver.find_element_by_id("kw" ).send_keys("selenium" ) driver.find_element_by_id("su" ).click() sleep(2 ) js="window.scrollTo(100,450);"  driver.execute_script(js) sleep(3 ) driver.close() 
通过浏览器打开百度进行搜索,并且提前通过set_window_size()方法将浏览器窗口设置为固定宽高显示,目的是让窗口出现水平和垂直滚动条。然后通过execute_script()方法执行JavaScripts代码来移动滚动条的位置。
滚动条上下左右滚动代码演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 from  selenium import  webdriverfrom  time import  sleepdriver=webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver" ) driver.set_window_size(400 ,400 ) driver.get("https://www.baidu.com" ) sleep(10 ) js2 = "var q=document.documentElement.scrollLeft=10000"  driver.execute_script(js2) sleep(15 ) js3 = "var q=document.documentElement.scrollLeft=0"  driver.execute_script(js3) sleep(15 ) js = "var q=document.documentElement.scrollTop=10000"  driver.execute_script(js) sleep(15 ) js = "var q=document.documentElement.scrollTop=0"  driver.execute_script(js) sleep(15 ) driver.close() 
14.窗口截图 自动化用例是由程序去执行的,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。WebDriver提供了截图函数get_screenshot_as_file()来截取当前窗口。
截屏方法:
方法 说明  
 
get_screenshot_as_file(self, filename) 
用于截取当前窗口,并把图片保存到本地 
 
 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from  selenium import  webdriverfrom  time import  sleepdriver =webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver" ) driver.get('http://www.baidu.com' ) driver.find_element_by_id('kw' ).send_keys('selenium' ) driver.find_element_by_id('su' ).click() sleep(2 ) driver.get_screenshot_as_file("D:\\baidu_img.jpg" ) driver.quit() 
15.关闭浏览器
在前面的例子中我们一直使用quit()方法,其含义为退出相关的驱动程序和关闭所有窗口。除此之外,WebDriver还提供了close()方法,用来关闭当前窗口。例多窗口的处理,在用例执行的过程中打开了多个窗口,我们想要关闭其中的某个窗口,这时就要用到close()方法进行关闭了。
方法 说明  
 
close() 
关闭单个窗口 
 
quit() 
关闭所有窗口