【Selenium3】测试对象的定位
1、目的
操作对象、获得对象的属性值、获得对象的text、获得对象的数量
2、单个对象定位方法:id、name、tag name、class name、CSS、XPath、Link Text、Partical Link Text
用到的HTML文档
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>Form</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>simple login form</h3> <form class="form-horizontal"> <div class="control-group"> <label class="control-label" for="inputEmail">Email</label> <div class="controls"> <input type="text" id="inputEmail" placeholder="Email" name="email"> </div> </div> <div class="control-group"> <label class="control-label" for="inputPassword">Password</label> <div class="controls"> <input type="password" id="inputPassword" placeholder="Password" name="password"> </div> </div> <div class="control-group"> <div class="controls"> <label class="checkbox"> <input type="checkbox"> Remember me </label> <button type="submit" class="btn">Sign in</button> <a href="#">register</a> </div> </div> </form> </body> </html>
代码
coding=utf-8
from selenium import webdriver
import time
import os
if 'HTTP_PROXY' in os.environ: del os.environ('HTTP_PROXY') #若OS的操作环境中存在HTTP代理,将其删除
browser=webdriver.FireFox()
file_path='file:///'+os.path.abspath(from.html) #from.html文件与脚本放在相同目录下,函数os.path.abspath()自动查找文件的绝对路径
print file_path
browser.get(file_path) #通过操作get()得到HTML文件
browser.find_element_by_id('inputEmail').click() #查找id='inputEmail'的对象
browser.find_element_by_name('password').click() #查找name='password'的对象
browser.find_element_by_tag_name('form').get_attribute('class') #查找tag_name='form'的第一个对象,并获取属性名为'class'的第一个属性值
browser.find_element_by_tag_name('input').click() #查找tag_name='input'的第一个对象
e=browser.find_element_by_class_name('controls') #查找class_name='controls'的第一个对象
browser.execute_script('$(arguments[0]).fadeOut().fadeIn()',e) #执行js,arguments是调用对象的特殊属性,引用Arguments对象,fadeOut()淡出效果,fadeIn()显示效果
time.sleep(1)
link=browser.find_element_by_link_text('register') #查找link_text='register'的对象
browser.execute_script('$(arguments[0]).fadeOut().fadeIn()',link) #对对象link执行js
time.sleep(1)
p_link=browser.find_element_by_partical_link_text('reg') #查找partical_link_text='reg'的对象
browser.execute_script('$(arguments[0]).fadeOut().fadeIn()',p_link) #对对象p_link执行js
time.sleep(1)
div1=browser.find_elemenmt_by_css_selector('.controls') #查找所有class值为'.controls'的对象
browser.execute_script('$(arguments[0]).fadeOut().fadeIn()',div1) #对对象div1执行js
time.sleep(1)
div2=browser.find_element_by_css_selector('#inputEmail').click() #CSS选择器取id属性
div3=browser.find_element_by_css_selector('a[name=\'password\']').click() #CSS选择器取name属性,也可以选择title或其他属性
browser.find_element_by_xpath('/html/body/form/div[3]/div/label/input').click() #根据层级关系查找到类型为checkbox的勾选框,名称为Remember me
browser.find_element_by_xpath('//input[@id=\'kw\']').send_keys('selenium') #查找input标签下id='kw'的标签
browser.find_element_by_xpath('//div[@id=\'fm\']/form/span/input').send_keys('selenium') #查找id='fm'的div标签/form/span/input的层级下的input标签
browser.find_element_by_xpath('//tr[@id=\'check\']/td[2]').send_keys('selenium') #查找id='check'的tr标签的层级下的第2个td标签
browser.find_element_by_xpath('//input').send_keys('selenium') #查找input标签下的所有标签和子标签
browser.find_element_by_xpath('//tr[7]/td[2]').click() #查找第7个tr标签下第2个td标签的所有标签和子标签
browser.find_element_by_xpath('//a[contains(text,\'网页\')]').click() #查找a标签下文本包含'网页'的元素
browser.find_element_by_xpath('//a[@href=\'http://www.baidu.com\']').click() #查找a标签下链接地址为'http://www.baidu.com'的元素
browser.quit()
3、一组对象定位
目的:批量处理对象、获取一组对象后过滤出某个或某些对象
用到的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="r" /> </div> </div> </form> </div> </body> </html>
代码
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)
checkboxes=dr.find_element_by_css_selector('input[type=checkbox]') #查找所有type=checkbox的input标签
for checkbox in checkboxes:
checkbox.click() #勾选所有checkbox
time.sleep(1)
dr.refresh() #刷新页面
time.sleep(2)
print len(checkboxes) #打印页面上checkbox的数量
inputs=dr.find_element_by_tag_name('input') #选择页面上所有的input
for input in inputs:
if input.get_attribute('type')=='button': #过滤出所有的checkbox
input.click() #勾选所有的checkbox
time.sleep(2)
dr.find_element_by_css_selector('input[type=checkbox]').pop().click #页面上最后一个checkbox的勾选去掉
time.sleep(2)
dr.quit()
4、层级定位
目的:页面上有许多属性基本相同的元素,若要定位到具体某个元素,需要先定位父元素,再定位子元素
用到的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>
代码
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)
dr.find_element_by_link_text('Link1').click() #点击Link1链接,弹出下拉列表
WebDriverWait(dr,10).until(lambda the_driver:the_driver.find_element_by_id('dropdown1').is_displayed()) #10s内每500ms扫描一次页面,直到id='dropdown1'的menu展示
menu=dr.find_element_by_id('dropdown1').find_element_by_link_text('Action') #在父元素dropdown1下查找子元素Action
webdriver.ActionChains(dr).move_to_element(menu).perform() #执行用户操作实例,生成用户行为,所有行动存储在actionchains对象,鼠标移动到具体元素并执行存储行为
time.sleep(2)
dr.quit()