关于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.XPATHBy.IDBy.CLASS_NAME 等)能找到对应的元素,也就是元素已经在 DOM 中出现。
  • 如果不知道xpath怎么获取的,就是你普通页面右键,然后最下面有个检查,点进去有个这样的(我的是edge,谷歌的应该一样)
  • 就左下角第一个,一个矩形加个鼠标,点一下,你鼠标在页面移动过程中会有一种样式的显示,然后你碰一下例如最上面的国内版,检查的界面会自动帮你跳转到这个国内版文字所在的代码中(自己摸索,不太会讲),然后你右键-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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 关于python Selenium自动化测试进行网站登陆界面识别验证码

    发表回复