Webdriver API
web页面都是都是由不同的元素组成的,自动化测试需要完成的是模拟鼠标和键盘来操作这些元素,或单击、或输入、或鼠标悬停等。
操作这个元素的前提是需要找到他们,webdriver就是通过页面上的元素的标签名和属性值来找到不同的元素的,webdriver提供了多种元素定位的方法
### (1)对象定位
对象定位
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
time.sleep(2)
#通过id定位方式定位
driver.find_element_by_id("kw").send_keys("中兴通讯")
#通过name方式定位
driver.find_element_by_name("wd").send_keys("西安古城")
#通过tag name方式定位 ,tag识别某个元素的概率很低
#driver.find_element_by_tag_name("input").send_keys("软件测试")
#通过link定位链接
find_element_by_link_text("hao123")
#通过class name方式定位
driver.find_element_by_class_name("s_ipt").send_keys("softtest")
#通过CSS方式定位
driver.find_element_by_css_selector("#kw").send_keys("selenium")
#通过xpath方式定位(//:查找页面根元素、//input:查找页面上所有的input元素)
driver.find_element_by_xpath("//input[@id='kw']").send_keys("5G")
#使用逻辑运算符,"and"连接两个条件来一起定位
driver.find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
(2)实践练习——实现批量选择checkbox
#定位对象findElements
#场景:批量操作对象,将页面上的所有checkbox都勾上
#前提是checkbox.html和test_1.py在同一路径下
#-*- coding:utf-8 -*-
from selenium import webdriver
import time
import os
dr = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('checkbox.html')
dr.get(file_path)
#选择页面上所有的input,然后从中过滤出所有的checkbox并勾选上
'''#第一种tag_name
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep(2)
dr.quit()
'''
'''
#第二种CSS,选择所有的radio并全部勾上
radios = dr.find_elements_by_css_selector('input[type=radio]')
for radio in radios:
radio.click()
time.sleep(2)
#打印当前页面上有多少个radio
print (len(dr.find_elements_by_css_selector('input[type=radio]')))#python3.0 print打印的内容必须带括号()
time.sleep(2)
dr.quit()
#把页面上最后1个radio的勾去掉
dr.find_elements_by_css_selector('input[type=radio]').pop().click()#pop()来实现去掉勾选表,暂时有问题??
time.sleep(2)
dr.quit()
'''
html文件
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title>
<script type="text/javascript" async="" src="https://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 src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2</label>
<div class="controls">
<input type="checkbox" id="c2" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c3">checkbox3</label>
<div class="controls">
<input type="checkbox" id="c3" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r2" />
</div>
</div>
</form>
</div>
</body>
</html>
(3)实践练习——层级定位
场景:解决两个控件很多属性基本相同,需要具体定位其中一个
#层级定位,先定位父元素,后定位子孙元素
#level_locate.html需要和test_2文件在同一路径下
#-*-coding:utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
import os
dr = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('level_locate.html')
dr.get(file_path)
#点击link链接(弹出下拉列表)
dr.find_element_by_link_text('Link1').click()
#找到id为dropdown1的父元素
WebDriverWait(dr,10).until(lambda the_driver:the_driver.find_element_by_id('dropdown1').is_displayed())
#在父亲元件下找到link为Action的子元素
menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action')
#鼠标定位到子元素上
webdriver.ActionChains(dr).move_to_element(menu).perform()
time.sleep(2)
dr.quit()
html文件
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Level Locate</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" />
</head>
<body>
<h3>Level locate</h3>
<div class="span3">
<div class="well">
<div class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Link1</a>
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel" id="dropdown1" >
<li><a tabindex="-1" href="#">Action</a></li>
<li><a tabindex="-1" href="#">Another action</a></li>
<li><a tabindex="-1" href="#">Something else here</a></li>
<li class="divider"></li>
<li><a tabindex="-1" href="#">Separated link</a></li>
</ul>
</div>
</div>
</div>
<div class="span3">
<div class="well">
<div class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Link2</a>
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel" >
<li><a tabindex="-1" href="#">Action</a></li>
<li><a tabindex="-1" href="#">Another action</a></li>
<li><a tabindex="-1" href="#">Something else here</a></li>
<li class="divider"></li>
<li><a tabindex="-1" href="#">Separated link</a></li>
</ul>
</div>
</div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>
(4)实践练习——鼠标悬停
#导入提供鼠标操作的ActionChains类
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
url="http://www.iqiyi.com"
driver=webdriver.Chrome()
driver.get(url)
#调用ActionChains()类,perform对整个操作的提交动作
above=driver.find_element_by_link_text("电影") #定位到要悬停的元素
ActionChains(driver).move_to_element(above).perform()#对定位到的元素执行鼠标悬停操作
(5)实践练习——键盘操作
from selenium import webdriver
from selenium.webdriver.common.keys import Keys #在使用键盘前需要先导入keys类
driver=webdriver.Chrome()
driver.get("http://www.iqiyi.com")
#输入框输入内容
driver.find_element_by_class_name("search-box-input") .send_keys("我和你的倾城时光-zly")
#删除最后一个字符
driver.find_element_by_class_name("search-box-input").send_keys(Keys.BACK_SPACE)
#输入空格键+“无双”
try:
driver.find_element_by_class_name("search-box-input").clear()
print("passed:clear success")
driver.find_element_by_class_name("search-box-input").send_keys("无双")
except Exception as e:
print("failed",format(e))
#全选输入框内容
driver.find_element_by_class_name("search-box-input").send_keys(Keys.CONTROL,'a')
#剪贴输入框内容
driver.find_element_by_class_name("search-box-input").send_keys(Keys.CONTROL,'x')
#粘贴内容到输入框
driver.find_element_by_class_name("search-box-input").send_keys(Keys.CONTROL,'v')
#通过回车键来代替单击操作
driver.find_element_by_class_name("search-box-input").send_keys(Keys.ENTER)