背景:
一直想尝试用 Python+Selenium+ddddocr 来实现登录,但是每次到验证码这关就难住了,在网上大部分识别验证码的Python文章都是大段篇幅,让我这个小菜鸟无法下手。今天终于通过30行的代码实现了:通过UI自动化,可以输入账号,密码,可以识别简单的验证码 ,点击登录按钮,成功登录页面 。
前提:
- 已安装python <= 3.9 版本(我之前安装的是3.10.x版本,不行,友友们必须要下载python <= 3.9的版本)
- 导入 selenium 包
- 导入 ddddocr 包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ddddocr
代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
import ddddocr
# 不自动关闭浏览器
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
# 注意此处添加了chrome_options参数
# 访问登录页面
driver = webdriver.Chrome(chrome_options=option)
driver.get('http://登录页面URL')
# 获取验证码,存储为本地图片
img = driver.find_element(By.XPATH,'/html/body/div[1]/div/div/div[2]/div/div/div/form/div[1]/div[3]/div[1]/div[4]/div[2]/img')
# 将获取的图片命名为7.png
img.screenshot('7.png')
# 通过ddddocr包识别验证码
ocr = ddddocr.DdddOcr(old=True)
with open("7.png", 'rb') as f:
image = f.read()
# 将识别后的验证码4位数存储进res变量
res = ocr.classification(image)
# 定位用户名,密码输入框,验证码
username = driver.find_element(By.ID, 'username')
password = driver.find_element(By.ID, 'password')
inputcode = driver.find_element(By.ID, 'inputCode')
# 将自己的用户名密码替换xxxxxx
username.send_keys('Seven')
password.send_keys('Seven1234.')
inputcode.send_keys(res)
# 定位登录按钮并点击
driver.find_element(By.XPATH, '/html/body/div[1]/div/div/div[2]/div/div/div/form/div[2]/div/div/span/button').click()
注解:
获取元素的几种方式:
通过浏览器驱动获取 单个元素页面元素的8种方式
(1) 通过webdriver对象的find_element方法
通过 id获取元素
el = driver.find_element(By.ID, ‘id’)
通过 name获取元素
el = driver.find_element(By.NAME, ‘name’)
通过 className获取元素
el = driver.find_element_by_class_name(className)
通过 tagName获取元素
el = driver.find_element(By.TAG_NAME, ‘tagName’)
通过 xpath获取元素
el = driver.find_element(By.XPATH, ‘xpath’)
通过 css获取元素
el = driver.find_element(By.CSS_SELECTOR, ‘css’)
通过 link_text 获取元素
el = driver.find_element(By.LINK_TEXT, ‘linkText’)
通过 partial_link_text获取元素
el = driver.find_element(By.PARTIAL_LINK_TEXT, ‘linkPartText’)
(2) 通过webdriver对象的find_element_by_xx(" ")
*在selenium的4.0版本中此种用法已经抛弃,不推荐使用
通过 id获取元素
el = driver.find_element_by_id(id)
通过 name获取元素
el = driver.find_element_by_name(name)
通过 className获取元素
el = driver.find_element_by_class_name(className)
通过 tagName获取元素
el = driver.find_element_by_tag_name(tagName)
通过 xpath获取元素
el = driver.find_element_by_xpath(xpath)
通过 css获取元素
el = driver.find_element_by_css_selector(css)
通过 link_text 获取元素
el = driver.find_element_by_link_text(linkText)
通过 partial_link_text获取元素
el = driver.find_element_by_partial_link_text(linkPartText)
定位策略
ID:id是指页面元素的属性名id值,因为元素id在整个页面中是唯一的,所以如果元素有id属性,通过id定位是首选的方式。如果 id 不唯一则不建议使用。
NAME:通过元素的name属性进行定位。
CLASS NAME:通过元素的class name属性进行定位。
TAG NAME:通过元素名定位,基本不用,因为相同的tagname太多。
LINK_TEXT:通过链接文本内容全匹配。
PARTIAL LINK:通过链接文本内容模糊匹配。
CSS:css_selector定位。
XPATH:通过xpath表达式定位,鼠标右键元素 → 点击检查 → 查看开发者工具中的元素
→ 鼠标悬浮在对应代码上,页面上对应的元素被选中 → 通过以下方式复制完整 xpath(懒人福音,不用手写,也不怕写错)
识别验证码
ddddocr 包开发者个人博客:wenanzhe.com
里面有他的两篇博文,感兴趣的可以过去看看~