关于python Selenium自动化测试进行网站登陆界面识别验证码
我在做毕业论文的时候,苦于寻找识别验证码的手段进行后续的自动化测试,但是我在搜索+ai无果后,偶然翻出以前写过的自动化测试,发现居然已经是实现成功,仅需要修改一下元素地址
大家如果需要的话,直接通过修改带有中文提示的地方,我都已经做了提醒是关于要哪个元素的地址,很清晰,如果不懂的可以在评论区留言一下,我自己也不是很懂,只是之前找到的,如果能帮助各位也是可以的
代码如下:
import unittest
import ddddocr
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
#import HTMLTestRunner
class Test(unittest.TestCase):
@classmethod
def setUpClass(self):
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
# 指定 Chrome 浏览器的路径
chrome_path = r'chrome.exe的路径'
# 创建 Chrome 选项对象
chrome_options = Options()
chrome_options.binary_location = chrome_path # 设置 Chrome 浏览器的路径
# 创建 ChromeDriver 服务
chromedriver_path = r'chromedriver.exe路径'
service = Service(executable_path=chromedriver_path)
# 启动浏览器
self.driver = webdriver.Chrome(service=service, options=chrome_options)
self.driver.get("登陆页面的地址")
self.wait = WebDriverWait(self.driver, 10)
def test_login(self):
# 此处是账号
username="账号"
# 此处是密码
password="密码"
sleep(2)
self.wait.until(EC.presence_of_element_located((By.XPATH, '账号输入框的xpath'))).send_keys(username)
sleep(2)
self.wait.until(EC.presence_of_element_located((By.XPATH, '密码输入框的xpath'))).send_keys(password)
img = self.driver.find_element(By.XPATH,'验证码的xpath')
img.screenshot('image.png')
ocr = ddddocr.DdddOcr(old=True)
with open("image.png", 'rb') as f:
image = f.read()
# 将识别后的验证码4位数存储进res变量
res = ocr.classification(image)
self.wait.until(EC.presence_of_element_located((By.XPATH, '输入验证码的xpath'))).send_keys(res)
sleep(2)
self.wait.until(EC.element_to_be_clickable((By.XPATH, '登陆按钮的xpath'))).click()
sleep(2)
self.assertTrue(True)
sleep(5)
if __name__ == "__main__":
report_path = 'test_report.html'
with open(report_path, 'wb+') as report_file:
suite = unittest.TestLoader().loadTestsFromTestCase(Test)
#runner = HTMLTestRunner.HTMLTestRunner(stream=report_file, title='Test gdcp', description='Test Results')
#runner.run(suite)
关于库的下载我也给大家准备了镜像源
pip install xxxxx -i https://pypi.tuna.tsinghua.edu.cn/simple
大家把需要的库放在xxxxx中就可以了
例如:
pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple
关于最下面的htmlTestRunner的话是生成html测试报告的,但是我不知道为什么生成不了还是说生成在哪里,如果有需要的同学需要自己了解一下,所以我注释掉了
简单来说,这个代码是挺简单的,如果需要的同学请看下面解读,给答辩的同学讲讲原理(可能不太对,如果错了不要喷,我只能说我自己理解+ai的)
首先先讲库
import unittest
#Python 内置的单元测试框架,用于编写、组织测试用例,实现自动化测试。
import ddddocr
#用于识别图像文字(如验证码)的第三方库。
from selenium.webdriver.common.by import By
#selenium 中定位网页元素的策略指定类,确定按何种方式找元素。
from selenium.webdriver.support.ui import WebDriverWait
#在 selenium 里设置等待条件与超时时间,确保页面准备好再操作。
from selenium.webdriver.support import expected_conditions as EC
#定义页面、元素状态期望条件,配合等待使用。
from time import sleep
#让程序暂停执行一段时间的 Python 标准库函数。
from selenium import webdriver
#用于网页自动化操作、测试的强大库,可驱动浏览器操作网页。
from selenium.webdriver.chrome.options import Options
#配置 Chrome 浏览器启动选项的类,按需定制启动状态。
from selenium.webdriver.chrome.service import Service
#管理 Chrome 浏览器驱动服务的类,保障驱动正常运行。
#import HTMLTestRunner
#测试报告的库,好像要单独下载,pip下载不了
然后到配置浏览器启动
def setUpClass(self):
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
# 指定 Chrome 浏览器的路径
chrome_path = r'chrome.exe的路径'
# 创建 Chrome 选项对象
chrome_options = Options()
chrome_options.binary_location = chrome_path # 设置 Chrome 浏览器的路径
# 创建 ChromeDriver 服务
chromedriver_path = r'chromedriver.exe路径'
service = Service(executable_path=chromedriver_path)
# 启动浏览器
self.driver = webdriver.Chrome(service=service, options=chrome_options)
self.driver.get("登陆页面的地址")
self.wait = WebDriverWait(self.driver, 10)
创建了 ChromeOptions 对象,并且通过 add_experimental_option 方法设置了 detach 为 True,这样浏览器在运行完相关操作后不会自动关闭,方便查看结果等,但是实际上好像也没啥用,还是自动关闭了
指定了 chrome.exe
的实际路径,也就是明确了要使用的 Chrome 浏览器所在位置,把这个路径设置到 ChromeOptions
对象里。
注意安装chromedriver要看好自己浏览器版本,如果安装版本不一样不能用!!!!
然后确定 chromedriver.exe
的路径,并基于此创建了 Service
对象,这个对象是用来管理 Chrome 浏览器驱动服务的。
最后,使用前面配置好的选项和服务启动 Chrome 浏览器,打开指定的登陆页面地址,同时还创建了一个 WebDriverWait
对象,设置最长等待时间为 10 秒,方便后续在操作页面元素时根据需要等待元素加载等情况出现。
def test_login(self):
# 此处是账号
username="账号"
# 此处是密码
password="密码"
sleep(2)
self.wait.until(EC.presence_of_element_located((By.XPATH, '账号输入框的xpath'))).send_keys(username)
sleep(2)
self.wait.until(EC.presence_of_element_located((By.XPATH, '密码输入框的xpath'))).send_keys(password)
img = self.driver.find_element(By.XPATH,'验证码的xpath')
img.screenshot('image.png')
ocr = ddddocr.DdddOcr(old=True)
with open("image.png", 'rb') as f:
image = f.read()
# 将识别后的验证码4位数存储进res变量
res = ocr.classification(image)
self.wait.until(EC.presence_of_element_located((By.XPATH, '输入验证码的xpath'))).send_keys(res)
sleep(2)
self.wait.until(EC.element_to_be_clickable((By.XPATH, '登陆按钮的xpath'))).click()
sleep(2)
self.assertTrue(True)
sleep(5)
账号密码不多说
通过 WebDriverWait
结合期望条件 EC.presence_of_element_located
,依据账号输入框的 XPath
定位到该元素后,使用 send_keys
方法向账号输入框里填入之前定义好的用户名;再暂停 2 秒后,用同样的方式定位密码输入框,并填入密码。
EC.presence_of_element_located
就是等待直到指定定位方式(如通过 By.XPATH
、By.ID
、By.CLASS_NAME
等)能找到对应的元素,也就是元素已经在 DOM 中出现。就左下角第一个,一个矩形加个鼠标,点一下,你鼠标在页面移动过程中会有一种样式的显示,然后你碰一下例如最上面的国内版,检查的界面会自动帮你跳转到这个国内版文字所在的代码中(自己摸索,不太会讲),然后你右键-copy
建议复制完整的XPath
之后,依据验证码图片的 XPath
定位到验证码图片元素,使用 screenshot
方法将其截取保存为 image.png
文件。
接着实例化 dddocr
库的 DdddOcr
类,读取保存的验证码图片文件内容,再调用识别图片里的验证码,将识别出的 4 位验证码结果存储到 res
变量中。
把识别出的验证码填入相应输入框;再暂停 2 秒,等待登陆按钮可点击后进行点击操作
最后再暂停 5 秒,为了查看登录后的页面情况是否成功。
if __name__ == "__main__":
# 测试报告命名
report_path = 'test_report.html'
with open(report_path, 'wb+') as report_file:
suite = unittest.TestLoader().loadTestsFromTestCase(Test)
# runner = HTMLTestRunner.HTMLTestRunner(stream=report_file, title='Test gdcp', description='Test Results')
# runner.run(suite)
首先,使用 with open
语句以二进制读写模式(wb+
)打开了一个文件,这个文件的路径由 report_path
变量指定,并且把打开的这个文件对象命名为 report_file
。
然后呢,通过 unittest
模块里的 TestLoader
类创建了一个测试加载器对象,并用这个加载器对象去加载 Testgdcp
这个测试用例类里面定义的所有测试用例,将这些测试用例整合成一个测试套件(suite
),方便后续对这些测试用例进行统一的管理和执行之类的操作。
作者:TSL04