selenium(python)自动化测试入门二(webdriver API)
Python webdriver API
1. 浏览器的操作
1.1 浏览器最大化
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
print("浏览器最大化")
driver.maximize_window() #将浏览器最大化显示
1.2 设置浏览器宽、高
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://m.mail.10086.cn")
#参数数字为像素点
print("设置浏览器宽480、高800显示")
driver.set_window_size(480, 800)
driver.quit()
1.3 控制浏览器前进、后退
#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
#访问百度首页
first_url= 'http://www.baidu.com'
print("now access %s" %(first_url))
driver.get(first_url)
#访问新闻页面
second_url='http://news.baidu.com'
print("now access %s" %(second_url))
driver.get(second_url)
#返回(后退)到百度首页
print("back to %s "%(first_url))
driver.back()
#前进到新闻页
print("forward to %s"%(second_url))
driver.forward()
driver.quit()
2. 简单对象定位
常见的元素定位方法有一下几种:
序号 | 定位方式 | webdriver中方法 |
---|---|---|
1 | id | find_element_by_id() |
2 | name | find_element_by_name() |
3 | class name | find_element_by_class_name() |
4 | tag name | find_element_by_tag_name() |
5 | link text | find_element_by_tag_name() |
6 | partial link text | find_element_by_partial_link_text() |
7 | xpath | find_element_by_xpath() |
8 | css selector | find_element_by_css_selector() |
2.1 id和name定位
id和name是最常用的定位方式,页面中大多数元素都有这两个属性,而且在对控件的id和name命名时一般使其有意义也会取不同的名字,通过这两个属性使我们找页面上的属性变得相对容易
<input id="gs_htif0" class="gsfi" aria-hidden="true" dir="ltr">
<input type="submit" name="btnK" jsaction="sf.chk" value="Google 搜索">
<input type="submit" name="btnI" jsaction="sf.lck" value=" 手气不错 ">
通过id定位
find_element_by_id("gs_htif0")
通过name定位
find_element_by_name("btnK")
find_element_by_name("btnI")
2.2 tag name和class name定位
不是所有的前端开发人员都喜欢为每一个元素添加id和name两个属性,但除此之外你一定发现了一个元素不单单只有id和name属性,它还有class属性,而且每个元素都会标签
<div id="searchform" class="jhp_big" style="margin-top:-2px">
<form id="tsf" onsubmit="return name="f" method="GET" action="/search">
<input id="kw" class="s_ipt" type="text" name="wd" autocomplete="off">
通过class属性对元素进行定位
find_element_by_class_name("jhp_big")
通过tag标签名对元素进行定位
find_element_by_tag_name("div")
find_element_by_tag_name("form")
find_element_by_tag_name("input")
**注意:tag name 定位方式应该是所有定位方式中最不靠谱的一种了,在一个页面中具有相同tag name的元素及其容易出现
2.2 link text和partial link text定位
当需要操作的元素是一个文字链接时,我们可以通过link text和partial link text进行元素定位
<a href="http://news.baidu.com" name="tj_news">新 闻</a>
<a href="http://tieba.baidu.com" name="tj_tieba">贴 吧</a>
<a href="http://zhidao.baidu.com" name="tj_zhidao">一个很长的文字连接</a>
通过link text定位元素
find_element_by_link_text("新闻")
find_element_by_link_text("贴吧")
find_element_by_link_text("一个很长的文字链接")
通过partial link text定位元素
find_element_by_partial_link_text("新")
find_element_by_partial_link_text("贴")
find_element_by_partial_link_text("一个很长的")
2.3 XPath定位
<html class="w3c">
<body>
<div class="page-wrap">
<div id="hd" name="q">
<form target="_self" action="http://www.so.com/s">
<span id="input-container">
<input id="input" type="text" x-webkit-speech="" autocomplete="off" suggestwidth="501px" >
</span>
</form>
</div>
</div>
</body>
使用绝对路径定位
find_element_by_xpth(" /html/body/div[2]/form/span/input")
使用相对路径定位
find_element_by_xpath(" //input[@id='input'] ") #通过自身的 id 属性定位
find_element_by_xpath(" //span[@id='input-container']/input") #通过上一级目录的id属性定位
find_element_by_xpath(" //div[@id='hd']/form/span/input") #通过上三级目录的 id 属性定位
find_element_by_xpath(" //div[@name='q']/form/span/input")#通过上三级目录的 name 属性定位
xpath缺点:
性能差
代码不够健壮
兼容性不好
2.4 css selector定位
css选择器常见语法
选择器 | 含义 |
---|---|
* | 通用元素选择器,匹配任何元素 |
E | 标签选择器,匹配所有使用 E 标签的元素 |
.info | class 选择器,匹配所有 class 属性中包含 info 的元素 |
#footer | id 选择器,匹配所有 id 属性等于 footer 的元素 |
E,F | 多元素选择器,同时匹配所有 E 元素或 F 元素,E 和 F 之间用逗号分隔 |
E F | 后代元素选择器,匹配所有属于 E 元素后代的F元素,E和F 之间用空格分隔 |
E>F | 子元素选择器,匹配所有 E元素的子元素 F |
E+F | 毗邻元素选择器,匹配紧随 E 元素之后的同级元素 F (只匹配第一个) |
E~F | 同级元素选择器,匹配所有在 E 元素之后的同级 F 元素 |
E[att='val'] | 属性 att 的值为 val 的 E 元素 (区分大小写) |
E[att^='val'] | 属性 att 的值以 val 开头的 E 元素 (区分大小写) |
E[att$='val'] | 属性 att 的值以 val 结尾的 E 元素 (区分大小写) |
E[att*='val'] | 属性 att 的值包含 val 的 E 元素 (区分大小写) |
E[att1='v1'][att2*='v2'] | 属性 att1 的值为 v1,att2 的值包含 v2 (区分大小写) |
E:contains('xxxx') | 内容中包含 xxxx 的 E 元素 |
E:not(s) | 配不符合当前选择器的任何元素 |
3.操作测试对象
webdriver常用的操作元素的方法
- clear 清除文本框元素的内容
- send_keys 在元素上模拟按键输入
- click 单击元素
- submit 提交表单
from selenium import webdriver
import time
driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
time.sleep(3)
# 定位元素
el = driver.find_element_by_id('kw')
print(el)
print(type(el))
# 向输入框中输入数据
el.send_keys("selenium")
# 定位按钮之后点击操作
el = driver.find_element_by_id('su')
el.click()
time.sleep(5)
driver.close()
3.1 WebElement接口常用方法
- size 返回元素的尺寸
# 返回百度输入框的宽高
size=driver.find_element_by_id("kw").size
print(size)
- text 获取元素的文本
# 返回百度页面底部备案信息
text=driver.find_element_by_id("cp").text
print(text)
- get_attribute(name) 获取属性值
#返回元素的属性值,可以是 id、name、type 或元素拥有的其它任意属性
attribute=driver.find_element_by_id("kw").get_attribute('type')
print(attribute)
- is_displayed 设置该元素是否用户可见
#返回元素的结果是否可见,返回结果为 True 或 False
result=driver.find_element_by_id("kw").is_displayed()
print(result)
4.鼠标事件
ActionChains类常用的鼠标操作方法
- context_click() 右击
- double_click() 双击
- drag_and_drop() 拖动
- move_to_element() 鼠标悬停在一个元素上
- click_and_hold() 按下鼠标左键在一个元素上
鼠标右击操作
'''
百度log右击
'''
from selenium import webdriver
# 导入动作链类
from selenium.webdriver import ActionChains
driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
el_log = driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/div[1]/map/area")
# 鼠标右击操作,操作之前,需要将操作的元素定位出来传入相应的动作中,如果要执行需要添加perform方法
ActionChains(driver).context_click(el_log).perform()
perform() 执行所有ActionChains中存储的行为
鼠标双击
from selenium import webdriver
# 导入动作链类
from selenium.webdriver import ActionChains
driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
el_log = driver.find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/div[1]/map/area")
# 鼠标右击操作,操作之前,需要将操作的元素定位出来传入相应的动作中,如果要执行需要添加perform方法
ActionChains(driver).double_click(el_log).perform()
鼠标拖放操作
- drag_and_drop(source, target)
在源元素上按下鼠标左键,然后移动到目标元素上释放。
source: 鼠标按下的源元素。
target: 鼠标释放的目标元素。
#引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位元素的原位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("xxx")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
- 鼠标移动到元素上
#引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位到鼠标移动到上面的元素
above = driver.find_element_by_xpath("xxx")
#对定位到的元素执行鼠标移动到上面的操作
ActionChains(driver).move_to_element(above).perform()
- 按下鼠标左键
#引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位到鼠标按下左键的元素
left=driver.find_element_by_xpath("xxx")
#对定位到的元素执行鼠标左键按下的操作
ActionChains(driver).click_and_hold(left).perform()
5.键盘事件
#coding=utf-8
from selenium import webdriver
#引入 Keys 类包
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
#删除多输入的一个 m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(3)
#输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
time.sleep(3)
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
#输入框重新输入内容,搜索
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
time.sleep(3)
#通过回车键盘来代替点击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()
6.打印事件
7.设置等待时间
为保证脚本运行稳定,需要设置等待时间 sleep():设置固定休眠时间 implicitly_wait():是webdriver提供的一个超时等待。隐式的等待一个元素被发现,或一个命令完成,如果超时则抛出异常。 webDriveWait():同样也是webdriver提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在
- 显示等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
'''
WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,
默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。
'''
WebDriverWait(driver, 10, poll_frequency=0.5, ignored_exceptions=None).until(EC.presence_of_element_located((By.ID, 's_mp')))
- 隐式等待
from selenium import webdriver
driver = webdriver.Firefox()
url = "https://www.amazon.cn"
driver.get(url)
# 隐式等待 传入等待时间 单位秒
driver.implicitly_wait(20)
driver.close()
'''
优先 隐式等待 次之 显式等待 最次 固定等待
'''
- sleep()
import time
time.sleep(6)
8.定位一组元素
find_elements_by_xx(‘xx’) find_elements 用于获取一组元素
9.层级定位
10.定位frame中的对象
from selenium import webdriver
import time
driver = webdriver.Firefox()
url = "http://126.com/"
driver.get(url)
time.sleep(4)
el_switch = driver.find_element_by_id("lbNormal")
el_switch.click()
# 定位到表单//*[@id="x-URS-iframe1564843083326.9932"]
# el_frame = driver.find_element_by_css_selector("#x-URS-iframe")
el_frame = driver.find_element_by_tag_name("iframe")
# 切换进入表单中000
driver.switch_to.frame(el_frame)
# 账号输入框
el_user = driver.find_element_by_name("email")
el_user.send_keys("hahha")
time.sleep(6)
driver.quit()
11.对话框处理
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")
#点击登录链接
driver.find_element_by_name("tj_login").click()
#通过二次定位找到用户名输入框
div=driver.find_element_by_class_name("tang-content").find_element_by_name("userName")
div.send_keys("username")
#输入登录密码
driver.find_element_by_name("password").send_keys("password")
#点击登录
driver.find_element_by_id("TANGRAM__PSP_10__submit").click()
driver.quit()
12.浏览器多窗口处理
#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")
#获得当前窗口
nowhandle=driver.current_window_handle
#打开注册新窗口
driver.find_element_by_name("tj_reg").click()
#获得所有窗口
allhandles=driver.window_handles
#循环判断窗口是否为当前窗口
for handle in allhandles:
if handle != nowhandle:
driver.switch_to_window(handle)
print 'now register window!'
#切换到邮箱注册标签
driver.find_element_by_id("mailRegTab").click()
time.sleep(5)
driver.close()
#回到原先的窗口
driver.switch_to_window(nowhandle)
driver.find_element_by_id("kw").send_keys(u"注册成功!")
time.sleep(3)
driver.quit()
13.alert/confirm/prompt处理
#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")
#点击打开搜索设置
driver.find_element_by_name("tj_setting").click()
driver.find_element_by_id("SL_1").click()
#点击保存设置
driver.find_element_by_xpath("//div[@id='gxszButton']/input").click()
#获取网页上的警告信息
alert=driver.switch_to_alert()
#接收警告信息
alert.accept()
dirver.quit()
14.下拉框处理
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
time.sleep(3)
el_settings = driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(el_settings).perform()
time.sleep(2)
el_search = driver.find_element_by_css_selector(".setpref")
el_search.click()
# 获取下拉框元素
el_select = driver.find_element_by_id("nr")
# 创建下拉框对象
selobj = Select(el_select)
# 通过选项索引进行选择
selobj.select_by_index(0)
time.sleep(1)
selobj.select_by_index(1)
time.sleep(1)
# 通过value值进行选择
selobj.select_by_value("50")
time.sleep(1)
selobj.select_by_value("20")
time.sleep(1)
selobj.select_by_value("10")
time.sleep(1)
# 通过可见文本进行选择
selobj.select_by_visible_text("每页显示50条")
time.sleep(1)
selobj.select_by_visible_text("每页显示20条")
time.sleep(1)
selobj.select_by_visible_text("每页显示10条")
time.sleep(1)
# 打印第一个选中的值
print(selobj.first_selected_option)
print(dir(selobj.first_selected_option))
print(selobj.first_selected_option.text)
el_save = driver.find_element_by_css_selector("#gxszButton > a.prefpanelgo")
el_save.click()
time.sleep(2)
# 进入警告框中,并且接受
driver.switch_to.alert.accept()
# driver.switch_to.alert.dismiss()
15.分页处理
16.上传文件
upload_file.html
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>upload_file</title>
<script type="text/javascript" async=""
src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css"
rel="stylesheet" />
<script type="text/javascript">
</script>
</head>
<body>
<div class="row-fluid">
<div class="span6 well">
<h3>upload_file</h3>
<input type="file" name="file" />
</div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>
操作上传脚本
#coding=utf-8
from selenium import webdriver
import os,time
driver = webdriver.Firefox()
#打开上传文件页面
file_path = 'file:///' + os.path.abspath('upload_file.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\selenium_use_case\upload
_file.txt')
time.sleep(2)
driver.quit()
17.调用JavaScript
js.html
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>js</title>
<script type="text/javascript" async=""
src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css"
rel="stylesheet" />
<script type="text/javascript">
$(document).ready(function(){
$('#tooltip').tooltip({"placement": "right"});
});
</script>
</head>
<body>
<h3>js</h3>
<div class="row-fluid">
<div class="span6 well">
<a id="tooltip" href="#" data-toggle="tooltip" title=" selenium-webdriver(python)">hover to see
tooltip</a>
<a class="btn">Button</a>
</div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>
#coding=utf-8
from selenium import webdriver
import time,os
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('js.html')
driver.get(file_path)
#######通过 JS 隐藏选中的元素##########第一种方法:
#隐藏文字信息
driver.execute_script('$("#tooltip").fadeOut();')
time.sleep(5)
#隐藏按钮:
button = driver.find_element_by_class_name('btn')
driver.execute_script('$(arguments[0]).fadeOut()',button)
time.sleep(5)
driver.quit()
18.控制浏览器滚动条
from selenium import webdriver
import time
driver = webdriver.Firefox()
url = "https://www.hao123.com"
driver.get(url)
time.sleep(3)
# 执行JS
js = "window.scrollTo(0,10) "
driver.execute_script(js)
# 循环下拉
for i in range(100):
js = "window.scrollTo(0,%s) "%(i * 100)
driver.execute_script(js)
time.sleep(0.5)
19.cookie处理
webdriver操作cookie的方法有:
- get_cookies() 获取所有cookie信息
- get_cookie(name) 获取特定name有cookie信息
- add_cokkie(cookie_dict) 添加cookie,必须有name和value值
- delete_cookie(name) 删除特定的cookie
- delete_all_cookies() 删除所有cookie信息
from selenium import webdriver
driver = webdriver.Firefox()
url = "http://www.youdao.com/"
driver.get(url)
# 获取cookies
data = driver.get_cookies()
print(data)
# 删除所有cookies
driver.delete_all_cookies()
# 设置cookies
cookie = {"name": "dyc", "value": "1111"}
driver.add_cookie(cookie)
data1 = driver.get_cookies()
print(data1)
20.验证码问题
处理验证码的几种方法:
- 去掉验证码
- 设置万能码(推荐)
- 验证码识别技术
- 设置cookie