Selenium note

Selenium 学习笔记

  • 安装
    pip install selenium

    使用时要下载对应的webdriver驱动,这里举例使用Chrome
    Chrome driver download
    下载后建立一个文件夹chromedriver,然后将解压出来的chromedriver.exe 放在文件里面,最后将路径添加到环境变量
    环境变量示例 C:\chromedriver

  • 第一个测试示例
    下面例子会打开Chrome浏览器,然后访问百度,在输入框中输入selenium然后搜索,最后退出

#coding = utf-8
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")      driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
driver.quit()

使用不同的浏览器 前提需要安装相应的驱动

webdriver.Chrome()
webdriver.Firefox()
webdriver.Ie()
webdriver.Safari()

访问网址
driver.get("http://xxx.com")

浏览器最大化
driver.maximize_window()

设置浏览器宽和高
driver.set_window_size(width=480, height=800)

浏览器退出
driver.quit()

浏览器后退 浏览器前进
driver.back() driver.forward()

对象定位

类型方法描述
iddriver.find_element_by_id()id值
namedriver.find_element_by_name()name属性
class_namedriver.find_element_by_class_name()类名
tag namedriver.find_element_by_tag_name()标签
link textdriver.find_element_by_link_text()超链接 文本
partial link textdriver.find_element_by_partial_link_text()超链接 文本
xpathdriver.find_element_by_xpath()xpath
css selectordriver.find_element_by_css_selector()css 选择器 规则是采用了来自 Sizzle 的 css3定位扩展

<a href="http://news.baidu.com" name="tj_news">新 闻</a>
find_element_by_link_text("新 闻")
find_element_by_partial_link_text("新")

操作测试对象

driver.find_element_by_id("xxx").clear()  #清空
driver.find_element_by_id("xxx").send_keys('nihao')  #模拟键盘
driver.find_element_by_id("xxx").click()  #点击元素
driver.find_element_by_id("xxx").submit() #提交表单

WebElement常用方法

size=driver.find_element_by_id("x").size  #获得元素尺寸
text=driver.find_element_by_id("cp").text #获得元素text内容
attribute=driver.find_element_by_id("kw").get_attribute('type') #获得元素属性
result=driver.find_element_by_id("kw").is_displayed() #元素是否可见

鼠标事件 ActionChains类中

context_click()  #右击
double_click() #双击
drag_and_drop() #拖动
move_to_element() #鼠标悬停在一个元素上
click_and_hold() #按下鼠标左键在一个元素上
#导入ActionChains
from selenium.webdriver.common.action_chains import ActionChains

e = driver.find_element_by_id('XX')
ActionChains(driver).context_click(e).perform() 
#使用时候是固定写法 ActionChains(webdriver实例).鼠标事件方法(参数).perform()执行
ActionChains(driver).double_click(e).perform()
ActionChains(driver).move_to_element(e).perform()
ActionChains(driver).click_and_hold(e).perform()

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
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
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)

打印信息

driver.title            title
driver.current_url      url

设置等待时间

time.sleep(5) 5
from selenium.webdriver.support.ui import WebDriverWait
#WebDriverWait()方法使用
element=WebDriverWait(driver, 10).until(lambda driver:driver.find_element_by_id("kw"))
element.send_keys("selenium")
#添加智能等待
driver.implicitly_wait(30)

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
#driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
#timeout - 最长超时时间,默认以秒为单位
#poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
#ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。

implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间
范围内智能的等待

定位一组对象

类型方法描述
iddriver.find_elements_by_id()id值
namedriver.find_elements_by_name()name属性
class_namedriver.find_elements_by_class_name()类名
tag namedriver.find_elements_by_tag_name()标签
link textdriver.find_elements_by_link_text()超链接 文本
partial link textdriver.find_elements_by_partial_link_text()超链接 文本
xpathdriver.find_elements_by_xpath()xpath
css selectordriver.find_elements_by_css_selector()css 选择器 规则是采用了来自 Sizzle 的 css3定位扩展

checkboxes = driver.find_elements_by_css_selector('input[type=checkbox]')  #全部都打勾
for checkbox in checkboxes:
    checkbox.click()
driver.find_elements_by_css_selector('input[type=checkbox]').pop().click() #把页面上最后一个checkbox的勾给去掉

可以多次使用
menu = driver.find_element_by_id('dropdown1').find_element_by_link_text('Another action')

定位frame中的对象

找到到 ifrome1(id = f1)
driver.switch_to_frame("f1")

浏览器多窗口处理

获得当前窗口
nowhandle=driver.current_window_handle

打开注册新窗口
driver.find_element_by_name("tj_reg").click()

获得所有窗口
allhandles=driver.window_handles

