studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java html web-scraping httprequest headless-browser

programacion - La forma más fácil de "navegar" a una página y enviar formulario en Java



manual de programacion android pdf (6)

Lo que tengo que hacer es buscar una página web, iniciar sesión y luego buscar otra página web en ese sitio que requiera que inicie sesión, por lo que debe guardar las cookies. Después de eso, tengo que hacer clic en un elemento en esa página, en la que llenaría el formulario y recibiría el mensaje de que la página web me devuelve. La razón por la que tengo que ir a la página y hacer clic en el botón como para simplemente navegar directamente al enlace es porque le asignan una ID de sesión cada vez que ingresa y hace clic en el enlace, y siempre es diferente. El botón se ve así, no es un enlace href normal:

<span id=":tv" idlink="" class="sA" tabindex="0" role="link">Next</span>

De todos modos, ¿cuál sería la forma más fácil de hacer esto? Gracias.

Actualización: después de probar HTMLunit y otras librerías de navegadores sin cabeza, no parece que suceda usando nada "sin cabeza". Otra cosa que descubrí recientemente sobre esta página es que todo el HTML está en un formato extraño ... Todo está dentro de una etiqueta de script. Aquí hay una muestra.

"?ui/x3d2/x26view/x3dss/x26mset/x3dmain/x26ver/x3d-68igm85d1771/x26am/x3d!Zsl-0RZ-XLv0BO3aNKsL0sgMg3nH10t5WrPgJSU8CYS-KNWlyrLmiW3HvC5ykER_n_5dDw/x26fri"],"http://example.com/?ctx/x3d%67mail/x26hl/x3den",,0,"Gmail","Gmail",[["us","c130f0854ca2c2bb",[["n"],["m","New features!"],["u"],["k","0"],["p","1000:500000,10,200000,5,100000,3,75000,2,0,1"],["h","https://survey.googleratings.com/wix/p1679258.aspx?l/x3d1033"],["at","query,5,contacts,5,adv,5,cf,5,default,20"],["v","https://www.youtube.com/embed/Ra8HG6MkOXY?showinfo/x3d0"],

Cuando inspecciono el elemento en el botón, aparece el código HTML que publiqué anteriormente para el botón, pero no cuando lo veo en la fuente. Básicamente, lo que voy a tener que hacer es usar algún tipo de GUI y hacer que el usuario navegue hasta el enlace y luego haga que el programa complete la información. ¿Alguien sabe cómo puedo hacer esto? Gracias.


En la página de inicio de sesión, mire el HTML del formulario para ver la URL a la que se publica y los parámetros de la URL. A continuación, solicite esa url con los mismos parámetros completados con la información correcta, y asegúrese de guardar todos los encabezados de las cookies para enviar a la segunda página. Luego usa un analizador html para encontrar tu enlace. Hay varios analizadores html disponibles en sourceforge, e incluso podrías probar los analizadores xml integrados de Java, aunque si el sitio tiene incluso un pequeño error html, fallarán.

EDIT no se dio cuenta del hecho de que no es un enlace normal. En ese caso, deberá consultar el javascript del sitio para ver a dónde conduce el enlace. Si el enlace requiere javascript para ejecutarse, se vuelve más complicado. Java no puede ejecutar Javascript en el navegador, pero encontré una biblioteca llamada swing nativo de DJ que incluye una clase de navegador web que puede agregar a jframes. Utiliza su navegador nativo para representar y para ejecutar javascript.



En lugar de intentar navegar programáticamente, intente ejecutar la solicitud de inicio de sesión y guardar las cookies y luego establecerlas en la próxima solicitud a la publicación del formulario.


HTMLUnit es bastante malo en el procesamiento de JavaScript, la biblioteca de Rhino JS produce a menudo errores (en realidad, ningún error es la excepción). Aconsejaría utilizar Selenium , que es básicamente un marco para controlar los navegadores sin cabeza (Chrome, basado en Firefox).

Para su pregunta, el siguiente código haría el trabajo

selenium.open(myurl); selenium.click("id=:tv");

Luego debes esperar a que se cargue la página

selenium.waitForPageToLoad(someTime);


Recomendaría htmlunit cualquier día. Es una gran biblioteca.

Primero, revisa su página web ( http://htmlunit.sourceforge.net/ ) para poner en funcionamiento la htmlunit. Asegúrese de utilizar la última instantánea (2.12 al escribir esto)

Pruebe estas configuraciones para ignorar prácticamente cualquier obstáculo:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17); webClient.getOptions().setRedirectEnabled(true); webClient.getOptions().setCssEnabled(false); webClient.getOptions().setThrowExceptionOnScriptError(false); webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); webClient.getOptions().setUseInsecureSSL(true); webClient.getOptions().setJavaScriptEnabled(true); webClient.getCookieManager().setCookiesEnabled(true);

Luego, cuando recuperes tu página, asegúrate de esperar el JavaScript de fondo antes de hacer cualquier cosa con la página, como publicar un formulario de inicio de sesión:

//Get Page HtmlPage page1 = webClient.getPage("https://login-url/"); //Wait for background Javascript webClient.waitForBackgroundJavaScript(10000); //Get first form on page HtmlForm form = page1.getForms().get(0); //Get login input fields using input field name HtmlTextInput userName = form.getInputByName("UserName"); HtmlPasswordInput password = form.getInputByName("Password"); //Set input values userName.setValueAttribute("MyUserName"); password.setValueAttribute("MyPassword"); //Find the first button in form using name, id or xpath HtmlElement button = (HtmlElement) form.getFirstByXPath("//button"); //Post by clicking the button and cast the result, login arrival url, to a new page and repeat what you did with page1 or something else :) HtmlPage page2 = (HtmlPage) button.click(); //Profit System.out.println(page2.asXml());

¡Espero que este ejemplo básico te ayude!


Esto debería ser posible en Selenium como otros han notado.

He utilizado Selenium para iniciar sesión, luego rastrear un sitio y descubrir cada permuación de valores para cada formulario en el sitio (más de 30 formularios). Estos valores se utilizan luego para completar y enviar el formulario con una permutación específica de valores. Este sitio era muy pesado para JS / jQuery y utilicé el soporte integrado de Selenium para el ejecutor de JavaScript, los selectores de CSS y XPath para lograr esto.

Implementé HtmlUnit y HttpUnit como alternativas más rápidas, pero descubrí que no eran tan confiables como Selenium dada la semántica de JS del sitio que estaba rastreando.

Es difícil darle un código sobre cómo lograrlo porque su implementación de Selenium será bastante específica de la página y no puedo mirar la página contra la que está codificando para descubrir qué está pasando con esa basura de script de botón. Sin embargo, he incluido algunos fragmentos de código de selenio (Java) posiblemente relevantes:

Element element = driver.findElements(By.id(value)); //find element on page List<Element> buttons = parent.findElements(By.xpath("./tr/td/button")); //find child element button.click(); element.submit() //submit enclosing form element.sendKeys(text); //enter text in an input String elementText = (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].innerText || arguments[0].textContent", element); //interact with a selenium element via JS

Si está codificando funciones similares en diferentes páginas, entonces las interfaces detrás de PageObjects pueden ayudar.

El enlace que Anew publicó es un buen punto de partida y el buen tiene respuestas a casi cualquier problema de Selenio.