您当前的位置:首页 > 计算机 > 编程开发 > Python

Python Selenium 使用示例

时间:04-01来源:作者:点击数:

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高级运营经理 已经投递成功!

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门