2017-07-24 3 views
0

Ich versuche, ein grundlegendes Captcha Bild mit Selenium Webdriver und Aspose Ocr zu lösen. Aber manchmal kann Ocr den Bildtext nicht richtig lesen, also muss ich den Vorgang wiederholen oder eine Schleife erstellen, bis das Captcha gelöst ist.Selen Loop Through Ocr Prozess bis Captcha Bild Text gelöst

Irgendeine Idee wie? Ich habe die try-catch-Schleife bereits mit while ausprobiert, aber nicht das erwartete Ergebnis erzielt.

Wenn das Captcha korrekt eingegeben wird, ändert es sich in den css-Wert, um keine anzuzeigen, andernfalls wird es angezeigt und gibt eine Fehlermeldung aus, um anzuzeigen, dass es falsch war.

Vielen Dank im Voraus für die Antworten. Ich bin nicht seriös Ihre Antworten zu stimmen, sorry für das auch :))

Mein Code wie folgt lautet:

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

Antwort

0

Ich wickelte es in während Block. Clear() funktionierte nicht für mich, also musste ich js hinzufügen, um den Eingabewert zu löschen, bevor ich den nächsten einstellte.Es funktioniert auf diese Weise für mich, hoffe, dass es anderen hilft. Ich konnte nicht speichern captcha Bildversion bc verwenden, wenn ich versuche, es zu speichern, ändert das Bild. Also ging ich mit einer Screenshot-Lösung.

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