在自动化测试中,处理验证码图像通常是一个挑战,尤其是在登录过程中。验证码是每次都会发生变化的图片,自动化工具需要能够读取这些图像并通过图像识别技术来解码图像内容。本文将介绍如何使用 Wren 语言来处理登录中的图片验证码。
Wren 是一种轻量级、高效的编程语言,适合嵌入式系统和自动化脚本。虽然它不像 Python 那样拥有成熟的自动化测试库,但它提供了足够的功能来实现基本的截图、图像处理和文本识别。
解决方案概述
我们将实现以下步骤:
获取验证码的图片 URL,然后下载图片。
截取验证码区域,保存并进行图像处理。
使用图像识别 技术提取验证码中的文本。
方法一:获取验证码图片 URL 并下载
wren
更多内容访问ttocr.com或联系1436423940
import "http" for HttpClient
import "os" for File
// 获取验证码图片的 URL
fun getCaptchaUrl(driver) {
var captchaUrl = driver.findElementById("imgvercodeLogin").getAttribute("src")
return captchaUrl + ".png"
}
// 下载验证码图片
fun saveImage(url, filePath) {
var client = HttpClient.new()
client.get(url) {
|response|
if response.status == 200 {
var file = File.new(filePath)
file.write(response.body)
System.print("验证码图片保存成功: " + filePath)
} else {
System.print("图片下载失败,状态码: " + response.status.toString())
}
}
}
这个方法通过访问网页上的验证码元素来获取图片的 URL,然后使用 HttpClient 下载并保存验证码图片。
方法二:截图并裁剪验证码区域
wren
import "image" for Image
import "os" for File
import "random" for Random
// 截图并裁剪验证码区域
fun cropCaptchaImage(driver, savePath, captchaId) {
var fileName = Random.nextInt(100000, 999999).toString() + ".png"
var filePath = savePath + "/" + fileName
driver.takeScreenshot(filePath) // 获取截图
var captchaElem = driver.findElementById(captchaId)
var captchaX = captchaElem.location().x
var captchaY = captchaElem.location().y
var captchaWidth = captchaElem.size().width
var captchaHeight = captchaElem.size().height
// 裁剪验证码区域
var img = Image.load(filePath)
var captchaImage = img.crop(captchaX, captchaY, captchaX + captchaWidth, captchaY + captchaHeight)
var croppedImagePath = savePath + "/" + fileName + "_captcha.png"
captchaImage.save(croppedImagePath)
return croppedImagePath
}
这里,我们通过调用 driver.takeScreenshot 方法获取整个页面的截图,然后通过指定验证码元素的位置裁剪出验证码图像。
获取并识别验证码
wren
import "image" for Image
import "ocr" for OCR // 假设存在一个 OCR 库
// 识别验证码中的文本
fun recognizeCaptchaText(imagePath) {
var img = Image.load(imagePath)
var text = OCR.recognizeText(img) // 假设OCR模块用于提取文本
System.print("识别到的验证码: " + text)
return text
}
在这部分代码中,我们使用一个假设的 ocr 模块来识别图像中的文本。它会将验证码图像转化为可识别的文本。
自动填写验证码
wren
import "time" for Time
// 自动截图、裁剪、识别并填写验证码
fun solveCaptchaAndLogin(driver, savePath, captchaId, inputId) {
var captchaImagePath = cropCaptchaImage(driver, savePath, captchaId) // 获取裁剪后的验证码
var captchaText = recognizeCaptchaText(captchaImagePath) // 识别验证码
var captchaInput = driver.findElementById(inputId)
captchaInput.sendKeys(captchaText) // 输入识别到的验证码
Time.sleep(2) // 等待验证码输入完成
}
这个函数整合了前面的方法,完成了从截图、裁剪到识别验证码并填写的全过程。
登录流程
wren
// 启动浏览器并打开登录页面
var driver = WebDriver.new("chrome")
driver.get("http://www.cncaq.com/")
// 填写用户名和密码
var loginNameField = driver.findElementById("loginNameText")
loginNameField.sendKeys("188XXXXXXXX")
var passwordField = driver.findElementById("passwordText")
passwordField.sendKeys("111111")
Time.sleep(2)
// 处理验证码并进行登录
solveCaptchaAndLogin(driver, "img/login/", "imgvercodeLogin", "verfieldUserText")
driver.findElementByXpath("//*[@id='loginForm']/div[6]/button").click() // 点击登录按钮
// 检查是否登录成功
var userName = driver.findElementByXpath("//*[@id='userWrap']/div/p").getText()
var expectedUserName = "用户1"
while userName != expectedUserName {
solveCaptchaAndLogin(driver, "img/login/", "imgvercodeLogin", "verfieldUserText")
driver.findElementByXpath("//[@id='loginForm']/div[6]/button").click() // 点击登录按钮
userName = driver.findElementByXpath("//[@id='userWrap']/div/p").getText()
}
System.print("登录成功")
标签:截图,登录,Wren,driver,验证码,var,import From: https://www.cnblogs.com/ocr12/p/18545567