我有一个页面作为HtmlUnit中的UnexpectedPage返回,响应是JSON.我可以使用HTMLUnit来解析这个还是需要一个额外的库?
我正在尝试使用Java中的HtmlUnit登录网站.首先我输入用户名然后输入密码.之后我需要从下拉框中选择一个选项.输入用户和密码似乎有效,但当我尝试从下拉框中选择项目时,我收到错误.谁能帮我解决这个问题?我的代码如下:
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlOption;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSelect;
public class homePage {
  public static void main(String[] args) throws Exception {
    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage("website name here");
    HtmlElement usrname = page.getElementByName("username");
    usrname.click();
    usrname.type("myusername");
    HtmlElement psswrd = page.getElementByName("password");
    psswrd.click();
    psswrd.type("mypassword");
    HtmlSelect select = (HtmlSelect) page.getElementById("cmbProducts");
    HtmlOption option = select.getOptionByValue("ITDirect");
    select.setSelectedAttribute(option, true);
    HtmlElement signin = page.getElementByName("SignIn");
    signin.click();
    System.out.println(page.getTitleText());
    webClient.closeAllWindows();
  }
}
我目前正在学习HtmlUnit以便抓取网站.一切顺利,直到我遇到动态页面(例如,我正在使用Pinterest网站),当用户向下滚动时,动态添加元素.
我已经尝试了几种应该在真实浏览器中触发滚动的方法(我将在下面显示).在进一步讨论之前,我想提一下我已经设置了以下配置:
    webclient.setJavaScriptEnabled(true);
    webclient.setAjaxController(new NicelyResynchronizingAjaxController());
让我们说我想让所有关注者都在Pinterest上.我导航到那个页面,现在从第一次只有24个,我想向下滚动,触发Ajax调用服务器并检索下一组关注者的事件.
1)简单的javascript或jQuery代码触发窗口滚动.
    ScriptResult sr = followersPage.executeJavaScript("window.scrollBy(0,1000)");
    // One version in jQuery
    // ScriptResult sr = followersPage.executeJavaScript("$(window).scrollTop(0,1000);");
    // also tried with the body, html, with animation
    // ScriptResult sr = followersPage.executeJavaScript("$("html, body").animate({ scrollTop: $(document).height() }, 1000);");
    webclient.waitForBackgroundJavaScript(10000);
    followersPage = (HtmlPage)sr.getNewPage();
=>当我检查到顶部的距离时,它等于0,结果页面与原始页面相同.在Eclipse中进行调试时,当我跨越执行javascript的行时,它会直接转到下一行,没有任何延迟.如果我写任何其他JavaScript,例如:
     ScriptResult sr = followersPage.executeJavaScript("$(div.GridItems).html('new content')");
