安卓系统中有类似HtmlUnit的替代品吗?

3

一种替代方案,可以填写具有复选框和单选按钮的HTML表单。

我正在创建一个Android应用程序,要求用户输入并将该数据发送到具有HTML表单的网站中,填充它,提交表单,并返回以下结果页。

我已经成功地使用Eclipse中的HtmlUnit库发送数据到HTML表单并检索页面(下面是相关的Java代码)。

然而,当我将这段代码复制到我的Android项目中时,我发现Android不支持HtmlUnit库。

是否有其他替代方案可用于Android?该替代方案应能够将文本、复选框、单选按钮填入HTML表单并单击提交按钮。

HTML表单代码:

<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代码:

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

替代方案应该能够填写文本、复选框、单选按钮到一个HTML表单中,并点击提交按钮。不需要这样做。只需使用HttpUrlConnection将值发布到Web服务器(操作URL)即可。您甚至不必先请求页面,因为您将知道表单上的哪些输入。 - greenapps
你能否进一步解释我如何实现这个?我对Android(实际上是整个编程)非常新手 - 我刚刚上完我的第一门计算机科学课。@greenapps - adonayresom
实际上,@greenapps,我找到了一种方法。谢谢。我考虑了你说的话,并开始在网上搜索。但请尝试回答另一个问题。我在下面发布了问题。 - adonayresom
2个回答

1

各位,我找到了另一种方法。由于我知道服务器的地址,我尝试使用 DataOutputStream 直接将数据发送到服务器。请查看下面的代码:

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

正如您所看到的,我正在使用Html元素的名称通过Java访问它们。然而,从原始帖子中的html表单代码可以看出,单选按钮具有相同的名称,我该如何在不使用它们的名称的情况下分别访问/填充它们?


你是指相同的name="login"吗?你不需要同时填写它们。你什么都不填。你只需为post参数login发送一个值,例如&login=no或&login=yes。 - greenapps
1
您对一系列问题的回答过于热情,所有回答都在宣传同一个答案,因此被社区标记并删除。我们希望确保回答直接针对所提出的问题,并确保重复问题被标记为重复,而不是在多个地方有重复的答案。 - Brad Larson

0
HtmlUnit的开发人员已经开始着手于Android支持。他们最大的问题——HtmlUnit(使用HttpClient)和集成在Android JDK内部的HttpClient版本之间的类版本冲突——现在已经解决了。 你可以使用https://github.com/HtmlUnit/htmlunit-android项目中的分发版。
请试用并报告任何问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接