2016-07-06 7 views
3

Eine Alternative, die es mir ermöglicht, ein HTML-Formular mit Kontrollkästchen und Radiobuttons zu füllen.Eine HtmlUnit Alternative für Android?

Ich schuf diese Android-App, die Benutzereingabe anfordert und sendet diese Daten an eine Website mit einem HTML-Formular, füllt es aus, übergibt das Formular und gibt die folgende Ergebnisseite zurück.

Ich habe bereits geschafft, Daten an das HTML-Formular zu senden und die Seite mithilfe der HtmlUnit-Bibliothek in Eclipse abrufen (Ich habe den Java-Code dafür unten veröffentlicht).

Als ich jedoch diesen Code in mein Android-Projekt kopiert habe, habe ich herausgefunden, dass Android die HtmlUnit-Bibliothek nicht unterstützt.

Gibt es eine andere Alternative zu HtmlUnit für Android? Die Alternative sollte in Texten füllen können, Kontrollkästchen, Optionsfelder in einem HTML-Formular aus und klicken Sie auf den Absenden-Button

HTML-Formular-Code:

<form method="post" action="https://www.xxxxx.com/cgi-bin/xxxxxx.cgi"> 


<p><em>Person:</em> 
<input size="18" name="name"><br> 
<input type="radio" name="login" value="no" checked="">Name <input  type="radio" name="login" value="yes">Username</p> 

<p><em>Title:</em> 
<input size="18" name="title"></p> 

<p><em>Department:</em> 
<input size="18" name="department"></p> 

<p><em>Groups to Search:</em><br> 
<input type="checkbox" name="get_student" value="yes" checked=""> Students<br> 
<input type="checkbox" name="get_alum" value="yes" checked=""> Alumni<br> 

<input type="checkbox" name="get_staff" value="yes" checked=""> Staff<br> 
<input type="checkbox" name="get_faculty" value="yes" checked=""> Faculty</p> 

<p><input type="submit" value="Search"></p> 
</form> 

Htmlunit Java-Code:

public static String submittingForm() throws Exception { 


    final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38); 
    webClient.getOptions().setJavaScriptEnabled(false); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 

    WebRequest request = new WebRequest(new URL("https://www.xxxxx.com/")); 

    // Get the first page 
    HtmlPage page1 = webClient.getPage(request); 

    System.out.println("PULLING LINKS/ LOADING:"); 

    // Get the form that we are dealing with and within that form, 
    // find the submit button and the field that we want to change. 
    List<HtmlForm> listform = page1.getForms(); 
    HtmlForm form = listform.get(0); 


    HtmlElement Name = page1.getElementByName("name"); 
    Name.click(); 
    Name.type("Adonay"); 
    HtmlElement nameRadio = page1.getFirstByXPath("/html/body//div[@id='wrapper']//div[@id='layout']//div[@id='container']//div[@id='col1']//div[@id='content']//div[@class='directory-search']//form//input[@type='radio' and @value='no']"); 
    HtmlElement userRadio = page1.getFirstByXPath("/html/body//div[@id='wrapper']//div[@id='layout']//div[@id='container']//div[@id='col1']//div[@id='content']//div[@class='directory-search']//form//input[@type='radio' and @value='yes']"); 
    /* userRadio.click(); click when username wanted*/ 
    HtmlElement Title = page1.getElementByName("title"); 
    Title.click(); 
    Title.type(""); 
    HtmlElement Department = page1.getElementByName("department"); 
    Department.click(); 
    Department.type(""); 
    HtmlElement studentBox = page1.getFirstByXPath("/html/body//div[@id='wrapper']//div[@id='layout']//div[@id='container']//div[@id='col1']//div[@id='content']//div[@class='directory-search']//form//input[@type='checkbox' and @name='get_student']"); 
    studentBox.click(); 
    //add clicker here 
    HtmlElement alumniBox = page1.getFirstByXPath("/html/body//div[@id='wrapper']//div[@id='layout']//div[@id='container']//div[@id='col1']//div[@id='content']//div[@class='directory-search']//form//input[@type='checkbox' and @name='get_alum']"); 
    alumniBox.click(); 
    //add clicker here 
    HtmlElement staffBox = page1.getFirstByXPath("/html/body//div[@id='wrapper']//div[@id='layout']//div[@id='container']//div[@id='col1']//div[@id='content']//div[@class='directory-search']//form//input[@type='checkbox' and @name='get_staff']"); 
    staffBox.click(); 
    //add clicker here 
    HtmlElement facultyBox = page1.getFirstByXPath("/html/body//div[@id='wrapper']//div[@id='layout']//div[@id='container']//div[@id='col1']//div[@id='content']//div[@class='directory-search']//form//input[@type='checkbox' and @name='get_faculty']"); 
    facultyBox.click(); 
    //add clicker here 



    HtmlElement button = page1.getFirstByXPath("/html/body//div[@id='wrapper']//div[@id='layout']//div[@id='container']//div[@id='col1']//div[@id='content']//div[@class='directory-search']//form//input[@type='submit' and @value='Search']"); 
    // Change the value of the text field 

    // Now submit the form by clicking the button and get back the second page. 
    HtmlPage page2 = button.click(); 
    webClient.waitForBackgroundJavaScript(200); 
    return(page2.asXml()); 
} 
+0

