Python学习总结 10 自动化测试Selenium2
一, 配置 Selenium2
1 Selenium是什么?
Selenium是一个用于Web应用程序测试的工具.Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE,Mozilla和Firefox等.这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上.测试系统功能--创建衰退测试检验软件功能和用户需求.
2 安装Selenium
使用pip 命令安装Selenium。
pip install -U selenium
成功安装Selenium后,如下图所示:
3 安装FireFox浏览器驱动
WebDriver支持FireFox,IE,Chrome和Opera等浏览器。还支持Android和IPhone的移动应用测试。
各个浏览器驱动下载地址:
http://www.seleniumhq.org/download/
https://pypi.python.org/pypi/selenium
https://github.com/mozilla/geckodriver/releases
安装FireFox驱动,下载 geckodriver-v0.16.0-win64.zip(根据自己机器操作系统的不同下载不同的驱动),解压得到 geckodriver.exe文件,放到系统环境变量Path下面,前面已经装(C:\Python35)添加到了系统环境变量Path下面,所以可以将geckodriver.exe文件放到 C:\Python35\目录下。
4 安装Chrome浏览器驱动
从http://chromedriver.storage.googleapis.com/index.html?path=2.24/下载Chrome的浏览器驱动。
经过测试发现, ChromeDriver.exe在2.24版本最稳定。
from selenium import webdriver
import os chromedriver = "d:\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"]) driver= webdriver.Chrome( chromedriver,chrome_options=options)
driver.get("http://163.com")
折腾了2天终于正常使用ChromeDriver。
二 案例
1, 例子1, 打开火狐浏览器浏览指定网页
# -*- coding: utf- -*- from selenium import webdriver
from selenium.webdriver.common.keys import Keys browser = webdriver.Firefox()
browser.get('http://www.baidu.com') elem = browser.find_element_by_name('wd') # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN) browser.quit()
上述代码执行以下操作:
1)打开新的FireFox浏览器
2)找到百度的名字为wd的输入框
3)输入 “seleniumhq”并搜索
4)关闭FireFox浏览器
输如中文关键字,中文需要utf-8格式编码,否则会出错。
# -*- coding: utf- -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys browser = webdriver.Firefox()
browser.get('http://www.baidu.com') elem = browser.find_element_by_name('wd') # Find the search box
elem.send_keys(u'老铁 没毛病 双击666' + Keys.RETURN) #browser.quit()
2, selenium_webdriver(python)单/复选框的遍历选择
wml.html
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<form>
<!-- <label for="c1">checkbox1</label> -->
<input type="checkbox" id="c1" />checkbox1<br>
<!-- <label for="c2">checkbox2</label> -->
<input type="checkbox" id="c2" />checkbox2<br>
<!-- <label for="c3">checkbox3</label> -->
<input type="checkbox" id="c3" />checkbox3<br>
</form> <form>
<label value="radio">radio</label>
<input type="radio" name="sex" value="male" id="as"/><br>
<label value="radio1">radio</label>
<input type="radio" name="sex" value="female" id="sd"/>
</form> <!-- <form>
<input type="radio" name="sex" value="male" /> Male
<br />
<input type="radio" name="sex" value="female" /> Female
</form> --> </body>
</html>
python代码
#coding: utf-
#以下代码用来遍历所有复选框
from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
#获取要测试文件绝对路径
file_path = os.path.abspath('wml.html')
print file_path
#用浏览器打开文件
driver.get(file_path)
# 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
inputs = driver.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep()
'''
checkboxs = driver.find_elements_by_css_selector('input[type=checkbox]')
for checkbox in checkboxs:
checkbox.click()
time.sleep()
'''
# 把页面上最后1个checkbox 的勾给去掉
#.pop() 方法用于删除并返回数组的最后一个元素,在此处是返回到复选框的“最后一个”按钮
driver.find_elements_by_css_selector('input[type=checkbox]').pop().click()
time.sleep()
driver.quit()
#coding: utf-
##以下代码用来遍历所有单选框
from selenium import webdriver
import time
import os
dr = webdriver.Chrome()
file_path = os.path.abspath('wml.html')
dr.get(file_path)
# 选择所有的radio并全部勾上
radios = dr.find_elements_by_css_selector('input[type=radio]')
for radio in radios:
radio.click()
time.sleep()
time.sleep()
dr.quit()
3, 加载本地资源
loginURL = 'http://www.zhihu.com'
self._browser = webdriver.Firefox()
self._browser.get( self.loginURL )
4, 调用JavaScript
def execute_script(self, script, *args):
"""
Synchronously Executes JavaScript in the current window/frame. :Args:
- script: The JavaScript to execute.
- \*args: Any applicable arguments for your JavaScript. :Usage:
driver.execute_script('document.title')
"""
converted_args = list(args)
return self.execute(Command.EXECUTE_SCRIPT,
{'script': script, 'args':converted_args})['value']
例子1,
首先,直接传入Javascript代码
jse.executeScript("window.document.getElementById('jingshou').click()"
然后,传入WebElement执行JS
WebElement element = driver.findElement(By.id("jingshou"));
jse.executeScript("arguments[0].click();", element);
例子2,
首先,新建一个Python类来读取js文件。CommonHelper.py
class CommonHelper :
def __init__(self ) :
pass @staticmethod
def readJs( style):
with open( style , 'r') as f:
return f.read()
然后使用selenium2
f = webdriver.Firefox()
f.get("file://path/to/empty.html") from selenium import webdriver f = webdriver.Firefox()
f.execute_script("window.blah = function () {document.body.innerHTML='testing';}")
f.execute_script("blah()")
也可以执行简单js代码,如下所示:
driver.execute_script("window.a = function(a,b) {return a + b;}")
print driver.execute_script("return a(1,2)")
例子3, 控制浏览器滚动条
方法一:调过JS脚本控制
#coding=utf-
from selenium import webdriver
import time
#访问百度
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
#搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep()
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=100000"
driver.execute_script(js)
time.sleep()
#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
time.sleep()
#将页面滚动条移动到页面任意位置,改变等于号后的数值即可
js="var q=document.documentElement.scrollTop=50"
driver.execute_script(js)
time.sleep()
'''
#若要对页面中的内嵌窗口中的滚动条进行操作,要先定位到该内嵌窗口,在进行滚动条操作
js="var q=document.getElementById('id').scrollTop=100000"
driver.execute_script(js)
time.sleep()
'''
driver.quit()
方法二:通过键盘 按“DOWN”键,实现页面滚动条滚动到页面任意位置
#coding=utf-
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
#访问百度
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
#搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep()
#通过按向下键将页面滚动条拖到底部
driver.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(Keys.DOWN)
time.sleep()
driver.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(Keys.DOWN)
time.sleep()
driver.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(Keys.DOWN)
time.sleep()
driver.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(Keys.DOWN)
time.sleep()
driver.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(Keys.DOWN)
time.sleep()
driver.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(Keys.DOWN)
time.sleep()
driver.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(Keys.DOWN)
time.sleep()
driver.quit()
例子4 单/复选框的遍历选择
wml.html:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title> </head>
<body> <h3>checkbox</h3>
<form>
<input type="checkbox" id="c1" />checkbox1<br>
<input type="checkbox" id="c2" />checkbox2<br>
<input type="checkbox" id="c3" />checkbox3<br>
</form> <h3>Radio</h3>
<form>
<label value="radio">radio</label>
<input type="radio" name="sex" value="male" id="as"/><br>
<label value="radio1">radio</label>
<input type="radio" name="sex" value="female" id="sd"/>
</form> </body>
</html>
测试脚本
# -*- coding: utf- -*- from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
from db import HandleDatabase
from CommonHelper import CommonHelper
import os class Client(object):
testUrl = 'http://127.0.0.1:8020/TestWeb/xpath.html' def __init__(self):
self.initChrome() def initChrome( self ):
chromedriver = "d:\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"])
self._browser= webdriver.Chrome( chromedriver,chrome_options=options) def test( self):
self._browser.get( self.testUrl )
# 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
inputs = self._browser.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep() # 把页面上最后1个checkbox 的勾给去掉
#.pop() 方法用于删除并返回数组的最后一个元素,在此处是返回到复选框的“最后一个”按钮
self._browser.find_elements_by_css_selector('input[type=checkbox]').pop().click()
time.sleep() # 选择所有的radio并全部勾上
radios = self._browser.find_elements_by_css_selector('input[type=radio]')
for radio in radios:
radio.click()
time.sleep() def runMain() :
client = Client()
client.test() if __name__ == "__main__":
runMain()
参考资料:
XPATH
http://blog.csdn.net/skylovedaim/article/details/22399749
Python学习总结 10 自动化测试Selenium2的更多相关文章
- python 学习笔记 10 -- 正則表達式
零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...
- python学习笔记10(Python的内存管理)
用这张图激励一下自己,身边也就只有一位全栈数据工程师!!! 32. Python的内存管理 1. 对象的内存使用 对于整型和短字符串对象,一般内存中只有一个存储,多次引用.其他的长字符串和其他对象 ...
- Python 学习笔记10
念念不忘,必有回响. 今天继续学习Python 类.
- 从零开始的Python学习Episode 10——函数
函数 一.函数的创建 简单格式 def function_name(参数表): 函数体 return 如果没有写return,函数会默认返回一个none 二.函数的参数 必需参数: 调用函数时必需参数 ...
- Python学习:10.Python装饰器讲解(一)
情景介绍 一天,在你正在努力加班的时候,老板给交给你了一个任务,就是在这段代码里将所有函数开始输出一个‘hello’最后输出当前时间,再输出一个“end”,这段代码里包含了大量的函数,你会怎么做? d ...
- python学习笔记10 ----网络编程
网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...
- python学习笔记(10):面向对象
一.类和实例 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 2.对象:通过类定义的数据结构实例.对象包括两个数据成员( ...
- python学习(10)字典学习,写一个三级菜单程序
学习了字典的应用.按老师的要求写一个三级菜单程序. 三级菜单程序需求如下: 1.深圳市的区--街道--社区---小区4级 2.建立一个字典,把各级区域都装进字典里 3.用户可以从1级进入2级再进入3级 ...
- Python学习笔记10
1.函数式编程 理论就来自lambda演算,虽然没有学过lisp,一直被其大名震撼. 特性: 函数是以一等公民 可以作为参数 可以作为返回值 具有闭包特性 1.1参数传递方式 一般参数传递 ...
随机推荐
- Android JNI中C调用Java方法
背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...
- 使用Visual Studio Team Services敏捷规划和项目组合管理(七)——流程定制
使用Visual Studio Team Services敏捷规划和项目组合管理(七)--流程定制 在Team Services中,可以通过流程定制工作追踪体验.流程定义了工作项跟踪系统的构建部分,以 ...
- cookie 和session 的区别(转)
二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有 ...
- LINQ的求和 平均 最大 最小 分组 计数 等等
1.简单形式: var q = from p in db.Products group p by p.CategoryID into g select g; 语句描述:使用Group By按Categ ...
- c/c++ 图的创建(二维数组法)
c/c++ 图的创建(二维数组法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点,和节点之 ...
- python中------decode解码出现的0xca问题解决方法
一.错误: 解决方法: #源代码 data = sk.recv(1024) print(str(data,'gbk')) #修改代码 data = sk.recv(1024) print(str(da ...
- 聚类——KFCM的matlab程序
聚类——KFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——KFCM文章中已介绍了KFCM-F算法的理论知识,现在用m ...
- Python 列表&元组&字典&集合
列表(list) 有序性,可存储任意类型的值 通过偏移存取,支持索引来读取元素,第一个索引为0 ,倒数第一个索引为-1 可变性 ,支持切片.合并.删除等操作 可通过索引来向指定位置插入元素 可通过po ...
- 转:Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- 在win10 64位系统安装 lxml (Python 3.5)
本想直接用pip install lxml 命令安装完事,但是由于安装过程中跟VS的一些东西冲突怎么都安装不上,搜索到以下方法,问题解决. 步骤: 1.下载跟python匹配的.whl 文件(lxml ...