Selenium Java - 如何获取用户的Captcha图像以手动输入在继续脚本之前显示的值

时间:2016-03-24 00:30:43

标签: java selenium selenium-webdriver jsoup

我使用HTML单元驱动程序在selenium webdriver Java中编写代码我在该程序中输入各种字段。

我的问题是我应该使用哪种语言才能在HTML单元驱动程序打开的网页上显示验证码。我想要的是一个窗口应该弹出给用户,在这个窗口上应该显示验证码由html单元驱动程序打开,此窗口也将有一个文本字段输入验证码,此输入字段将链接到网页的验证码输入字段,当前正由html单元驱动程序处理,一旦验证码被输入用户其余的selenium代码应该被执行。

最初,我正在考虑使用jsoup来获取验证码并将其显示给用户,但这是行不通的,因为selenium和jsoup在启动新连接时都会选择不同的验证码。

我之前的代码就像这样

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

使用chrome驱动程序我得到两个不同的验证码可能是因为selenium和jsoup都在开始一个新的连接下面是相同的图像

Snapshot

任何建议或例子都会受到极大的赞赏。如果需要任何其他信息,请告诉我们!

3 个答案:

答案 0 :(得分:4)

你不应该在这里混合使用Selenium驱动程序和Jsoup。 ChromeDriver已下载带有验证码图片的页面。因此,ChromeDriver负责提供图像。

您可以通过两个步骤实现这一目标:

  1. 截取屏幕截图
  2. 提取与验证码
  3. 对应的上一屏幕截图的子图像

    以下是最初在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);
    }
    

答案 1 :(得分:1)

您是否考虑过使用弹出窗口让用户知道需要填写验证码(没有显示验证码的实际图像)?

用户可以在浏览器中输入验证码值,然后关闭弹出窗口。 Selnium可以等到用户关闭弹出窗口,然后再继续。

如果用户无法访问浏览器(例如,无头或在其他计算机上运行),您可以snapshot验证码图像并将其显示给用户(或将其保存在共享位置以供用户打开)。

如果您想将快照裁剪为验证码,则必须write a little bit more code才能执行此操作

答案 2 :(得分:0)

大多数公司在其网站的用户注册页面中使用验证码。验证码在任何网页上的目的是区分人与机器,以防止黑客攻击,并保护他们的网站免受机器人攻击。因此这些页面无法完全自动化。事实上,Captcha本身是为了防止自动化而实施的。因此不能自动化而且不易破碎。如果任何自动化程序试图破解公司可能针对黑客采取法律行动的任何网站。所以最好不要自动化这些有Captcha的网页!希望这能回答你的问题。感谢