2017-07-24 29 views
0

我想用Selenium Webdriver和Aspose Ocr來解決基本的驗證碼圖像。但有時候Ocr無法正確讀取圖像文本,所以我需要重複該過程或創建一個循環,直到驗證碼解決。Selenium循環通過Ocr過程,直到Captcha圖像文本解決

任何想法如何?我已經嘗試了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); 

回答

0

我包裹在而塊。 Clear()對我不起作用,所以我需要添加js來清除輸入值,然後再設置即將到來的一個。它對我來說這樣工作,希望對其他人有所幫助。我無法使用保存驗證碼圖像版本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); 
      }