2016-07-21 2 views
1

Я пытаюсь загрузить все изображения recaptcha, но каким-то образом я не могу нажать на флажок reCaptcha iframe. При нажатии на него HtmlUnit выдает WrappedException. Я не уверен, почему это происходит, и Как я могу пометить ссылку и загрузить изображения? Я предполагаю, что это проблема с GWT. Я могу нажать любую другую обычную кнопку.Невозможно щелкнуть по галочке Google reqaptcha с помощью HtmlUnit

Любая помощь будет высоко оценен

Основной сайт: https://www.google.com/recaptcha/api2/demo

Здесь я сделал до сих пор.

private static final Logger LOG = LoggerFactory.getLogger(Main.class); 

    public static void main(String[] args) throws IOException { 

     try (WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38)) { 
      webClient.getCache().clear(); 
      final WebClientOptions webClientOptions = webClient.getOptions(); 
      webClientOptions.setTimeout(40000); 
      webClientOptions.setRedirectEnabled(false); 
      // webClientOptions.setUseInsecureSSL(true); 
      webClient.setAlertHandler(new AlertHandler() { 
       public void handleAlert(Page page, String string) { 
        System.out.printf("alert: %s%n", string); 
        LOG.info("javascript alert: {}", string); 
       } 
      }); 
      webClientOptions.setJavaScriptEnabled(true); 
      webClient.setCssErrorHandler(new SilentCssErrorHandler()); 
      // webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 
      webClientOptions.setThrowExceptionOnScriptError(false); 
      webClientOptions.setThrowExceptionOnFailingStatusCode(false); 


      HtmlPage reCaptchaFrame; 

      final HtmlPage page = webClient.getPage("https://www.google.com/recaptcha/api2/demo"); 
      webClient.getJavaScriptEngine().pumpEventLoop(1000); 
      webClient.waitForBackgroundJavaScript(200); 

      int waitForBackgroundJavaScript = webClient.waitForBackgroundJavaScript(200); 
      int loopCount = 0; 
      while (waitForBackgroundJavaScript > 0 && loopCount < 2) { 
       ++loopCount; 
       waitForBackgroundJavaScript = webClient.waitForBackgroundJavaScript(200); 
       if (waitForBackgroundJavaScript == 0) { 
        if (LOG.isTraceEnabled()) 
         LOG.trace("HtmlUnit exits background javascript at loop counter " + loopCount); 
        break; 
       } 
      } 

      JavaScriptEngine engine = webClient.getJavaScriptEngine(); 
      engine.holdPosponedActions(); 
      final List<FrameWindow> frames = page.getFrames(); 

      reCaptchaFrame = (HtmlPage) frames.get(0).getEnclosedPage(); 
      // initiating to enter the reCaptcha 

      final HtmlSpan reCaptchaAnchor = reCaptchaFrame.getFirstByXPath(".//span[@id='recaptcha-anchor']"); 

      if (reCaptchaAnchor == null) { 
       throw new NullPointerException("Captcha not found"); 
      } 

      try { 
       HtmlPage page1 = reCaptchaAnchor.click(); // here I get the exception 

      } catch (WrappedException e) { 
       LOG.info("Found some stupid exception {}", e.details()); 
      } 
     } catch (Exception e) { 
      LOG.info("Found exception {}", e.getMessage()); 
     } 
    } 

StackTrace:

net.sourceforge.htmlunit.corejs.javascript.WrappedException: Wrapped java.lang.NullPointerException 
at  net.sourceforge.htmlunit.corejs.javascript.Context.throwAsScriptRuntimeEx(Con text.java:2053) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:1007) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.processPostponedActions(JavaScriptEngine.java:1072) 
at com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:789) 
at com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:732) 
at com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:679) 
at recaptchatest.Main.main(Main.java:77) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: java.lang.NullPointerException 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.hasTopCall(ScriptRuntime.java:3263) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:102) 
at com.gargoylesoftware.htmlunit.javascript.host.Promise$1.execute(Promise.java:136) 
at  com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:1002) 
... 10 more 
+0

это все еще работает для вас с 2.22? Я получаю сообщение * Не могу связаться с reCAPTCHA. Проверьте свое соединение и повторите попытку. * –

ответ

1

После обновления HtmlUnit до 2.22 и HtmlUnit-ядро-JS библиотеки 2.22 все работает, как ожидалось.

0

я предлагаю вам проверить, что является фактическим XPATH элемента.

Коробка имеет с классом = «ReCaptcha-флажок-галочка»

Вы можете использовать XPath с:

reCaptchaFrame.getFirstByXPath("//div[@class='recaptcha-checkbox-checkmark']"); 

Если это не удается, попробуйте использовать другие отличные XPATH методы отбора, вероятно, один CSS, который является методом queryselector.

Что:

reCaptchaFrame.querySelector("recaptcha-checkbox-checkmark"); 

Для назначения без ошибок литья происходит, пожалуйста, используйте HtmlElement бросить все элемента на веб-сайте.

HtmlElement a = reCaptchaFrame.querySelector("recaptcha-checkbox-checkmark"); 
a.click(); 
+0

Спасибо за ваш ответ. Но в моем случае обновление основной библиотеки JS решит проблему. –

Смежные вопросы