Selenium 主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退、前进按钮等。
在不同的浏览器大小下访问测试站点,对测试页面截图并保存,然后观察或使用图像比对工具对被测页面的前端样式进行评测。比如可以将浏览器设置成移动端大小(480x800),然后访问移动站点,对其样式进行评估;WebDriver 提供了set_window_size() 方法来设置浏览器的大小。
例子:
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://192.168.30.180/Uet-Platform/")
#参数数字为像素点
print "****设置浏览器宽480、高800 显示"**
driver.set_window_size(480, 800)**
driver.quit()
在PC 端运行执行自动化测试脚本大多的情况下是希望浏览器在全屏幕模式下执行,那么可以使用maximize_window()方法,其用法与set_window_size() 相同,但它不需要传参。
在使用浏览器浏览网页的时候,浏览器提供了后退和前进按钮,可以方便的对浏览过的网页之间切换,那么WebDriver 也提供了对应的back()和forward()方法来模拟后退和前进按钮。下面通过例子来演示这两个方法的使用。
例子:
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
#访问百度首页
first_url= 'http://www.baidu.com'
print "now access %s" %(first_url)
driver.get(first_url)
#****访问新闻页面**
second_url='http://news.baidu.com'
print "now access %s" %(second_url)
driver.get(second_url)
#****返回(后退)到百度首页
print "back to %s "%(first_url)
driver.back()
#****前进到新闻页
print "forward to %s"%(second_url)
driver.forward()
driver.quit()
输出:
now access http://www.baidu.com
now access http://news.baidu.com
back to http://www.baidu.com
forward to http://news.baidu.com
有时候需要手动的刷新(F5)的刷新页面
driver.refresh()
#****刷新当前页面**
1、clear() 清除文本,如果是一个文件输入框
2、send_keys(*value) 在元素上模拟按键输入
3、click() 单击元素
例子:
#coding=utf-8
from selenium import webdriver
import unittest, time, re
driver = webdriver.Firefox()
driver.implicitly_wait(30)
base_url ="http://192.168.30.180/Uet-Platform/masterLogin.action" #30****测试环境**
driver.get(base_url)
driver.find_element_by_id("txtUserName").clear()
driver.find_element_by_id("txtUserName").send_keys("13554797004")
driver.find_element_by_id("txtPassword").clear()
driver.find_element_by_id("txtPassword").send_keys("123123")
driver.find_element_by_link_text(u"登录").click()
driver.switch_to_frame("lj_left")
driver.find_element_by_xpath("//div[@id='left']/table/tbody/tr[6]/td").click()
driver.find_element_by_link_text(u"****用户单位管理").click()
例子:
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.youdao.com")
driver.find_element_by_id('query').send_keys('hello')
#提交输入框的内容
driver.find_element_by_id('query').submit()
driver.quit()
有些时候submit()可以与click()方法互换来使用,submit()同样可以提交一个按钮。
例子:
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#****获得输入框的尺寸
size=driver.find_element_by_id('kw').size
print size
#****返回百度页面底部备案信息
text=driver.find_element_by_id("cp").text
print text
#返回元素的属性值,可以是id、name、type 或元素拥有的其它任意属性
attribute=driver.find_element_by_id("kw").get_attribute('type')
print attribute
#返回元素的结果是否可见,返回结果为True 或False
result=driver.find_element_by_id("kw").is_displayed()
print result
driver.quit()
运行结果:
{'width': 526, 'height': 22}
©2014 Baidu 使用百度前必读京ICP 证030173 号
True
例子1:鼠标右击操作
对于ActionChains 类下所提供的鼠标方法与前面学过的click()方法有所不同,那么简单context_click()右键点击一个元素。
代码实现:
from selenium import webdriver
*#引入ActionChains 类*
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.get("http://yunpan.360.cn")
#****定位到要右击的元素**
right_click =driver.find_element_by_id("xx")
#****对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(right_click).perform()
例子2:鼠标悬停
鼠标悬停弹出下拉菜单也是一个非常见的一个功能设计
代码实现:
from selenium import webdriver
#引入ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#定位到要悬停的元素
above =driver.find_element_by_id("xx")
#对定位到的元素执行悬停操作
ActionChains(driver).move_to_element(above).perform()
...
例子3:鼠标双击操作
代码实现:
from selenium import webdriver
#引入ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
#定位到要悬停的元素
double_click = driver.find_element_by_id("xx")
#对定位到的元素执行双击操作
ActionChains(driver).double_click(double_click).perform()
例子4:鼠标推放操作
代码实现:
from selenium import webdriver
#引入ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
#定位元素的源位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("xxx")
#执行元素的拖放操作
ActionChains(driver).drag_and_drop(element,target).perform()
from selenium.webdriver.common.keys import Keys
#在使用键盘按键方法前需要先导入keys 类包。
下面经常使用到的键盘操作:
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘F1
……
send_keys(Keys.F12) 键盘F12
例子:
#coding=utf-8
from selenium import webdriver
#引入Keys 模块
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element_by_id("kw").send_keys("seleniumm")
#删除多输入的一个m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
#ctrl+v 粘贴内容到输入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
#通过回车键盘来代替点击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
driver.quit()
显式等待使WebdDriver 等待某个条件成立时继续执行,否则在达到最大时长时抛弃超时异常(TimeoutException)。
例子:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw")))
element.send_keys('selenium')
driver.quit()
WebDriverWait()
它是由webdirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存
在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驱动程序(Ie, Firefox,Chrome 等)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛NoSuchElementException 异常。
until()
WebDriverWait()一般由until()(或until_not())方法配合使用,下面是until()和until_not()方法的说明。
until(method, message=’ ’)
调用该方法提供的驱动程序作为一个参数,直到返回值为Ture。
until_not(method, message=’ ’)
调用该方法提供的驱动程序作为一个参数,直到返回值为False。
除了expected_conditions 所提供的预期方法,我们也可以使用前面学过的is_displayed()方法来判断元素是否可。
例子:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
input_ = driver.find_element_by_id("kw")
element = WebDriverWait(driver,5,0.5).until(
lambda driver : input_.is_displayed()
)
input_.send_keys('selenium')
driver.quit()
例子:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
input_ = driver.find_element_by_id("kw22")
input_.send_keys('selenium')
driver.quit()
例子:
#coding=utf-8
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
sleep(2)
driver.find_element_by_id("kw").send_keys("webdriver")
driver.find_element_by_id("su").click()
sleep(3)
driver.quit()
例子:
#coding=utf-8
from selenium import webdriver
import time
import os
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('frame.html')
driver.get(file_path)
#****切换到iframe(id = "if")
driver.switch_to_frame("if")
#****下面就可以正常的操作元素了
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
switch_to_frame() 默认可以直接取表单的id 或name 属性进行切换。
#id = "if"
driver.switch_to_frame("if")
#name = "nf"
driver.switch_to_frame("nf")
那么如果iframe 没有可用的id 和name 可以通过下面的方式进行定位:
#先通过xpth 定位到iframe
xf = driver.find_element_by_xpath('//*[@class="if"]')
#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(xf)
driver.switch_to_default_content()
如果完成了在当前表单上的操作可以通过switch_to_default_content()方法返回到上一层单。该方法不用指定某个表单的返回,默认对应与它最近的switch_to_frame()方法。
** 图 多窗口**
这里以百度首页与注册页为例,演示在不同窗口切换。
例子:
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
#****获得百度搜索窗口句柄
sreach_windows= driver.current_window_handle
driver.find_element_by_link_text(u'****登录').click()
driver.find_element_by_link_text(u"****立即注册").click()
#****获得当前所有打开的窗口的句柄
all_handles = driver.window_handles
#****进入注册窗口
for handle in all_handles:
if handle != sreach_windows:
driver.switch_to_window(handle)
print 'now register window!'
driver.find_element_by_name("account").send_keys('username')
driver.find_element_by_name('password').send_keys('password')
#****进入搜索窗口**
for handle in all_handles:
if handle == sreach_windows:
driver.switch_to_window(handle)
print 'now sreach window!'
driver.find_element_by_id('TANGRAM__PSP_2__closeBtn').click()
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(5)
driver.quit()
例子:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
#鼠标悬停相“设置”链接
link = driver.find_element_by_link_text(u'设置')
ActionChains(driver).move_to_element(link).perform()
#打开搜索设置
driver.find_element_by_class_name('setpref').cick()
#保存设置
driver.find_element_by_css_selector('#gxszButton > a.prefpanelgo').click()
#接收弹窗
driver.switch_to_alert().accept()
driver.quit()
文件上传操作也比较常见功能之一,上传功能操作webdriver 并没有提供对应的方法,关键上传文件的思路。
对web 页面的上功能,点击“上传”按钮需要打开本地的Window 窗口,从窗口选择本地文件进行上传,那么WebDriver 对于Windows 的控件是无能为力的
对于web 页面的上传功能一般会有以下几种方式。
普通上传:普通的附件上传都是将本地文件的路径作为一个值放input 标签中,通过form 表单提交的时候将这个值提交给服务器。
插件上传:一般是指基于Flash 与JavaScript 或Ajax 等技术所实现的上传功能或插件。
例子:
#coding=utf-8
from selenium import webdriver
import os
driver = webdriver.Firefox()
#打开上传功能页面
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\upload_file.txt')
driver.quit()
2.根据AutoIt Windows Info 所识别到的控件信息打开SciTE Script Editor 编辑器,编写脚本。
;ControlFocus("title","text",controlID) Edit1=Edit instance 1
ControlFocus("****选择要加载的文件", "","Edit1")
; Wait 10 seconds for the Upload window to appear
WinWait("[CLASS:#32770]","",10)
; Set the File name text on the Edit field
ControlSetText("选择要加载的文件", "", "Edit1", "D:\\upload_file.txt")
Sleep(2000)
; Click on the Open button
ControlClick("选择要加载的文件", "","Button1");
3、脚本运行正常,将其保存为upfile.au3,这里保存的脚本可以通过Run Script 工具将其打开运行,
但我们的目的是希望这个脚本被Python 程序调用,那么就需要将其生成exe 程序。打开Compile Script to.exe
工具,将其生成为exe 可执行文件。如下图
** 图 Compile Script to.exe 生成exe 程序**
点击“Browse”选择upfile.au3 文件,点击“Convert”按钮将其生成为upfile.exe 程序。
4、下面就是通过自动化测试脚本调用upfile.exe 程序实现上传了。
例子:
#coding=utf-8
from selenium import webdriver
import os
driver = webdriver.Firefox()
#****打开上传功能页面
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
#****点击打开上传窗口
driver.find_element_by_name("file").click()
#****调用upfile.exe 上传程序
os.system("D:\upfile.exe")
driver.quit()
通过Python 的os 模块的system()方法可以调用exe 程序并执行。
webdriver 操作cookie 的方法有:
1、get_cookies() 获得所有cookie 信息
2、get_cookie(name) 返回有特定name 值有cookie 信息
3、add_cookie(cookie_dict) 添加cookie,必须有name 和value 值
4、delete_cookie(name) 删除特定(部分)的cookie 信息
5、delete_all_cookies() 删除所有cookie 信息
下面通过get_cookies()来获取当前浏览器的cookie 信息。
程序实现:
#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.youdao.com")
# 获得cookie 信息
cookie= driver.get_cookies()
#将获得cookie 的信息打印
print cookie
driver.quit()
执行结果:
============= RESTART ===============
[{u'domain': u'.youdao.com',
u'secure': False,
u'value': u'aGFzbG9nZ2VkPXRydWU=',
u'expiry': 1408430390.991375,
u'path': u'/',
u'name': u'_PREF_ANONYUSER__MYTH'},
{u'domain': u'.youdao.com',
u'secure': False,
u'value': u'[email protected]',
u'expiry': 2322974390.991376,
u'path': u'/', u'name':
u'OUTFOX_SEARCH_USER_ID'},
{u'path': u'/',
u'domain': u'www.youdao.com',
u'name': u'JSESSIONID',
u'value': u'abcUX9zdw0minadIhtvcu',
u'secure': False}]
例子:
#coding=utf-8
from selenium import webdriver**
import time**
driver = webdriver.Firefox()**
driver.get("http://www.youdao.com")
#向cookie 的name 和value 添加会话信息。
driver.add_cookie({'name':'key-aaaaaaa', 'value':'value-bbbbbb'})
#遍历cookies 中的name 和value 信息打印,当然还有上面添加的信息
for cookie in driver.get_cookies():
print "%s -> %s" % (cookie['name'], cookie['value'])
driver.quit()
执行结果:
======================= RESTART ======================
YOUDAO_MOBILE_ACCESS_TYPE -> 1
_PREF_ANONYUSER__MYTH -> aGFzbG9nZ2VkPXRydWU=
OUTFOX_SEARCH_USER_ID -> [email protected]
JSESSIONID -> abc7qSE_SBGsVgnVLBvcu
key-aaaaaaa -> value-bbbbbb
WebDiver 不能操作本地Windows 控件,但对于浏览器上的控件也不是都可以操作的。比哪浏览器上的滚动条,虽然WebDriver 提供操作浏览器的前进和后退按钮,但对于滚动条并没有提供相应用的方法。那么在这种情况下就可以借助JavaScript 方法来控制浏览器滚动条。WebDriver 提供了execute_script()方法来执行JavaScript 代码。
一般用到操作滚动条的会两个场景:
(1)注册时的法律条文的阅读,判断用户是否阅读完成的标准是:滚动条是否拉到最下方。
(2)要操作的页面元素不在视觉范围,无法进行操作,需要拖动滚动条。
用于标识滚动条位置的代码
例子:
……
<body onload= "document.body.scrollTop=0 ">**
<body onload= "document.body.scrollTop=100000 ">**
……
document.body.scrollTop
例子:
#coding=utf-8
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(3)
#将页面滚动条拖到底部
js="document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js_="document.documentElement.scrollTop=0"
driver.execute_script(js_)
time.sleep(3)
driver.quit()
通过浏览器打开百度进行搜索,搜索的一屏无法完全显示将会出现滚动条。这个时候就可以通过JavaScript 代码控制滚动条在任意位置,需要改变的就是scrollTop 的值。通过execute_script()方法来执行这段JavaScript 代码。
有时候滚动条不仅上下有,如上图,其它左右也有,那么可以通过下面JavaScript 代码来实现上下与左右滚动条的任意推动。
例子:
#window.scrollTo(左边距,上边距);
window.scrollTo(0,450);
js=" window.scrollTo(200,1000);"
driver.execute_script(js)
例子:
#coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
try:
driver.find_element_by_id('kw_error').send_key('selenium')
driver.find_element_by_id('su').click()
except :
driver.get_screenshot_as_file("D:\\baidu_error.jpg")
driver.quit()