Selenium 循环通过 Ocr 过程直到验证码图像文本解决
Selenium Loop Through Ocr Process until Captcha Image Text Solved
我正在尝试使用 Selenium Webdriver 和 Aspose Ocr 解决基本的验证码图像。但是有时Ocr无法正确读取图像文本,所以我需要重复这个过程或创建一个循环直到验证码解决。
知道怎么做吗?我已经用 while 尝试了 try-catch 循环,但没有得到预期的结果。
如果验证码输入正确,则变为css值显示none,否则显示块并给出错误信息提示输入错误。
提前感谢您的回答。我没有信誉投票给你的答案,对此也很抱歉:))
我的代码如下:
ITakesScreenshot ssdriver = driver as ITakesScreenshot;
byte[] screenshot = ssdriver.GetScreenshot().AsByteArray;
MemoryStream ms = new MemoryStream(screenshot);
IWebElement my_image = driver.FindElement(By.XPath("//*[@id=\"Captcha\"]/img"));
Point point = my_image.Location;
int width = my_image.Size.Width;
int height = my_image.Size.Height;
Rectangle section = new Rectangle(point, new Size(width, height));
Bitmap originalScreenshot = (Bitmap)Bitmap.FromStream(ms);
Bitmap final_image = CropImage(originalScreenshot, section);
MemoryStream ms2 = new MemoryStream();
final_image.Save(ms2, ImageFormat.Png);
byte[] captchaimage = ms2.ToArray();
Image image = Image.FromStream(ms2);
OcrEngine ocrEngine = new OcrEngine();
ocrEngine.Image = ImageStream.FromStream(ms2, ImageStreamFormat.Png);
string SolvedCaptcha = "";
if (ocrEngine.Process())
{
string OcrCaptcha = ocrEngine.Text.ToString().Trim();
SolvedCaptcha = Regex.Replace(OcrCaptcha, "[^a-zA-Z0-9]", "").Trim();
}
IWebElement captcha = driver.FindElement(By.XPath("//*[@id=\"ContentPlaceHolder1_txtCaptcha\"]"));
captcha.SendKeys(SolvedCaptcha);
captcha.SendKeys(Keys.Enter);
我把它包裹在 while 块中。 Clear() 对我不起作用,所以我需要添加 js 来清除输入值,然后再设置即将到来的 one.It 以这种方式为我工作,希望它对其他人有所帮助。每当我尝试保存更改图像时,我都无法使用保存验证码图像版本 bc。所以我选择了截屏解决方案。
while(driver.FindElement(By.Id("Captcha")).GetCssValue("display").ToString().Trim() == "block")
{
ITakesScreenshot ssdriver = driver as ITakesScreenshot;
byte[] screenshot = ssdriver.GetScreenshot().AsByteArray;
MemoryStream ms = new MemoryStream(screenshot);
IWebElement my_image = driver.FindElement(By.XPath("//*[@id=\"Captcha\"]/img"));
Point point = my_image.Location;
int width = my_image.Size.Width;
int height = my_image.Size.Height;
Rectangle section = new Rectangle(point, new Size(width, height));
Bitmap originalScreenshot = (Bitmap)Bitmap.FromStream(ms);
Bitmap final_image = CropImage(originalScreenshot, section);
MemoryStream ms2 = new MemoryStream();
final_image.Save(ms2, ImageFormat.Png);
byte[] captchaimage = ms2.ToArray();
Image image = Image.FromStream(ms2);
image.Save(@"C:\Users\bulut\Desktop\testcaptcha.png");
OcrEngine ocrEngine = new OcrEngine();
ocrEngine.Image = ImageStream.FromStream(ms2, ImageStreamFormat.Png);
string SolvedCaptcha = "";
if (ocrEngine.Process())
{
string OcrCaptcha = ocrEngine.Text.ToString().Trim();
SolvedCaptcha = Regex.Replace(OcrCaptcha, "[^a-zA-Z0-9]", "").Trim();
}
var script = "document.getElementById('ContentPlaceHolder1_txtCaptcha').value = '';";
IWebElement element = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript(script);
IWebElement captcha = driver.FindElement(By.XPath("//*[@id=\"ContentPlaceHolder1_txtCaptcha\"]"));
captcha.SendKeys(SolvedCaptcha);
captcha.SendKeys(Keys.Enter);
var wait5 = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait5.Until(d => ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete"));
Thread.Sleep(2000);
}
我正在尝试使用 Selenium Webdriver 和 Aspose Ocr 解决基本的验证码图像。但是有时Ocr无法正确读取图像文本,所以我需要重复这个过程或创建一个循环直到验证码解决。
知道怎么做吗?我已经用 while 尝试了 try-catch 循环,但没有得到预期的结果。
如果验证码输入正确,则变为css值显示none,否则显示块并给出错误信息提示输入错误。
提前感谢您的回答。我没有信誉投票给你的答案,对此也很抱歉:))
我的代码如下:
ITakesScreenshot ssdriver = driver as ITakesScreenshot;
byte[] screenshot = ssdriver.GetScreenshot().AsByteArray;
MemoryStream ms = new MemoryStream(screenshot);
IWebElement my_image = driver.FindElement(By.XPath("//*[@id=\"Captcha\"]/img"));
Point point = my_image.Location;
int width = my_image.Size.Width;
int height = my_image.Size.Height;
Rectangle section = new Rectangle(point, new Size(width, height));
Bitmap originalScreenshot = (Bitmap)Bitmap.FromStream(ms);
Bitmap final_image = CropImage(originalScreenshot, section);
MemoryStream ms2 = new MemoryStream();
final_image.Save(ms2, ImageFormat.Png);
byte[] captchaimage = ms2.ToArray();
Image image = Image.FromStream(ms2);
OcrEngine ocrEngine = new OcrEngine();
ocrEngine.Image = ImageStream.FromStream(ms2, ImageStreamFormat.Png);
string SolvedCaptcha = "";
if (ocrEngine.Process())
{
string OcrCaptcha = ocrEngine.Text.ToString().Trim();
SolvedCaptcha = Regex.Replace(OcrCaptcha, "[^a-zA-Z0-9]", "").Trim();
}
IWebElement captcha = driver.FindElement(By.XPath("//*[@id=\"ContentPlaceHolder1_txtCaptcha\"]"));
captcha.SendKeys(SolvedCaptcha);
captcha.SendKeys(Keys.Enter);
我把它包裹在 while 块中。 Clear() 对我不起作用,所以我需要添加 js 来清除输入值,然后再设置即将到来的 one.It 以这种方式为我工作,希望它对其他人有所帮助。每当我尝试保存更改图像时,我都无法使用保存验证码图像版本 bc。所以我选择了截屏解决方案。
while(driver.FindElement(By.Id("Captcha")).GetCssValue("display").ToString().Trim() == "block")
{
ITakesScreenshot ssdriver = driver as ITakesScreenshot;
byte[] screenshot = ssdriver.GetScreenshot().AsByteArray;
MemoryStream ms = new MemoryStream(screenshot);
IWebElement my_image = driver.FindElement(By.XPath("//*[@id=\"Captcha\"]/img"));
Point point = my_image.Location;
int width = my_image.Size.Width;
int height = my_image.Size.Height;
Rectangle section = new Rectangle(point, new Size(width, height));
Bitmap originalScreenshot = (Bitmap)Bitmap.FromStream(ms);
Bitmap final_image = CropImage(originalScreenshot, section);
MemoryStream ms2 = new MemoryStream();
final_image.Save(ms2, ImageFormat.Png);
byte[] captchaimage = ms2.ToArray();
Image image = Image.FromStream(ms2);
image.Save(@"C:\Users\bulut\Desktop\testcaptcha.png");
OcrEngine ocrEngine = new OcrEngine();
ocrEngine.Image = ImageStream.FromStream(ms2, ImageStreamFormat.Png);
string SolvedCaptcha = "";
if (ocrEngine.Process())
{
string OcrCaptcha = ocrEngine.Text.ToString().Trim();
SolvedCaptcha = Regex.Replace(OcrCaptcha, "[^a-zA-Z0-9]", "").Trim();
}
var script = "document.getElementById('ContentPlaceHolder1_txtCaptcha').value = '';";
IWebElement element = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript(script);
IWebElement captcha = driver.FindElement(By.XPath("//*[@id=\"ContentPlaceHolder1_txtCaptcha\"]"));
captcha.SendKeys(SolvedCaptcha);
captcha.SendKeys(Keys.Enter);
var wait5 = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait5.Until(d => ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete"));
Thread.Sleep(2000);
}