'Die Alternative sollte in der Lage sein, Texte, Kontrollkästchen, Radiobuttons in ein HTML-Formular zu füllen und auf den Absenden-Button klicken. Verwenden Sie einfach HttpUrlConnection, um die Werte auf dem Webserver zu veröffentlichen (Aktions-URL). Sie müssen die Seite nicht einmal zuerst anfordern, da Sie wissen, welche Eingaben sich auf dem Formular befinden. – greenapps

+0

Können Sie bitte weiter erklären, wie ich das erreichen könnte? Ich bin wirklich neu auf Android (tatsächlich Programmierung als Ganzes - ich habe gerade meinen ersten CS-Kurs). @greenapps – adonayresom

+0

Eigentlich @greenapps habe ich eine Methode gefunden. Vielen Dank. Ich dachte darüber nach, was du gesagt hast, und fing an, online zu graben. Aber bitte versuchen Sie eine andere Frage zu beantworten. Ich habe die Frage unten gepostet. – adonayresom

Antwort

1

Jungs Ich habe eine andere Methode gefunden. Da ich die Adresse des Servers kenne, habe ich versucht, die Daten unter Verwendung eines DataOutputStream direkt an ihn zu senden. Schauen Sie sich den folgenden Code:

public String searchDirectory() throws IOException { 
    URL url = new URL("https://www.xxxxx.com/xxxxx/xxxxx.cgi"); 
    URLConnection con = url.openConnection(); 
    con.setDoInput(true); 
    con.setDoOutput(true); 
    con.setUseCaches(false); 
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

    DataOutputStream printout = new DataOutputStream (con.getOutputStream()); 

    String parameters =("name=" + URLEncoder.encode("DATA HERE", "UTF-8")); 
    printout.writeBytes (parameters); 
    printout.flush(); 
    printout.close(); 
     /*InputStream inputStream = getApplicationContext().getResources().getAssets().open("White Pages Query Results.html"); 
     InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); 
     */ 
    DataInputStream input = new DataInputStream (con.getInputStream()); 
    String line; 
    String htmlCode = ""; 
    while((line = input.readLine()) != null) { 
     htmlCode += line; 
    } 
    return htmlCode; 
} 

Wie Sie verwende ich die Namen der HTML-Elemente sehen, sie durch Java zugreifen. Wie Sie jedoch aus dem HTML-Formular-Code im Original-Post sehen können, haben die Radiobuttons den gleichen Namen, wie kann ich sie separat aufrufen/ausfüllen, ohne ihre Namen zu verwenden?

+0

Der gleiche Name = "Login" meinst du? Sie füllen sie nicht beide aus. Du füllst nichts aus. Sie senden einfach einen Wert für den Post-Parameter Login. Wie & login = no oder & login = yes. – greenapps

+0

danke @greenapps alles hat super geklappt! – adonayresom

+1

Ihre vielen Antworten auf eine Reihe von Fragen, die alle diese Antwort werben, wurden von der Community markiert und entfernt. Wir möchten sicherstellen, dass die Antworten direkt auf die Frage ausgerichtet sind, auf die sie gestellt werden, und sicherstellen, dass doppelte Fragen als solche gekennzeichnet sind, anstatt doppelte Antworten an mehreren Stellen zu haben. –