selenium模拟登录示例

案例1 登录B站

开发语言:Python3.6.5
框架:
selenium自动化测试工具+Chrome浏览器
PIL图形处理库

实现逻辑:
使用selenium驱动Chrome浏览器,访问登录首页,浏览器渲染页面后获取用户和密码输入框,使用selenium自动输入用户名、密码,然后点击登录。最后使用selenium自动完成滑块验证码的验证,完成自动化登录。

页面分析:

  1. 登录页面没有iframe技术,所以不用switch_to.frame
  2. 滑块验证码–验证
  3. selenium库的使用方法
    selenium模拟登录示例_第1张图片
import selenium
#package:
#common
    #exceptions 
#webdriver
    #chrome
    #firefox
    #ie
    #opera
    #phantomjs...
    #common
        #action_chains
#导入web驱动
from selenuim.webdriver import Chrome
from selenium.webdriver import Firefox
from selenium.webdriver import Opera
from selenium.webdriver import Ie
from selenium.webdriver import Safari
#使用Chrome浏览器
#打开浏览器
browser = Chrome()

这里需要使用ActionChains类做一些鼠标的操作,具体使用方法如下:

action_chains = ActionChains(browser)
action_chains.click(node) #在当前元素上,点击一次左键
action_chains.click()#无参时在鼠标的当前位置,点击一次左键
action_chains.click_and_hold(node)#点击左键,不起来
action_chains.context_click(node)#右键一次
action_chains.double_click(node)#双击左键
action_chains.drag_and_drop(node1,node2)#拖拽node1到弄node2上
action_chains.drag_and_drop_by_offset(node,xoffset,yoffset) #拖拽node移动一段距离,瞬间完成

#因为是模拟人点击滑动,所以先click_and_hold,然后每次移动一点move_by_offset
action_chains.click_and_hold(node).perform()
#使用新对象移动
ActionChains(browser).move_by_offset(xoffset,yoffset).perform()
#最后释放
action_chains.pause(0.5).release().perform()
每个动作都要.perform()来执行

碰到的问题:

  1. 驱动版本不支持当前浏览器版本
    查看浏览器版本–>右上角三个点–>帮助–>关于Google Chrome
    版本 92.0.4515.131(正式版本) (64 位)
    下载对应版本的驱动:
    具体方式参考
    问题成功解决!!

  2. 滑块验证码,且缺口位置随机变化,很难确定滑动的距离。
    解决:找到验证码所在的位置,获取完整背景图和带缺口的图,对比两张图形的像素,获取滑块到缺口的距离。然后模拟人滑动滑块到缺口位置,完成验证。

项目代码

局部:

from selenium.webdriver import Chrome
url = "https://passport.bilibili.com/login?from_spm_id=333.788.top_bar.login"

#open browser
browser = Chrome()
#get request
browser.get(url)
browser.maximize_window()
#input username and pwd
#give time to browser to load page
time.sleep(random.uniform(1,3))

#no iframe here,so no need to switch_to
browser.find_element_by_xpath('//*[@id="login-username"]').send_keys("user")
time.sleep(random.uniform(1,2))
browser.find_element_by_xpath('//*[@id="login-passwd"]').send_keys("pwd")
time.sleep(random.uniform(0,1))
#click to login
browser.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]').click()

完整项目代码

你可能感兴趣的:(爬虫,selenium,爬虫)