我试图在HtmlUnit的帮助下登录这个网站,但点击登录后返回相同的页面,输入字段由我无法登录的值填充请建议我解决方案.
我正在尝试下面的代码
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(true);
webClient.getOptions().setRedirectEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getCookieManager().setCookiesEnabled(true);
String url="http://xxxxxxxxx.xxx/";
String name="XXXX";//here real value i am putting for name, accountNo and pass instead of XXXX
String accountNo="XXXX";
String pass="XXXX";
HtmlPage page = webClient.getPage(url);
System.out.println("1st page : "+page.asText());
HtmlForm form=(HtmlForm)page.getElementById("aspnetForm");
HtmlInput uName=(HtmlInput)form.getByXPath("//*[@id=\"ctl00_LoginControl_textUserName_text\"]").get(0);
uName.setValueAttribute(name);
HtmlInput acNo=(HtmlInput)form.getByXPath("//*[@id=\"ctl00_LoginControl_textCompanyAccount_text\"]").get(0);
acNo.setValueAttribute(accountNo);
HtmlPasswordInput password=(HtmlPasswordInput)form.getByXPath("//*[@id=\"ctl00_LoginControl_textPassword\"]").get(0);
password.setValueAttribute(pass);
HtmlSubmitInput button = (HtmlSubmitInput) form.getByXPath("//*[@id=\"ctl00_LoginControl_buttonLogin\"]").get(0);
page = (HtmlPage) button.click();
System.out.println("2nd Page : "+page.asText());
webClient.closeAllWindows();
Run Code Online (Sandbox Code Playgroud)
单击登录按钮后,同一页面将返回填充的输入字段.所以请帮帮我.谢谢
我正在使用HtmlUnit库for Java以编程方式操作网站.我找不到解决问题的方法:如何确定所有AJAX调用都已完成并返回一个完全加载的网页?这是我尝试过的:
首先,我创建WebClient实例并调用我的方法processWebPage(String url, WebClient webClient)
WebClient webClient = null;
try {
webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.setThrowExceptionOnScriptError(false);
webClient.setThrowExceptionOnFailingStatusCode(false);
webClient.setJavaScriptEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
} catch (Exception e) {
System.out.println("Error");
}
HtmlPage currentPage = processWebPage("http://www.example.com", webClient);
Run Code Online (Sandbox Code Playgroud)
这是我的方法,它应该返回一个完全加载的网页:
private static HtmlPage processWebPage(String url, WebClient webClient) {
HtmlPage page = null;
try {
page = webClient.getPage(url);
} catch (Exception e) {
System.out.println("Get page error");
}
int z = webClient.waitForBackgroundJavaScript(1000);
int counter = 1000;
while (z > 0) {
counter += 1000;
z …Run Code Online (Sandbox Code Playgroud) 我有一个包含多行和类似输入的表单。它们具有不同的 ID,但名称相同。
<input id="E2EMPL1" class="uppercase required" type="text" value="" maxlength="9" size="9" name="E2EMPL">
<input id="E2EMPL2" class="uppercase required" type="text" value="" maxlength="9" size="9" name="E2EMPL">
Run Code Online (Sandbox Code Playgroud)
我可以填第一行,没问题,但是要填第二行,我就想不通了。
这是填写第一行:
HtmlPage mainPage = webClient.getPage(siteName);
form = mainPage.getFormByName("timeForm");
for (TimeEntry te: aList){
form.getInputByName("chkaction").setValueAttribute("checked");
form.getInputByName("E2EMPL").setValueAttribute(te.getResource());
form.getInputByName("ww_fE2WKDT").setValueAttribute(te.getEntryDate());
}
Run Code Online (Sandbox Code Playgroud)
但是当名称保持不变时,我不确定如何填写第 2 行,但 ID 更改为 EMPL1、EMPL2 等。我想我应该使用 xpath,但我不确定如何填写?
form.getByXPath("//input[@id='E2EMPL2']"); ???
编辑:作为旁注。我曾尝试使用 HTTPClient 来发布数据。不幸的是,它不适用于这种形式,我不知道为什么。我在这里问了一个问题,但从来没有得到任何答案,也没有足够的代表来悬赏。但是,我只是尝试了 HTMLUnit,如果我填写表单并点击提交按钮,它会正常工作。这就是我不使用 HTTPClient 的原因。
如果有人想看这个问题,我把它删除了,但如果有人真的想看,我会取消删除它。
HTML表单有5行数据,填充一行有点慢,点击提交5次vs填充5行然后点击提交。我希望它会快一点,但如果不可能做到这一点,我会放弃这个。我希望有些人可以有洞察力。
我正在编写代码以使用 HtmlUnit 登录网站。它一直在 eclipse 中工作,但现在我决定将它移到 Android studio 中在应用程序中使用它。我有2个问题。
为什么 HtmlUnit 需要 API 26,对于现在的技术来说已经非常高了(只有 19% 的用户),但它只是一个网络模拟器?
为什么在创建 webClient 时会出现此错误?我的例外是:
java.lang.BootstrapMethodError: Exception from call site #4 bootstrap method
at com.gargoylesoftware.htmlunit.WebClient.addDefaultHeaders(WebClient.java:1496)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1392)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1321)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:394)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:315)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:466)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:448)
at notas.com.mistarapp.Student.login(Student.java:65)
Run Code Online (Sandbox Code Playgroud)
这是我正在经历的代码。所有内容都已导入,并且不会突出显示为错误。这是我的代码:
try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
HtmlPage firstPage = webClient.getPage(link);
// waitForBackgroundJavaScript has to be called after every action
webClient.waitForBackgroundJavaScript(100);
System.out.println("Access to the login page is made.");
System.out.println("-------------------------------------------------------------------------------");
// Get the form that we are …Run Code Online (Sandbox Code Playgroud) 我正在使用Html Unit转到网页,填写一些表格,然后单击按钮进入下一个网页.那个新的网页(在我的代码中称为newPage)是我从中提取html源代码的.
这种方法在Netbeans中完美运行(虽然它确实提供了过多的警告)
import org.jsoup.Jsoup;
/* Regular (textview, button, etc) imports */
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
String username = "USERNAME", school = "SCHOOL", userpassword = "PASSWORD";
HtmlElement loginName = null;
HtmlElement password = null;
//HtmlPage newPage;
HtmlAnchor anchorByHref = null;
try {
WebClient webClient = new WebClient();
final HtmlPage page = webClient
.getPage("https://cupertino.schoolloop.com/portal/login?d=x&return_url=1325402408153");
loginName = page.getElementByName("login_name");
password = page.getElementByName("password");
loginName.setTextContent(username);
loginName.setAttribute("value", username);
password.setAttribute("value", userpassword);
password.setTextContent(userpassword);
anchorByHref …Run Code Online (Sandbox Code Playgroud) 为什么HtmlUnit比GUI浏览器慢得多?例如,HtmlUnit 在14秒内加载此页面http://oltexpress.airkiosk.com/cgi-bin/airkiosk/I7/181002i?O2=2(当CSS支持关闭时),而FF在5秒内加载(清除缓存后) ,CSS支持).我知道,现代浏览器在处理糟糕的JS代码时没有那么严格,而HtmlUnit是,但是这里的时间差异仍然是无法容忍的.
有关如何加快使用HtmlUnit的任何想法?有没有人玩过HtmlUnit缓存?
现在我正在开发一个webcrawler.这个应该解析一些特定的站点,并给我一个输出到xml文件.到目前为止,这没问题.Crawler可以工作,您可以通过cfg文件快速自定义它.我使用Jsoup来解析HTML内容.
我刚刚添加了一些网站,并注意到我通过JavaScript创建的HTML内容存在巨大问题.难道没有办法让Jsoup支持Javascript吗?或者至少获取我在浏览器中可以看到的完整HTML内容.
我已经尝试过HtmlUnit,但是这个并不好.它没有给我我在浏览器中获得的内容.
诚恳,
Ogofo
我正在尝试使用HtmlUnit登录Facebook页面并查看其HTML内容.我正在尝试通过HtmlUnit填写登录凭据,但是当单击提交按钮时我看不到会话正在进行.
无法在htmlunit会话管理类中找到很多内容.我还附加了我正在使用的代码来尝试此问题.任何帮助赞赏!
WebClient webClient = new WebClient();
HtmlPage page1 = webClient.getPage("https://www.facebook.com");
List<HtmlForm> listF = page1.getForms();
HtmlForm form = null;
for(int i=0; i<listF.size(); i++)
{
if(listF.get(i).getId().equals("login_form"))
{
form = listF.get(i);
}
}
HtmlTextInput uName = form.getInputByName("email");
HtmlPasswordInput passWord = form.getInputByName("pass");
HtmlSubmitInput button = form.getInputByValue("Log In");
uName.setValueAttribute(FACEBOOK_UNAME);
passWord.setValueAttribute(FACEBOOK_PASS);
HtmlPage page2 = button.click();
Run Code Online (Sandbox Code Playgroud) 我是HtmlUnit的新手,我甚至不确定它是否适合我的项目.我正在尝试解析一个网站并从中提取我需要的值.我需要从这里获得值"07:05",
<span class="tim tim-dep">07:05</span>
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用getTextContent()来提取值,但我不知道如何选择特定的跨度.我使用getElementById来查找
<div>
Run Code Online (Sandbox Code Playgroud)
这个表达式所属的标签,但当我得到该div的文本内容时,我得到了一整行含有大量不必要数据的文本.有人可以告诉我如何选择这个表达式,可能使用类名吗?
我正在编写一个程序,需要从输入文本文件中读取数据,并在完成日期时保存变量.我正在使用Htmlunit,并遇到错误:
com.gargoylesoftware.htmlunit.ScriptException: Exception invoking open
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:684)
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:616)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:591)
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:985)
at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:210)
at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:230)
at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:804)
at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:738)
at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:869)
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602)
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507)
at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:874)
at com.gargoylesoftware.htmlunit.html.HtmlElement.doClickFireClickEvent(HtmlElement.java:1311)
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1253)
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1205)
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1160)
at Docketscraper.scrapeWebsite(Docketscraper.java:58)
at Docketscraper.starter(Docketscraper.java:40)
Run Code Online (Sandbox Code Playgroud)
我的代码是:
private static String startingMonth;
private static String startingDay;
private static String startingYear;
private static String endingMonth;
private static String endingDay;
private static String endingYear;
public static void starter() throws IOException{
Scanner sc = new …Run Code Online (Sandbox Code Playgroud) htmlunit ×10
java ×7
android ×2
html ×2
caching ×1
eclipse ×1
html-parsing ×1
javascript ×1
jsoup ×1
sessionid ×1