模拟用户在网页中的点击[JAVA]



我目前正在使用Java在文件中获取特定网页的源代码。

网址为:http://www.studenti.ict.uniba.it/esse3/ListaAppelliOfferta.do

我写了一些代码来做这个:

 try{
      URL url= new URL("http://www.studenti.ict.uniba.it/esse3/ListaAppelliOfferta.do");
      URLConnection urlConn = url.openConnection();
      BufferedReader dis= new BufferedReader(new InputStreamReader((url.openStream())));
      String s="";
      while (( s=dis.readLine())!= null) {
      System.out.println(s);
      }
      dis.close();
      }catch (MalformedURLException mue) {}
      catch (IOException ioe) {}

}

问题是我想"模拟"一个用户选择"[1020]Dipartimento di Informatica"在facoltado和"[1102]Informatica e tecologie per la produczione del Software"在Corso di Studio,然后用户点击"Avvia Ricerca"开始搜索,并显示一个表的结果。

目标是获得网页的源代码也包含在表中的信息我需要。

我注意到,如果我手动做这些选择,然后点击"Avvia Ricerca"开始搜索,网页会再次加载,显示我需要的表中的数据,但URL没有改变。

因此,即使页面现在显示了我需要的数据,当使用我的代码时,我只能获得页面的源代码,因为它是在做选择和做搜索之前。

我以前用HTMLUnit (http://htmlunit.sourceforge.net)做过类似的事情,它可以很好地模拟任何关于网站的东西,并用于抓取。

我建议在web调试器(Ctrl-Shift-I)中打开页面,查看当您做出选择时获取的url,然后在Java应用程序中编程这些获取。这种方法的缺点是,如果页面实现更改,您的代码将中断。

另一种选择是在浏览器沙盒中运行页面Javascript。这也容易出错,甚至可能是不安全的。

通常情况下,您可以通过GET/POST(例如使用url?department=xy)发送此信息,但在您的情况下,它相当复杂,因为站点使用JSF并生成ID(以及选择哪个部门的信息,在那里写入,例如"http://www.studenti.ict.uniba.it/esse3/ListaAppelliOfferta.do;jsessionid=365EB9843B2872E73067693A6095BA35")。

根据你想做什么,你可以使用Selenium (http://docs.seleniumhq.org/)。这模拟了浏览器,您可以获取元素(例如按名称:fac_id的department),并设置值(例如在创建选择元素之后使用selectByValue,记录在这里:http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/Select.html)。

如果你需要在不使用Selenium的情况下这样做(例如,因为你只需要在命令行上这样做,而不使用浏览器本身),你可以尝试停用cookie,然后参数应该在GET或post参数中发送,你可以检查这一点,例如使用Firebug。但这是比较困难的解决方案,Selenium会更容易使用。

最新更新