2016-03-24 2 views
-2

Ich habe Code in selen webdriver Java mit HTML-Unit-Treiber Ich bin Eingabe verschiedener Felder in diesem Programm.Selenium Java - So erhalten Sie Captcha-Bild für Benutzer manuell eingeben Wert angezeigt vor dem Fortfahren mit Skript

Meine Frage ist Welche Sprache sollte ich verwenden, um Captcha auf der Webseite von HTML-Einheit Treiber angezeigt zu bekommen.Was ich möchte ist, dass ein Fenster sollte der Benutzer Popup angezeigt werden, auf diesem Fenster Captcha sollte angezeigt werden, die wurde von html unit Treiber geöffnet auch dieses Fenster wird auch ein Textfeld haben, um dieses captcha auch einzugeben, dieses Eingabefeld wird mit dem Eingabefeld der Webseite von captcha verlinkt, das gerade von html Einheitentreiber verarbeitet wird und sobald das Captcha eingegeben wurde der Benutzerrest des Selencodes sollte ausgeführt werden.

Zuerst dachte ich daran, jsoup zu verwenden, um Captcha zu erhalten und es dem Benutzer anzuzeigen, aber das funktioniert nicht, da Selen und jsoup unterschiedliche Captchas auswählen, wenn sie eine neue Verbindung starten.

Mein früherer Code war wie dies

System.setProperty("webdriver.chrome.driver", "D://chromedriver.exe"); 
WebDriver driver = new ChromeDriver(); 
driver.manage().window().maximize(); 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
driver.get("URL abc"); 

Connection conn = Jsoup.connect("URL abc"); 
Document d = conn.get(); 


Element captcha = d.select("#cimage").first(); 
if (captcha == null) { 
    throw new RuntimeException("Unable to find captcha..."); 
} 

// Fetch the captcha image 
Connection.Response response = Jsoup // 
     .connect(captcha.absUrl("src")) // Extract image absolute URL 
     .cookies(conn.response().cookies()) // Grab cookies 
     .ignoreContentType(true) // Needed for fetching image 
     .execute(); 

// Load image from Jsoup response 
ImageIcon image = new ImageIcon(ImageIO.read(new ByteArrayInputStream(response.bodyAsBytes()))); 
// Show image 
JOptionPane.showMessageDialog(null, image, "Captcha image", JOptionPane.PLAIN_MESSAGE); 

Chrom-Treiber verwendet Ich erhalte zwei verschiedene Captchas wahrscheinlich, weil beide Selen und jsoup Unten eine neue Verbindung beginnen wird, um das Bild für die gleichen

Snapshot

Jeder Vorschlag oder Beispiele würden sehr geschätzt. Bitte lassen Sie mich wissen, wenn zusätzliche Informationen benötigt werden!

Antwort

0

Die meisten Unternehmen verwenden Captchas auf der Benutzerregistrierungsseite ihrer Websites. Der Zweck von Captcha auf jeder Webseite ist es, Mensch und Maschine zu unterscheiden, um Hackerangriffe zu verhindern und ihre Webseiten gegen Bots zu schützen. Daher können diese Seiten nicht vollständig automatisiert werden. Tatsächlich ist Captcha selbst implementiert, um eine Automatisierung zu verhindern. Daher kann nicht automatisiert und nicht brechbar sein. Wenn ein Automatisierungsprogramm versucht, eine Website zu hacken, die das Unternehmen für rechtliche Schritte gegen den Hacker betreiben kann. Also besser nicht solche Webseiten automatisieren, die Captcha! Hoffe das beantwortet deine Frage. Danke

+0

Ich hacke keine Webseite die Kappe tcha, das auf der Webseite angezeigt wird, sollte dem Benutzer angezeigt werden, damit er es manuell eingeben kann. – Ajay

+0

habe deinen Punkt! Ist das Öffnen des Fensters Pop-up für den Benutzer, wo Captcha angezeigt werden soll, mit anderen Browsern als HTML-Einheit Treiber. – karusai

+0

Ja, ich habe einen Screenshot als Referenz hinzugefügt. – Ajay

1

Haben Sie erwogen, ein Popup zu verwenden, nur um dem Benutzer mitzuteilen, dass das Captcha ausgefüllt werden muss (ohne dass das eigentliche Bild des Captchas angezeigt wird)?

Der Benutzer kann den Captcha-Wert im Browser eingeben und dann das Popup-Fenster schließen. Selnium kann warten, bis der Benutzer das Popup schließt, bevor es fortfährt.

Wenn der Benutzer keinen Zugriff auf den Browser hat (z. B. kopflos oder auf einem anderen Computer), könnten Sie das Captcha-Bild snapshot dem Benutzer anzeigen (oder an einem freigegebenen Speicherort für den Benutzer speichern).

Wenn Sie den Snapshot beschneiden, um nur das Captcha Sie write a little bit more code haben zu tun, so

+0

Vielen Dank für so eine ausführliche Antwort. Obwohl ich im obigen Code den chrome-Treiber verwendet habe, ist es mein ultimatives Ziel, den HTMLUnit-Treiber zu verwenden und das Captcha als Pop-up für den Benutzer anzuzeigen und ihn aufzufordern, das Captcha so einzugeben, dass auch die Ausführung schnell ist. Das Problem ist, dass ich das Captcha auf Echtzeitbasis eingeben muss, sobald ich das korrekte Captcha eingegeben habe, nachdem der Rest der Ausführung erledigt ist. Grundsätzlich ist das Szenario Selen öffnet die Website Eingaben Benutzername und Passwort dann sollte es warten, bis der Benutzer Captcha eingeben und klicken Sie dann auf Login-Taste. – Ajay

+0

Ich bin mir nicht sicher, wie ich das Captcha dem Benutzer in Echtzeit zeigen und ihn bitten soll, es einzugeben. Ich denke, Selen allein könnte das nicht können. wir könnten Hilfe von etwas anderem prog lang wie jsoup oder etwas brauchen – Ajay

+0

So nur, um Ihr genaues Szenario zu klären ist, dass Benutzer Zugang zur Maschine hat, aber der Code Kopflos läuft? Ich bin mir sicher, dass Sie das mit Java überwinden können - lassen Sie es mich wissen und ich werde versuchen und weiter helfen. –

3

Sie sollten nicht Selen-Treiber und Jsoup hier mischen. Der ChromeDriver hat die Seite mit dem Captcha-Bild heruntergeladen. Es liegt also in der Verantwortung von ChromeDriver, das Bild zu geben.

Sie können diese acheive in zwei Schritten:

  1. einen Screenshot
  2. Extrahieren Sie die Unter-Bild des vorherigen Screenshot das Captcha entsprechenden

Hier ist ein Beispiel (in Ordnung gebracht), die ursprünglich geschrieben auf Selenium Users Google group:

DownloadImage (// 
    By.xpath("//*[@id='content']/div/div[1]/div/div/div[1]/img"), // 
    "D:\\Download\\image.png"); 

public void DownloadImage(By by,String loc) throws IOException { 
    WebElement Image=driver.findElement(by); 
    int width=Image.getSize().getWidth(); 
    int height=Image.getSize().getHeight(); 

    File screen=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 
    BufferedImage img=ImageIO.read(screen); 

    BufferedImage dest=img.getSubimage(Image.getLocation().getX(), Image.getLocation().getY(), width, height); 
    ImageIO.write(dest, "png", screen); 
    File file=new File(loc); 
    FileUtils.copyFile(screen,file); 
} 
Verwandte Themen