目录前言一、使用cv2解析验证码识别方式二、浏览器复用(Debug模式启动浏览器)三、直接绕过登录前言使用到的第三方库请自行pip install 库名import pytesseract # pip install pytesseract from PIL import Image import cv2 as cv # pip install opencv_python import faker from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as ec import os import time from selenium import webdriver一、使用cv2解析验证码识别方式如果你的图像是base64位数据流请移步,其中有相应的函数方法解析,在这里就过多聊了直接上源码关于base64位滑块图片与UI自动化滑块解决方法_阿飞797的博客-CSDN博客def register_verification_code(): driver = webdriver.Chrome() # 实例化浏览器对象 driver.maximize_window() wait = WebDriverWait(driver, 5) # 实例化等待对象 register_url = "URL" # 项目URL driver.get(register_url) # 在新的窗口打开url # 随机生成手机号码 phone_number = faker.Faker(locale="zh_CN").phone_number() # 通过手机号码获取6位数据 password = phone_number[0:6] # 显性等待手机号码输入框元素并进行输入内容 locator = ("id", "txtUName") wait.until(ec.visibility_of_element_located(locator)).send_keys(phone_number) # 显性等待密码输入框元素并进行输入内容 locator = ("id", "txtPassword") wait.until(ec.visibility_of_element_located(locator)).send_keys(password) # 定位验证码元素,并进行验证码图像存储 file_name = "imgVerify.png" driver.find_element(value="chkd").screenshot(file_name) # 对存储的验证码进行均值迁移去噪声,然后二值化处理,最终覆盖源文件,进行存储 image = cv.imread(file_name) blurred = cv.pyrMeanShiftFiltering(image, 10, 100) gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY) t, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) cv.imwrite(file_name, binary) # 使用 PIL 打开图像转化为图像对象,并使用 pytesseract 进行图像识别验证码 image = Image.open(file_name) img_str = pytesseract.image_to_string(image) # 输入识别的验证码 driver.find_element(value="TxtChkCode").send_keys(img_str) # 显性等待注册按钮元素并进行点击 locator = ("id", "btnRegister") wait.until(ec.visibility_of_element_located(locator)).click() # 显性等待url地址发生了变化 wait.until(ec.url_changes(register_url)) if __name__ == '__main__': register_verification_code()使用cv2中的图像识别解析出图像中的数字或字母,该方式有相应的限制就是背景图比较杂乱的话识别出来的字符串可能不是图片上的所以可以做注册成功或者登录成功的判断循环注册或者登录成功的标准性元素PS:如果是爬虫的请设置浏览器头部信息躲避检测二、浏览器复用(Debug模式启动浏览器)Selenium启动浏览器默认是会清除所有缓存的,所以系统如果有需要登陆验证的,每次全部都要验证一遍。我们可以让Selenium直接用带有缓存的浏览器,就像我们使用本机浏览器一样,去访问系统。常规系统,比如淘宝、携程,只要完成一次登陆验证,后续登陆是不会再有验证码的。通过Debug模式启动谷歌浏览器,就能达到这个效果。并且Debug模式的浏览器,还可以在自动化过程中实现复用浏览器来提高调试效率:1.当运行 selenium 自动化时,要求已经登录才能才做。这个时候我们可以提前登录,运行脚本的时候复用已经打开的浏览器。2.当调试了某个步骤很多的测试用例,前面N-1步已经成功,只需调试第N步。如果从头开始运行脚本,耗时过多,这时我们可以直接复用浏览器只操作第N步。复用浏览器的特点:webdriver启动时将不再创建新的浏览器窗口 将运用已打开的浏览器的当前页面,对元素的进行操作 。废话不多说直接上源码# 加载浏览器其中 os.popen("快捷方式路径") time.sleep(5) options = webdriver.ChromeOptions() options.debugger_address = "127.0.0.1:12138" driver = webdriver.Chrome(options=options) # 这里需要先运行启动浏览器,在频闭以上代码后再运行get之后的操作 driver.get("url") #即可该方法需要配置浏览器的快捷方式至PC的系统变量中去PS(找到goole的快捷打开方式地址:一般都在C盘的Program Files (x86)中,看个人的下载地址,没有改下载地址的应该是:C:\Program Files (x86)\Google\Chrome\Application)把该至添加至PC的系统变量中,再新建一个txt文本把 chrome.exe --remote-debugging-port=12138 该命令行复制进去把文件后缀改成.bat可执行文件,如在CMD看看chrome是否可以运行打开浏览器源码中的浏览器器路径就是该可执行文件的路径三、直接绕过登录PS:该方法也是最不想说的方式直接通过访问登录时候的URL去进行之后的操作,该方式限制就是需要把登录后访问的URL请求需要传的值以及是头和各项参数,详细的请问项目前端,就是通过直接drv.get(登录后的浏览器URL)。在前方设置drv访问这个URL需要传参,以及限制即可(本人项目中没有好的例子就不放源码了,敲也不想敲嫌弃)任性!!!哼😕
目录前言一、使用cv2解析验证码识别方式二、浏览器复用(Debug模式启动浏览器)三、直接绕过登录前言使用到的第三方库请自行pip install 库名import pytesseract # pip install pytesseract from PIL import Image import cv2 as cv # pip install opencv_python import faker from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as ec import os import time from selenium import webdriver一、使用cv2解析验证码识别方式如果你的图像是base64位数据流请移步,其中有相应的函数方法解析,在这里就过多聊了直接上源码关于base64位滑块图片与UI自动化滑块解决方法_阿飞797的博客-CSDN博客def register_verification_code(): driver = webdriver.Chrome() # 实例化浏览器对象 driver.maximize_window() wait = WebDriverWait(driver, 5) # 实例化等待对象 register_url = "URL" # 项目URL driver.get(register_url) # 在新的窗口打开url # 随机生成手机号码 phone_number = faker.Faker(locale="zh_CN").phone_number() # 通过手机号码获取6位数据 password = phone_number[0:6] # 显性等待手机号码输入框元素并进行输入内容 locator = ("id", "txtUName") wait.until(ec.visibility_of_element_located(locator)).send_keys(phone_number) # 显性等待密码输入框元素并进行输入内容 locator = ("id", "txtPassword") wait.until(ec.visibility_of_element_located(locator)).send_keys(password) # 定位验证码元素,并进行验证码图像存储 file_name = "imgVerify.png" driver.find_element(value="chkd").screenshot(file_name) # 对存储的验证码进行均值迁移去噪声,然后二值化处理,最终覆盖源文件,进行存储 image = cv.imread(file_name) blurred = cv.pyrMeanShiftFiltering(image, 10, 100) gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY) t, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) cv.imwrite(file_name, binary) # 使用 PIL 打开图像转化为图像对象,并使用 pytesseract 进行图像识别验证码 image = Image.open(file_name) img_str = pytesseract.image_to_string(image) # 输入识别的验证码 driver.find_element(value="TxtChkCode").send_keys(img_str) # 显性等待注册按钮元素并进行点击 locator = ("id", "btnRegister") wait.until(ec.visibility_of_element_located(locator)).click() # 显性等待url地址发生了变化 wait.until(ec.url_changes(register_url)) if __name__ == '__main__': register_verification_code()使用cv2中的图像识别解析出图像中的数字或字母,该方式有相应的限制就是背景图比较杂乱的话识别出来的字符串可能不是图片上的所以可以做注册成功或者登录成功的判断循环注册或者登录成功的标准性元素PS:如果是爬虫的请设置浏览器头部信息躲避检测二、浏览器复用(Debug模式启动浏览器)Selenium启动浏览器默认是会清除所有缓存的,所以系统如果有需要登陆验证的,每次全部都要验证一遍。我们可以让Selenium直接用带有缓存的浏览器,就像我们使用本机浏览器一样,去访问系统。常规系统,比如淘宝、携程,只要完成一次登陆验证,后续登陆是不会再有验证码的。通过Debug模式启动谷歌浏览器,就能达到这个效果。并且Debug模式的浏览器,还可以在自动化过程中实现复用浏览器来提高调试效率:1.当运行 selenium 自动化时,要求已经登录才能才做。这个时候我们可以提前登录,运行脚本的时候复用已经打开的浏览器。2.当调试了某个步骤很多的测试用例,前面N-1步已经成功,只需调试第N步。如果从头开始运行脚本,耗时过多,这时我们可以直接复用浏览器只操作第N步。复用浏览器的特点:webdriver启动时将不再创建新的浏览器窗口 将运用已打开的浏览器的当前页面,对元素的进行操作 。废话不多说直接上源码# 加载浏览器其中 os.popen("快捷方式路径") time.sleep(5) options = webdriver.ChromeOptions() options.debugger_address = "127.0.0.1:12138" driver = webdriver.Chrome(options=options) # 这里需要先运行启动浏览器,在频闭以上代码后再运行get之后的操作 driver.get("url") #即可该方法需要配置浏览器的快捷方式至PC的系统变量中去PS(找到goole的快捷打开方式地址:一般都在C盘的Program Files (x86)中,看个人的下载地址,没有改下载地址的应该是:C:\Program Files (x86)\Google\Chrome\Application)把该至添加至PC的系统变量中,再新建一个txt文本把 chrome.exe --remote-debugging-port=12138 该命令行复制进去把文件后缀改成.bat可执行文件,如在CMD看看chrome是否可以运行打开浏览器源码中的浏览器器路径就是该可执行文件的路径三、直接绕过登录PS:该方法也是最不想说的方式直接通过访问登录时候的URL去进行之后的操作,该方式限制就是需要把登录后访问的URL请求需要传的值以及是头和各项参数,详细的请问项目前端,就是通过直接drv.get(登录后的浏览器URL)。在前方设置drv访问这个URL需要传参,以及限制即可(本人项目中没有好的例子就不放源码了,敲也不想敲嫌弃)任性!!!哼😕