#循环判断窗口是否为当前窗口
for handle in allhandles:
    if handle != nowhandle:
        driver.switch_to_window(handle)
        print 'now register window!'
        #切换到邮箱注册标签
        driver.find_element_by_id("mailRegTab").click()
        time.sleep(5)
        driver.close()

回到原先的窗口
driver.switch_to_window(nowhandle)

js alert/confirm/prompt弹框处理
获取网页上的弹框

alert=driver.switch_to_alert()
alert.accept()      #点击确认按钮
alert.text()        #返回 alert/confirm/prompt 中的文字信息
alert.dismiss()     #点击取消按钮,如果有的话
alert.send_keys()   #输入值,这个 alert\confirm 没有对话框就不能用了,不然会报错

上传文件

定位上传按钮,通 send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在
driver.find_element_by_name("file").send_keys('D:\\selenium_use_case\upload_file.txt')

import requests
print requests.head(’http://www.python.org’).headers[’content-type’]

Content-Type ,内容类型,一般是指网页中存在的 Content-Type ,用于定义网络文件的类型和
网页的编码,决定浏览器将以什么形式、什么编码读取这个文件

#coding=utf-8
import os
from selenium import webdriver
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", os.getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk",
"application/octet-stream")
browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://pypi.python.org/pypi/selenium")
browser.find_element_by_partial_link_text("selenium-2").click()

browser.download.dir 用于指定你所下载文件的目录
os.getcwd()该函数不需要传递参数,用于返回当前的目录
application/octet-stream 为内容的类型

调用javascript
webdriver 提供了 execute_script() 接口用来调用 js 代码

通过 JS 隐藏选中的元素

#隐藏文字信息
driver.execute_script('$("#tooltip").fadeOut();')
time.sleep(5)
#隐藏按钮:
button = driver.find_element_by_class_name('btn')
driver.execute_script('$(arguments[0]).fadeOut()',button)

execute_script(script, *args)
在当前窗口/框架 同步执行 javaScript
script:JavaScript 的执行。
*args:适用任何 JavaScript 脚本。

控制浏览器滚动条

<body onload= "document.body.scrollTop=0 ">
<body onload= "document.body.scrollTop=100000 ">

如果滚动条在最上方的话,scrollTop=0 , 那么要想使用滚动条在最可下方, 可以 scrollTop=100000

#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="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js_="var q=document.documentElement.scrollTop=0"
driver.execute_script(js_)
time.sleep(3)
driver.quit()

cookie 处理
webdriver 操作 cookie 的方法有:
get_cookies() 获得所有 cookie 信息
get_cookie(name)返回特定 name 有 cookie 信息
add_cookie(cookie_dict) 添加 cookie,必须有 name 和 value 值
delete_cookie(name) 删除特定(部分)的 cookie 信息
delete_all_cookies()删除所有 cookie 信息

for cookie in driver.get_cookies():
    print "%s -> %s" % (cookie['name'], cookie['value'])

获取测试对象的属性能够帮我们更好的进行对象的定位。比如页面上有很多标签为input 元素,而我
们需要定位其中 1 个有具有 data-node 属性不一样的元素。由于 webdriver 是不支持直接使用 data-node
定位对象的,所以我们只能先把所有标签为 input 都找到,然后遍历这些 input,获取想要的元素

<input type="checkbox" data-node="594434499" data-convert="1" data-type="file">
<input type="checkbox" data-node="594434498" data-convert="1" data-type="file">
<input type="checkbox" data-node="594434493" data-convert="1" data-type="file">
<input type="checkbox" data-node="594434497" data-convert="1" data-type="file">
# 选择页面上所有的 tag name 为 input 的元素
inputs = driver.find_elements_by_tag_name('input')
#然后循环遍历出 data-node 为594434493的元素,单击勾选
for input in inputs:
    if input.get_attribute('data-node') == '594434493':
        input.click()

验证码问题

  • 处理验证码的几种方法
  • 去掉验证码
  • 设置万能码
  • 验证码识别技术 通过 Python-tesseract 来识别图片验证码
  • 记录 cookie
    通过向浏览器中添加 cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。我们可以在
    用户登录之前,通过 add_cookie()方法将用户名密码写入浏览器 cookie ,再次访问系统登录链接将自
    动登录
....
#访问 xxxx 网站
driver.get("http://www.xxxx.cn/")
#将用户名密码写入浏览器 cookie
driver.add_cookie({'name':'Login_UserNumber', 'value':'username'})
driver.add_cookie({'name':'Login_Passwd', 'value':'password'})
#再次访问 xxxx 网站,将会自动登录
driver.get("http://www.xxxx.cn/")
time.sleep(3)
....
driver.quit()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eddey666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值