关于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 ),方便后续对这些测试用例进行统一的管理和执行之类的操作。

<think>嗯,用户想用Selenium测试优快云登录弹窗的密码登录功能。首先,我需要确定弹窗是HTML元素,而不是浏览器原生的弹窗。可能需要用Selenium的WebDriverWait来等待弹窗出现,然后定位元素。 可能需要先访问优快云首页,点击登录按钮,这会触发弹窗。然后得检查弹窗是否在DOM中,可能是一个div元素,用find_element方法找到它。接下来,找到用户名和密码的输入框,可能需要用XPath或CSS选择器来定位,尤其是如果元素有动态ID的话。 输入正确的凭据后,点击登录按钮,然后验证是否跳转成功或者是否有错误提示。还要处理可能的验证码,但优快云可能有反自动化措施,可能需要手动处理或者设置等待时间。此外,异常处理也很重要,比如元素未找到或者超时的情况。 可能需要提醒用户注意等待时间和元素定位的正确性,还有验证登录是否成功的方法,比如检查页面URL或用户名的显示。另外,隐式等待和显式等待的区别可能需要解释清楚,确保用户不会因为元素加载延迟导致测试失败。</think>以下是针对优快云登录弹窗的自动化测试解决方案,按测试流程分步说明: 一、环境准备 1. 安装Python+Selenium环境 ```python pip install selenium ``` 2. 下载对应浏览器驱动(如ChromeDriver) 3. 导入必要模块 ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC ``` 二、核心测试步骤 ```python # 初始化浏览器驱动 driver = webdriver.Chrome() driver.get("https://www.youkuaiyun.com/") try: # 第一步:触发登录弹窗 login_trigger = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CLASS_NAME, "toolbar-btn-login")) ) login_trigger.click() # 第二步:切换到密码登录标签 password_tab = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//div[contains(text(), '密码登录')]")) ) password_tab.click() # 第三步:填写登录表单 username_input = driver.find_element(By.XPATH, "//input[@placeholder='手机号/邮箱/用户名']") password_input = driver.find_element(By.XPATH, "//input[@placeholder='密码']") username_input.send_keys("your_username") # 替换为测试账号 password_input.send_keys("your_password") # 替换为测试密码 # 第四步:提交表单 submit_btn = driver.find_element(By.XPATH, "//button[contains(@class, 'login-btn')]") submit_btn.click() # 第五步:验证登录结果 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CLASS_NAME, "user-nickname")) ) print("登录成功验证通过") except Exception as e: print(f"测试失败:{str(e)}") finally: driver.quit() ``` 三、关键注意事项 1. 元素定位策略 - 优先使用显式等待(WebDriverWait) - 推荐定位方式优先级:XPath > CSS Selector > Class Name - 优快云可能使用动态class,建议使用包含匹配:`//div[contains(@class, 'login-panel')]` 2. 弹窗处理要点 ```python # 确保焦点在弹窗上 login_frame = driver.find_element(By.CLASS_NAME, "login-dialog") driver.switch_to.active_element # 处理可能的内容切换 ``` 3. 验证码处理 - 测试环境建议使用测试账号关闭验证码 - 生产环境需要对接验证码识别服务(需优快云配合) 4. 异常处理增强 ```python # 添加页面状态检测 def is_login_success(driver): try: return bool(driver.get_cookie("登录成功后的关键cookie")) except: return False ``` 四、典型问题解决方案 1. 弹窗加载缓慢:将等待时间延长至15-20秒 2. 元素定位失效:定期检查优快云页面DOM结构变化 3. 跨域安全限制:确保测试域名与正式环境完全一致 4. 浏览器兼容性:使用`webdriver.Firefox()`进行多浏览器验证 建议测试时: 1. 使用测试专用账号(避免频繁登录限制) 2. 在非高峰时段执行测试用例 3. 配合Headless模式提升执行效率 4. 添加页面截图功能辅助调试 ```python driver.save_screenshot("login_state.png") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值