(2)selenium+python自动化测试-基础

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

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')



猜你喜欢

转载自blog.csdn.net/cqupt_zl/article/details/84447089