0.基本:
from selenium import webdriver
driver=webdriver.Firefox() #获得火狐浏览器对象,IE:.Ie(),谷歌:.Chrome()
driver.get('http://www.baidu.com') #向浏览器发送网址
driver.find_element_by_id('kw').send_keys('hello') #输入
driver.find_element_by_id('kw').submit() #提交
driver.quit() #关闭
`1.定位元素:
(1)(定位单个元素)WebDriver提供了八种定位元素的方法,分别为:
find_element_by_id("id")
find_element_by_name("userName")
find_element_by_class_name("bg s_btn")
find_element_by_tag_name("input")
find_element_by_link_text("登录")
find_element_by_partial_link_text("很长") #<a>一个很长的链接</a>
find_element_by_xpath("/html/body/div[2]/form/input") #绝对路径
find_element_by_xpath("//input[@type='submit']") #属性
find_element_by_css_selector("form.fm>input#kw")
还可以这样写(其余以此类推):
from selenium.webdriver.common.by import By
find_element(By.ID,"id")
find_element(By.CLASS_NAME,"s_ipt")
(2)(定位一组元素),在定位单个元素的element后加上一个s:
inputs=driver.find_elements_by_tag_name('input') #所有input
for i in inputs:
if i.get_attribute('type')=='checkbox':
i.click() #若type属性为复选框则勾选
time.sleep(1)
cbs=driver.find_elements_by_css_selector('input[type=checkbox]')#所有复选框
for checkbox in cbs:
checkbox.click()
driver.find_elements_by_css_selector('input[type=checkbox]').pop().click()#去掉最后一个
#pop()或pop(-1)最后一个,pop(0)获取第一个,pop(1)第二个
`2.控制浏览器:
driver.back() #后退
driver.forward() #前进
driver.refresh() #刷新
元素操作:
clear() #清除文本
send_keys('hai') #模拟按键输入
click() #单击元素
submit() #提交表单
size #返回元素的尺寸
text #获取元素的文本
get_attribute('type') #获得属性值
is_displayed() #判断该元素是否可见
`3.鼠标事件:
from selenium.webdriver import ActionChains
mouse=driver.find_element_by_id('id')
ActionChains类常用方法:
perform() #执行所有ActionChains中存储的行为(提交鼠标操作)
ActionChains(driver).context_click(mouse).perform() #右击
ActionChains(driver).double_click(mouse).perform() #双击
ActionChains(driver).drag_and_drop(a,b).perform() #拖动,a源元素,b目标元素
ActionChains(driver).move_to_element(mouse).perform() #鼠标悬停
`4.键盘事件:
from selenium.webdriver.common.keys import Keys
driver.find_element_by_id('kw').send_keys('seleniumm') #输入
driver...('kw').send_keys(Keys.BACK_SPACE) #删除多输入的一个m
driver...('kw').send_keys(Keys.SPACE) #输入空格
driver...('kw').send_keys(Keys.CONTROL,'a') #ctrl+a全选
driver...('kw').send_keys(Keys.CONTROL,'x') #剪切
driver...('kw').send_keys(Keys.CONTROL,'v') #粘贴,('c'复制)
driver...('su').send_keys(Keys.ENTER) #回车
`5.设置元素等待:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element=WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,"kw"))) #显式等待
element.send_keys('selenium')
#element=WebDriverWait(driver,timeout=5,poll_frequency=0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,"submit"))) #driver:浏览器驱动,timeout:最长超时秒数,poll_frequency:检测间隔时长,ignored_exceptions:超时后的异常信息,until:直到返回为True(until_not:返回False)
driver.implicitly_wait(10) #隐式等待10秒
#expected_conditions类提供的预期条件判断的方法:
is_displayed() #判断元素是否可见,例如:
el=driver.find_element_by_id('kw')
if el.is_displayed(): print('此元素可见')
title_is #判断当前页面的标题是否等于预期
title_contains #判断当前页面的标题是否包含预期字符串
presence_of_element_located #判断元素是否被加在DOM树里
visibility_of_element_located #判断元素是否可见
visibility_of #与上一个方法相同,只是上一个方法参数为定位,该方法参数为定位后的元素
presence_of_all_elements_located #判断是否至少有一个元素存在于DOM树中
text_to_be_present_in_element #判断某个元素中的text是否包含了预期的字符串
text_to_be_present_in_element_value #判断某个元素的value是否包含预期的字符串
frame_to_be_available_and_switch_to_it #判断该表单是否可以切换进去,若可以则返回True并switch进去,否则返回False
invisibility_of_element_located #判断某个元素是否不存在于DOM树或不可见
element_to_be_clickable #判断元素是否可见并且可以点击
staleness_of #等到一个元素从DOM树中移除
element_to_be_selected #判断某个元素是否被选中,常用于下拉列表
element_selection_state_to_be #判断某元素的选中状态是否符合预期
element_located_selection_state_to_be #与上一个方法作用相同,上一个方法参数为定位后的元素,此方法参数为定位
alert_is_present #判断页面上是否存在alert
`6.多表单切换and多窗口切换
(1).表单切换: #在web应用中常有frame/iframe表单嵌套的应用
driver.switch_to.frame("if") #切换到<iframe id="if"...>
#switch_to.frame()默认可以取表单的id或name属性,若没有则用如下方法:
xf=driver.find_element_by_xpath('//*[@class="if"]')
driver.switch_to.frame(xf) #将定位对象传入
#若完成了当前表单操作,则可以通过如下方法跳出:
driver.switch_to.parent_content() #跳出当前一级表单
driver.switch_to.default_content() #跳回最外层页面
(2).窗口切换:
search_handle=driver.current_window_handle #获得当前窗口句柄
driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text('立即注册').click()
all_handles=driver.window_handles #获得所有打开的窗口句柄
for handle in all_handles:
if handle==search_handle:
driver.switch_to.window(handle) #回到之前窗口
`7.警告框处理and上传文件与下载文件:
(1).警告框(使用switch_to_alert()方法定位):
driver.switch_to_alert().accept() #接受警告框
text #返回 alert/confirm/prompt 中的文字信息
accept() #接受现有警告框
dismiss() #解散现有警告框
send_keys(keysToSend) #发送文本至警告框
(2).上传文件:
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')
#还可用Autolt实现上传与下载,这里暂不记载
(3).下载文件:
import os
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") #下载文件的类型
#以上这些参数设置可以在Firefox浏览器地址栏输入:about:config进行设置
driver=webdriver.Firefox(firefox_profile=fp)
driver.get("http://pypi.Python.org/pypi/selenium")
driver.find_element_by_partial_link_text("selenium-2").click()
`8 示例, 上中华英才网查询符合条件的职位, 并自动投递简历
import time
import configparser
from selenium import webdriver
class Zhyc(object):
""" 中华英才投递简历 """
def __init__(self):
config = configparser.ConfigParser()
config.read('user.conf')
# 用户名
self.name = config['USER']['username']
# 密码
self.pawd = config['USER']['password']
# 获得谷歌浏览器对象
self.driver = webdriver.Chrome()
self.new_urls = set() # 没有投递的URL
self.old_urls = set() # 已经投递的URL
def login(self):
''' 登录 '''
login_url = 'http://passport.chinahr.com/pc/tologin?backUrl=http://www.chinahr.com'
print('登录中...')
driver = self.driver
driver.implicitly_wait(10) #隐式等待10秒
driver.get(login_url)
driver.find_element_by_xpath('//*[@id="account"]').send_keys(self.name)
driver.find_element_by_xpath('//*[@id="secretPWD"]').send_keys(self.pawd)
driver.find_element_by_xpath('//*[@id="normalLogin"]').click()
time.sleep(1)
def jl_td(self):
''' 点击投递 '''
dr = self.driver
for i in range(1,21):
try:
try:
dr.find_element_by_xpath('//*[@id="searchList"]/div[2]/div[%s]'%i).click()
address = dr.find_element_by_xpath('//*[@id="searchList"]/div[2]/div[%s]/ul/li[2]/span[1]'%i).text
company_name = dr.find_element_by_xpath('//*[@id="searchList"]/div[2]/div[%s]/ul/li[1]/span[3]/a'%i).text
position_name = dr.find_element_by_xpath('//*[@id="searchList"]/div[2]/div[%s]/ul/li[1]/span[1]/a'%i).text
except:
break
time.sleep(1)
dr.switch_to_window(dr.window_handles[1]) # 切换到第二个标签页
time.sleep(1)
dr.find_element_by_xpath('/html/body/div[2]/div[1]/div[1]/div[3]').click() # 点击投递简历
print(address,company_name,position_name,'已经投递成功!')
time.sleep(1)
dr.close() # 关闭当前标签页
dr.switch_to_window(dr.window_handles[0]) # 切换到第一个标签页面
except Exception as e:
print(e)
try:
# 职位超过时间 已经失效
dr.find_element_by_xpath('/html/body/div[14]/div/div[3]/div').click()
finally:
dr.close()
dr.switch_to_window(dr.window_handles[0]) # 切换到第一个标签页面
def jl_dj(self):
''' 选择城市 '''
print('投递中...')
dr = self.driver
time.sleep(0.8)
for cs in [2,11,1,4,6]:
# 选择城市
dr.find_element_by_xpath('//*[@id="yc_tnav"]/div/div[1]/span/em').click()
time.sleep(0.5)
dr.find_element_by_xpath('//*[@id="citySelectDiv"]/div[2]/div[4]/div[1]/ul/li[%s]'%cs).click()
time.sleep(0.2)
# 搜索输入 python 并点击搜索
dr.find_element_by_xpath('//*[@id="b_keyword"]').send_keys('python')
dr.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[1]/div/input[3]').click()
time.sleep(1)
# 薪资选择 (若还有其他要求) 照样点击选择即可
dr.find_element_by_xpath('//*[@id="selection"]/div[6]/div[2]/dl/a[6]/dt').click()
time.sleep(0.3)
# 对每一个筛选出来的职位进行点击投递, 这里没有进行下一页查询, 有兴趣的朋友可以试试
self.jl_td()
if __name__ == '__main__':
zhyc = Zhyc()
zhyc.login()
zhyc.jl_dj()
执行结果:
登录中...
投递中...
[上海市/徐汇] 2年/本科 埃摩森网络科技(上海)有限公司 Python(爬虫工程师) 已经投递成功!
[上海市/徐汇] 2年/本科 上海富瀚微电子股份有限公司 高级IT工程师 已经投递成功!
[上海市/浦东] 2年/本科 上海分赢信息技术有限公司 APP高级运营经理 已经投递成功!