代码之家  ›  专栏  ›  技术社区  ›  Warlax

从Java调用网页上的JavaScript

  •  3
  • Warlax  · 技术社区  · 14 年前

    我的目标是连接到OWA页面(Microsoft Office Outlook Web Access,基本上是电子邮件客户端)并登录,然后读取加载的新页面并查找收件箱计数。

    要登录,我需要填写用户名和密码字段,并调用一个我知道名称和标题的特定javascript函数。

    我如何:

    1. 获取页面的DOM?
    2. 是否更新DOM以填充输入文本字段?
    3. 调用javascript函数?
    4. 获取我重定向到的页面的新URL?

    到目前为止,我可以连接到一个网页,并使用下面的Java代码加载它的页面源代码:

                    // open the connection to the welcome page
                    callback.status("Opening connection...");
                    URLConnection connection = null;
                    try
                    {
                        connection = url.openConnection();
                    }
                    catch(IOException ex)
                    {
                        throw new Exception("I/O Problem while attempting URL connection");
                    }
    
                    connection.setDoInput(true);
    
                    // open input stream to read website
                    callback.status("Opening data stream...");
                    InputStream input = null;
                    try
                    {
                        input = connection.getInputStream();
                    }
                    catch(IOException ex)
                    {
                        throw new Exception("I/O Problem while opening data stream");
                    }
    
                    // read website contents
                    callback.status("Reading site...");
    
                    String content = "";
                    byte[] buffer = new byte[100];
                    int totalBytesRead = 0;
                    int bytesRead = 0;
                    try
                    {
                        while((bytesRead = input.read(buffer)) != -1)
                        {
                            String newContent = new String(buffer, 0, bytesRead);
                            content += newContent;
                        }
                    }
                    catch(IOException ex)
                    {
                        throw new Exception("I/O Problem while reading website");
                    }
    
                    System.out.println(content);
    

    结果是整个页面源被输出到控制台-太好了。 我还尝试解析页面以获取一个DOM对象,然后可以按照该对象查找用户名和密码字段:

                    XMLParserConfiguration config = new XML11DTDConfiguration();
                    DOMParser parser = new DOMParser(config);
                    InputSource inputSource = new InputSource(input);
                    inputSource.setByteStream(input);
                    try
                    {
                        parser.parse(inputSource);
                    }
                    catch(SAXParseException ex)
                    {
    
                    }
                    Document document = parser.getDocument();
                    visitNode(document, 0);
    

    但是我得到了一个SAXParseException::6:62:publicID和systemID之间需要空白。

    看来这句话应该归咎于:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    

    因此,我可能需要以某种方式更改domparser的配置,使其足够宽泛并“原谅”空白需求。

    1 回复  |  直到 14 年前
        1
  •  11
  •   Community paulsm4    7 年前

    所以你想像一个无图形用户界面的WebBrowser一样编程吗?使用 HtmlUnit 这正是它自己做广告的原因。

    HTMLUnter是一个“Java程序的无GUI浏览器”。它为HTML文档建模并提供一个API,允许您调用页面、填写表单、单击链接等…就像你在“普通”浏览器中一样。

    它有相当好的JavaScript支持(不断改进),甚至可以与相当复杂的Ajax库一起工作,根据您想要使用的配置模拟Firefox或Internet Explorer。

    它通常用于测试目的或从网站检索信息。

    参见: