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);
            }