您可以注意到调试器在该行上挂起了半秒钟,这意味着执行了javascript.
2)将焦点从一个跟随锚点更改为另一个(我选择了锚点,因为当您单击TAB键时它在焦点顺序中使用):
    HtmlDivision gridItems = followersPage.getFirstByXPath("//div[contains(concat(' ',@class,' '),' GridItems ')]");
    List<HtmlDivision> els = (List<HtmlDivision>) gridItems.getByXPath("//div[@class='item ']");
    List<HtmlDivision> items = (List<HtmlDivision>) gridItems.getByXPath("//div[@class='item ']");
    for (HtmlDivision item : items) {
        HtmlAnchor a …我需要保存来自网站的文件HtmlUnit.我目前正在导航到有几个使用javascript onClick()="DownloadAttachment('attachmentId')"获取文件的锚点的页面.这些文件几乎可以是任何类型的文件(xls,doc,txt,pdf,jpg等).到目前为止,虽然我一直无法找到显示如何使用保存文件的资源或示例htmlUnit.我一直在努力AttachmentHandler为此工作,因为它似乎最有可能工作,但一直没有成功.我想知道是否有其他人设法使用下载文件HtmlUnit并可以提供帮助?
希望有人可以迅速指出我的XPath困难正确的方向.
目前我已经到了我在HTML源代码中识别我需要的正确表格的那一点,但后来我只需要处理在DOM中某处有文本"Chapter"的行.
我的最后一次尝试是这样做:
// get the correct table
HtmlTable table = page.getFirstByXPath("//table[2]");
// now the failing bit....
def rows = table.getByXPath("*/td[contains(text(),'Chapter')]") 
我认为上面的xpath代表,让我所有具有后续子元素'td'的元素在其dom中的某个地方包含文本'Chapter'
我的源代码中匹配行的示例如下:
<tr valign="top">
  <td nowrap="" align="Right">
   <font face="Verdana">
   <a href="index.cfm?a=1">Chapter 1</a>
   </font>
  </td>
  <td class="ChapterT">
    <font face="Verdana">DEFINITIONS</font>
  </td>
  <td> </td>
</tr>
任何帮助/指针非常感谢.
谢谢,
我正在使用动态网页中的HtmlUnit抓取数据,动态网页使用无限滚动来动态获取数据,就像facebook的新闻源一样.我使用以下句子来模拟向下滚动事件:
webclient.setJavaScriptEnabled(true);
webclient.setAjaxController(new NicelyResynchronizingAjaxController());
ScriptResult sr=myHtmlPage.executeJavaScript("window.scrollBy(0,600)");
webclient.waitForBackgroundJavaScript(10000);
myHtmlPage=(HtmlPage)sr.getNewPage();
但似乎myHtmlPage与前一个保持相同,即myHtmlPage中没有附加新数据,因此我只能抓取网页上的前几个数据.谢谢你的帮助!
使用Scala中的默认隐式执行上下文,是否会在单个专用线程上计算每个新的未来,还是将计算划分并分发到线程池中的多个线程?
我不知道这是否有帮助,这个问题的背景是我想使用HtmlUnit API执行多个并发操作.为此,我将每个新的WebClient实例包装在Future中.唯一的问题是WebClient类不是线程安全的,所以我担心它可能会被分解并发送到不同的线程.
无法真正找到任何帮助,但我一直在尝试用HtmlUnit发送一个帖子请求.我的代码是:
final WebClient webClient = new WebClient();
// Instead of requesting the page directly we create a WebRequestSettings object
WebRequest requestSettings = new WebRequest(
  new URL("www.URLHERE.com"), HttpMethod.POST);
// Then we set the request parameters
requestSettings.setRequestParameters(new ArrayList());
requestSettings.getRequestParameters().add(new NameValuePair("name", "value"));
// Finally, we can get the page
HtmlPage page = webClient.getPage(requestSettings);
有没有更简单的方法可以执行POST请求?
我在C#中构建一个应用程序,它使用com.gargoylesoftware.htmlunit.WebClient来访问和检索来自网页的信息.
我的应用程序从主项目运行良好,但当我尝试构建单元测试来测试项目类时,我收到以下错误:
FactoryConfigurationError
Message "Provider com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found"
Source  "IKVM.OpenJDK.XML.API"  string
StackTrace  "   at javax.xml.parsers.DocumentBuilderFactory.newInstance()
at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.loadConfiguration(Reader configurationReader)
at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.loadConfiguration()
at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration..ctor(BrowserVersion )
at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.getInstance(BrowserVersion browserVersion)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine..ctor(WebClient webClient)
at com.gargoylesoftware.htmlunit.WebClient.init(BrowserVersion , ProxyConfig )
at com.gargoylesoftware.htmlunit.WebClient..ctor(BrowserVersion browserVersion)
at com.gargoylesoftware.htmlunit.WebClient..ctor()
at GWT.HeadlessBrowser..ctor() in C:\\hg\\EXE\\GWT\\HeadlessBrowser.cs:line 57
at TestGWT.ProgramTest.TestLogInProcessForGWT() in C:\\hg\\TestGWT\\ProgramTest.cs:line 115"
尝试在单元测试类中创建HtmlUnit WebClient也会导致此错误.
我在主项目和包含单元测试的项目中都有项目引用htmlunit-2.7,IKVM.OpenJDK.Core和IKVM.OpenJDK.XML.API.
我是否需要额外的项目参考才能运行单元测试?可能导致此错误的原因是什么?
测试类使用Microsoft.VisualStudio.TestTools.UnitTesting;
htmlunit ×10
java ×5
ajax ×2
javascript ×2
attachment ×1
c# ×1
concurrency ×1
future ×1
groovy ×1
json ×1
pinterest ×1
scala ×1
scroll ×1
unit-testing ×1
web-crawler ×1
webclient ×1
xml ×1
xpath ×1