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参数传递方式 一般参数传递 ...
随机推荐
- iOS----------关于UDID和UUID的一些理解
一.UDID(Unique Device Identifier) UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需要限制一台设备一个账号的应用中经 ...
- java内存分配与垃圾回收
JVM的内存分配主要基于两种,堆和栈. 我们来看一下java程序运行时候的内存分配策略: 1):静态存储区(方法区): 2):栈区: 3):堆区: 1):主要存放静态数据,全局static数据和常量. ...
- 浅谈Android 混淆和加固
混淆: 针对项目代码,代码混淆通常将代码中的各种元素(变量.函数.类名等)改为无意义的名字,使得阅读的人无法通过名称猜测其用途,增大反编译者的理解难度. 虽然代码混淆可以提高反编译的门槛,但是对开发者 ...
- vue缓存页面
vue如何和ionic的缓存机制一样,可以缓存页面,在A页面跳转至B页面后返回A页面时A页面的数据还在? 在app.vue中将router-view使用keep-alive包起来,使用v-if来判断使 ...
- [20181007]12cR2 Using SQL Patch.txt
[20181007]12cR2 Using SQL Patch.txt --//12cR2 已经把sql打补丁集成进入dbms_sqldiag,不是11g的 DBMS_SQLDIAG_INTERNAL ...
- mssql 一次向表中插入多条数据的方法分享 (转自:http://www.maomao365.com/?p=6058)
转自:http://www.maomao365.com/?p=6058) <span style="font-size:16px;font-weight:bold;"> ...
- c函数指针
#include <stdio.h> int max(int a, int b){ return a > b ? a : b; } int min(int a, int b){ re ...
- 【Git 学习三】深入理解git reset 命令
重置命令(git reset)是Git 最常用的命令之一,也是最危险最容易误用的命令.来看看git reset命令用法. --------------------------------------- ...
- 介绍一个比较了各种浏览器对于HTML5 等标准支持程度的网站
可以选择浏览器种类,版本,比较的功能 网站地址:https://caniuse.com/#comparison
- Python - 判断list是否为空
Python中判断list是否为空有以下两种方式: 方式一: list_temp = [] if len(list_temp): # 存在值即为真 else: # list_temp是空的 方式二: ...