操作 Cookie
有时候我们需要验证浏览器中是否存在某个 cookie,因为基于真实的 cookie 的测试是无法通过白盒和 集成测试完成的。WebDriver 提供了操作 Cookie 的相关方法可以读取、添加和删除 cookie 信息。
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.Firefox()
driver.get("http://www.youdao.com")
# 获得cookie信息
cookie= driver.get_cookies()
#将获得cookie的信息打印
print cookie
driver.quit()
通过 add_cookies()来向浏览器中写入 cookie 信息。
#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()
从打印结果可以看到最后一条 cookie 信息是在脚本执行过程中通过 add_cookie()方法添加的。通过遍 历得到的所 cookie 信息从而找到 key 为“name”和“value”的特定 cookie 的 value。
那么在什么情况下会用到 cookie 的操作呢?例如开发人员开发一个功能,当用户登录后,会将用户的 用户名写入浏览器 cookie,指定的 key 为“username”,那么我们就可以通过 get_cookies() 找到 useranme, 打印 vlaue,如果找不到 username 或对应的 value 为空,那么说明保存浏览器的 cookie 是有问题的。
delete_cookie() 和 delete_all_cookies() 的使用也很简单,前者通过 name 值到一个特定的 cookie 将其 删除,后者直接删除浏览器中的所有 cookies()信息。
休眠
有时间我们希望脚本执行到某一位置时做固定时间的休眠,尤其是在脚本调试的过程中。那么可以使用 sleep()方法,需要说明的是 sleep()由 Python 的 time 模块提供。
#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()
当执行到 sleep()方法时会固定的休眠所设置的时长,然后再继续执行。sleep()方法默认参数以秒为单 位,如果设置时长小于 1 秒,可以用小数点表示,如:sleep(0.5)
多表单切换
在 web 应用中经常会遇到 frame 嵌套页面的应用,页 WebDriver 每次只能在一个页面上识别元素,对 于 frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过 switch_to_frame() 方法将当前定位的主体切换了 frame 里
<body>
<div class="row-fluid">
<div class="span10 well">
<h3>frame</h3>
<iframe id="if" name="nf" src="http://www.baidu.com" width="800" height="300">
</iframe>
</div>
</div>
</body>
这个时候直接定位id=if一定会报找不到元素的错误。那么可以使用 switch_to_frame()先找frame.html 中的< iframe >标签,然后再定位id=if
#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()
那么如果 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()方法。
警告框处理
在 WebDriver 中处理 JavaScript 所生成的 alert、confirm 以及 prompt 是很简单的。具体做法是使用 switch_to_alert()方法定位到 alert/confirm/prompt。然后使用 text/accept/dismiss/send_keys 按需进行操做。
text 返回 alert/confirm/prompt 中的文字信息。
accept 点击确认按钮。
dismiss 点击取消按钮,如果有的话。
send_keys 输入值,这个 alert\confirm 没有对话框就不能用了,不然会报错。
#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()
下拉选项窗处理
#定位选项窗口
m = browser.find_element_by_xpath('//*[@id="questType"]')
#定位到选项,点击
m.find_element_by_xpath('//[@id="questType"]/option[3]').click()