TAB 键自动补全
Alt+P 回退到上一次编辑的 Python 代码,Alt+ N 与之相反,可以前进至下一次编辑的代码
#coding=utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://192.168.10.80/common/login")
driver.find_element_by_id("loginName").send_keys("HZ00305")
driver.find_element_by_id("loginPwd").send_keys("123456")
driver.find_element_by_id("loginCode").send_keys("CL30")
driver.find_element_by_id("loginBtn").click()
#coding=utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Selenium2")
driver.find_element_by_id("su").click()
driver.quit()
谷歌浏览器出现chromedriver.exe已停止工作(谷歌浏览器版本和驱动不符)
selenium之 chromedriver与chrome版本映射表(更新至v2.30)
http://blog.csdn.net/huilan_same/article/details/51896672
所有chromedriver均可在下面链接中下载到:
http://chromedriver.storage.googleapis.com/index.html
python
%s(string)只能打印字符串,如果想打印数字,那么就要使用%d(data)。
有时候我们并不知道自己要打印的是什么类型的数据,那么可以用%r来表示。
>>> name = "zhangsan"
>>> print "hello %s ,Nice to meet you!" %name
hello zhangsan ,Nice to meet you!
>>> age=27
>>> print "You are %d !" %age
>>> n = 100
>>> print "You print is %r ." %n You print is 100 .
>>> n = "abc"
>>> print "You print is %r ." %n You print is 'abc' .
*input矫情 (raw_input任何类型的输入都可以接收)
#coding=utf-8
n = input("Enter any content:")
print "Your input is %r " %n
Python当中,不区分单引号('')与双引号(""),也就是说单、双引号都可以表示一个字符串。可嵌套,不可交叉
注释 #
*if 语句
#coding=utf-8
results=72
if results >= 90:
print u'优秀'
elif results >= 70:
print u'良好'
elif results >= 60 :
print u'及格'
else:
print u'不及格'
*for语句
循环数字要借助range()函数。
for i in range(1,10):
print i
如果我只想打印1到10之间的奇数:
for i in range(1,10,2): print i
range(start,end,scan) range()函数,start表示开始位置,end表示结束位置,scan表示每一次循环的步长。
数组
字典
>>> zidian = {"username":"password",'man':'woman',1:2}
>>> zidian.keys()
['username', 1, 'man']
>>> zidian.values()
['password', 2, 'woman']
>>> zidian.items()
[('username', 'password'), (1, 2), ('man', 'woman')]
函数
def关键字定义函数
def add(a=1,b=2): return a+b
方法和类
class A():
def add(self,a,b):return a+b
count=A()
print count.add(3,5)
创建了一个A()类,在类下面创建了一个add()方法。
方法的创建同样使用关键字def,维一不同的是方法必须有一个且必须是第一个默认参数self,
但是这个参数不用传值。
class A:
def add(self,a,b):return a+b
class B(A):
def sub(self,a,b):return a-b
count = B()
print count.add(4,5)
用count变量来等于B类,因为B类继承了A类,所以B类自然也拥有了add()方法,所以count可以调用add()方法。
模组(包/模块/头文件)
在Python语言中通过from...import...的方式引用模块
import time
print time.ctime()
time 模块下面有一个ctime()方法获得当前时间,如果确定了只会用到time下面的ctime()方法,那么可以这样:
from time import ctime
print ctime()
有时候我们还可能会用到time模块下面的sleep()休眠方法
一次性把time模块下面的所有方法都引入进来:
#coding=utf-8
from time import *
print ctime()
print "休息一两秒"
sleep(2)
print ctime()
异常
执行open()一个不存在的文件时会抛IOError异常
try:
open("abc.txt","r")
except IOError:
print "异常了!"
抛的是个NameError类型的错误
try:
print aa
except NameError:
print "这是一个name异常!"
在Python中所有的异常类都继承Exception,所以我们可以使用它来接收所有的异常。
try:
open("abc.txt",'r')
print aa
except Exception:
print "异常了!"
Exception 同样也继承 BaseException
try:
open("abc.txt",'r')
print aa
except BaseException:
print "异常了!"
msg 变量用于接收异常信息,通过 print 将其打印出来
try:
open("aaa.txt","r")
print aa
except BaseException,msg:
print msg
异常 描述
BaseException 新的所有异常类的基类
Exception 所有异常类的基类,但继承 BaseException 类
AssertionError assert 语句失败
AttributeError 试图访问一个对象没有属性
IOError 输入输出异常,试图打一个不存的文件(包括其它情况)时引起
NameError 使用一个还未赋值对象的变量
IndexError 在使用序列中不存在的所引进引发
IndentationError 语法错误,代码没有正确的对齐
KeyboardInterrupt Ctrl+C 被按下,程序被强行终止
TypeError 传入的对象类型与要求不符
SyntaxError Python 代码逻辑语法出错,不能执行
从定位元素开始
webdriver 提供了八种元素定位方法:
id
name
class name
tag name
link text
partial link text
xpath
css selector
在 Python 语言中对应的定位方法如下:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
控制浏览器器窗口大小
set_window_size
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://m.mail.10086.cn")
#参数数字为像素点
print "设置浏览器宽480、高800显示"
driver.set_window_size(480, 800)
driver.quit()
希望浏览器在全屏幕模式下执行,可以使用 maximize_window()方法,
用法与 set_window_size() 相同,但它不需要传参
driver.maximize_window()最大化浏览器
控制浏览器后退、前进
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()
#coding=utf-8
from selenium import webdriver
driver=webdriver.Chrome()
A="http://www.baidu.com"
driver.get(A)
print "now access %s"%A
B="http://news.baidu.com"
driver.get(B)
print "now access %s"%B
driver.back()
driver.forward()
driver.quit()
简单元素操作
clear() 清除文本,如果是一个文件输入框
send_keys(*value) 在元素上模拟按键输入
click() 单击元素
WebElement 接口常用方法
submit
submit()方法用于提交表单,特别用于没提交按钮的情况,相当于“回车”操作
#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()
size 返回元素的尺寸。
text 获取元素的文本。
get_attribute(name) 获得属性值。
is_displayed() 设置该元素是否用户可见。
#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()
鼠标事件
ActionChains 类提供的鼠标操作的常用方法:
perform() 执行所有ActionChains中存储的行为
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停
鼠标右击操作
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()
....
fromselenium.webdriver import ActionChains
对于 ActionChains 类下面的方法,在使用之前需要先将模块导入。
ActionChains(driver)
调用 ActionChains()方法,在使用将浏览器驱动 driver 作为参数传入。
context_click(right_click)
context_click()方法用于模拟鼠标右键事件,在调用时需要传入右键的元素。
perform()
执行所有 ActionChains 中存储的行为,可以理解成是对整个操作事件的提交动作
鼠标悬停
move_to_element()方法可以模拟鼠标悬停的动作,其用法与 context_click()相同
#coding=utf-8
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_link_text("设置")
ActionChains(driver).move_to_element(above).perform()
鼠标双击操作
double_click(on_element)方法用于模拟鼠标双击操作,用法同上
……
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()
....
鼠标推放拖拽操作
drag_and_drop(source,target)在源元素上按下鼠标左键,然后移动到目标元素上释放。
source: 鼠标拖动的源元素。
target: 鼠标释放的目标元素
……
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()
....
键盘事件
#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()
fromselenium.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
driver = webdriver.Firefox()
driver.get("http://www.126.com")
print 'Before login================'
#打印当前页面title
title = driver.title
print title
#打印当前页面URL
now_url = driver.current_url
print now_url
#执行邮箱登录
driver.find_element_by_id("idInput").clear()
driver.find_element_by_id("idInput").send_keys("username")
driver.find_element_by_id("pwdInput").clear()
driver.find_element_by_id("pwdInput").send_keys("password")
driver.find_element_by_id("loginBtn").click()
print 'After login================'
#再次打印当前页面title
title = driver.title
print title
#打印当前页面URL
now_url = driver.current_url
print now_url
#获得登录的用户名
user = driver.find_element_by_id('spnUid').text
print user
driver.quit()
driver.title
title 用于获得当前页面的标题。
driver.current_url
current_url 用户获得当页面的 URL。
设置元素等待
显式等待
#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 秒
gnored_exceptions -超时后的异常信息,默认情况下抛 NoSuchElementException 异常
WebDriverWait() 一般由 until()(或 until_not())方法配合使用
Expected Conditions
在本例中,我们在使用 expected_conditions 类时对其时行了重命名,通过 as 关键字对其重命名为 EC,
并调用 presence_of_element_located()判断元素是否存在
expected_conditions 类提供一些预期条件的实现。
title_is 用于判断标题是否 xx。
title_contains 用于判断标题是否包含 xx 信息。
presence_of_element_located 元素是否存在。
visibility_of_element_located 元素是否可见。
visibility_of 是否可见
presence_of_all_elements_located 判断一组元素的是否存在
text_to_be_present_in_element 判断元素是否有 xx 文本信息
text_to_be_present_in_element_value 判断元素值是否有 xx 文本信息
frame_to_be_available_and_switch_to_it 表单是否可用,并切换到该表单。
invisibility_of_element_located 判断元素是否隐藏
element_to_be_clickable 判断元素是否点击,它处于可见和启动状态
staleness_of 等到一个元素不再是依附于 DOM。
element_to_be_selected 被选中的元素。
element_located_to_be_selected 一个期望的元素位于被选中。
element_selection_state_to_be 一个期望检查如果给定的元素被选中。
element_located_selection_state_to_be 期望找到一个元素并检查是否选择状态
alert_is_present 预期一个警告信息
隐式等待
隐式等待是通过一定的时长等待页面所有元素加载完成。哪果超出了设置的时长元素还没有被加载则抛出
NoSuchElementException 异常。
WebDriver 提供了 implicitly_wait()方法来实现隐式等待,默认设置为 0。
#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()
在上面的例子中,显然百度输入框的定位 id=kw22 是有误的,那么在超出 10 秒后将抛出异常。
sleep 休眠方法
#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()
★正则表达式
在python正则表达式语法中,Python中字符串前面加上 r 表示原生字符串,
用\w表示匹配字母数字及下划线。re模块下findall方法返回的是一个匹配子字符串的列表。
# coding=utf-8
from selenium import webdriver
import re
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
driver.get("http://home.baidu.com/contact.html")
# 得到页面源代码
doc = driver.page_source
emails = re.findall(r'[\w]+@[\w\.-]+',doc) # 利用正则,找出 [email protected] 的字段,保存到emails列表
# 循环打印匹配的邮箱
for email in emails:
print (email)
1. 查看页面的源代码,在Selenium中有driver.page_source 这个方法得到
2. Python中利用正则,需要导入re模块
3. for email in emails :
print email
driver.refresh()刷新当前页面
打开一个新的tab
ctrl+ t
from selenium.webdriver.common.keys import Keys
。。。
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
。。
?send_keys(Keys.CONTROL,'t')
定位一组元素
#coding=utf-8
from selenium import webdriver
import os
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('checkbox.html')
driver.get(file_path)
# 选择页面上所有的tag name为input的元素
inputs = driver.find_elements_by_tag_name('input')
#然后从中过滤出tpye为checkbox的元素,单击勾选
for i in inputs:
if i.get_attribute('type') == 'checkbox':
i.click()
driver.quit()
因为通过浏览器打开的是一个本地的 html 文件,所以需要用到 Python 的 os 模块,
path.abspath()方法用于获取当前路径下的文件。
checkbox/radio复选框/单选框
find_elements是不能直接点击的,它是复数的,所以只能先获取到所有的checkbox对象,然后通过for循环去一个个点击操作
多表单切换
switch_to_frame() 方法
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://mail.qq.com/")
driver.switch_to_frame("login_frame")
a=driver.find_element_by_link_text("帐号密码登录")
ActionChains(driver).click(a).perform()
switch_to_frame()默认可以直接去表单的id或name属性进行切换,如果没有id/name,
可以通过xpath定位到iframe,再将定位对象传给switch_to_frame()方法
......
xf = driver.find_element_by_xpath('//*[@class="if"]')
driver.switch_to_frame(xf)
......
driver.switch_to_default_content()
可以通过 switch_to_default_content()方法返回上一层表单
该方法不用指定某个表单的返回,默认对应与它最近的 switch_to_frame()方法
嵌套frame的操作(switch_to.parent_frame())
html>