java - 登录成功后使用htmlunit获取网页内容
问题描述
我正在尝试使用 htmlunit 执行以下操作:
进入一个页面,然后登录。
成功登录后,获取特定页面,以便我可以使用其内容。
假设服务器位于 mysite.mydomain.com。首先让我描述一下使用实际浏览器(例如 Chrome)会发生什么。
我在地址栏上键入mysite.mydomain.com 。
我到达
mysite.mydomain.com/blahb/blahb.exe/index?SOMETHING=0&SOMETHINGELSE=1
在那里我可以填写我的登录信息,即我可以输入我的用户名和密码,然后按提交按钮。
成功登录后,我最终看到以下页面:
mysite.mydomain.com/blahb/blahinfo.exe/index(blahb.exe变成了 blahinfo.exe)
我有选择。说,菜单。单击我感兴趣的特定选项,将在主窗口框架中弹出一个按钮。我们称这个按钮为“SHOW”。
单击 SHOW,URL 保持不变,但屏幕被分成两帧。顶部和底部。TOP 框架包含我们刚刚按下的按钮 SHOW 以及刚刚出现的两个新按钮:一个用于打印内容,一个用于将内容保存为 PDF。
在底部框架是可以打印或保存的内容,这是我感兴趣的。
对页面代码的简单检查表明,我感兴趣并且在底部框架中描绘的内容来自:
mysite.mydomain.com/blahb/blahinfo.exe/somethingBody
事实上,如果我只是登录到该站点,而不是在那之后按任何菜单按钮,我只需访问:
mysite.mydomain.com/blahb/blahinfo.exe/somethingBody
将导致我在单个帧中在屏幕上获得所需的内容。
如果我登录了,我可以打开另一个标签,粘贴
mysite.mydomain.com/blahb/blahinfo.exe/somethingBody
我会得到内容。
到目前为止非常简单。
现在让我们看看当我使用 htmlunit 时会发生什么。
我可以执行以下操作:
private static HtmlPage loginAndGetPageOfInterest(WebClient webClient) throws Exception
{
//enable whatever I want to enable for the webClient
webClient.getOptions().setJavaScriptEnabled(true);
//deal with cookies
CookieManager cookieManager = new CookieManager(); //seems we need cookies
cookieManager = webClient.getCookieManager();
cookieManager.setCookiesEnabled(true);
String mainURL = "mysite.mydomain.com/blahb/blahb.exe/index?SOMETHING=0&SOMETHINGELSE=1";//want to go there
HtmlPage currentPage = webClient.getPage(mainURL) ;
//Fill the login info and press the button
HtmlTextInput nameInput = currentPage.getHtmlElementById("Id");//find the username field
nameInput.setValueAttribute("Iamtheuser"); //fill it in
HtmlInput passInput = currentPage.getHtmlElementById("Pass"); //likewise for password
passInput.setValueAttribute("andthisismypass");
HtmlButton submit = (HtmlButton) currentPage.getElementsById("login_button").get(0);//find the submit button
currentPage = submit.click();
Thread.sleep(2000); //wait some time to ensure that we have indeed logged in.
//if I were to print currentPage in a file NOW... ALL is well. I get exactly what I get in the browser. If I were to return the currentPage here, everything is fine.
String urlIActuallyWant = "mysite.mydomain.com/blahb/blahinfo.exe/somethingBody";
currentPage = webClient.getPage(urlIActuallyWant);//try to get what I actually want...
return currentPage;
}
现在我可以这样做:
public static void main(String[] args) throws Exception
{
WebClient webClient = new WebClient(BrowserVersion.CHROME); //Could do without saying anything about client version
HtmlPage currentPage = loginAndGetPageOfInterest(webClient);
//save what we have so that we can look at it.
String pageSource = currentPage.asXml();
File file = new File("howInteresting.html");
try
{
Files.write(file.toPath(), pageSource.getBytes());
Desktop.getDesktop().browse(file.toURI());
}
catch (IOException e)
{ //end of the world }
}
但是......当我尝试这个时,我得到:
服务器错误
500内部服务器错误。
您要查找的资源有问题,无法显示。
线程“主”com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException 中的异常: com.gargoylesoftware.htmlunit.WebClient.throwFailingHttpStatusCodeExceptionIfNecessary(WebClient.java ) https://mysite.mydomain.com/blahb/blahinfo.exe/somethingBody的 500 内部服务器错误:595) 在 com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:410) 在 com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:317) 在 com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient. java:469) 在 com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:450) 在 TestWTH.loginAndGetPageOfInterest(TestWTH.java:46) 在 TestWTH.main(TestWTH.java:54)
现在我知道服务器正在发回 500 Internal Server Error,我怀疑这是因为它认为我们没有登录。但为什么会这样呢?
如果我登录然后直接转到感兴趣的页面,在浏览器上可以正常工作,但在使用 htmlunit 时却不行,这让我怀疑这是 cookie 处理的问题。但是为什么cookies会有问题呢?有任何想法吗?
解决方案
推荐阅读
- angular - Angular - 在焦点上显示/隐藏元素
- c# - ASP.NET Core MVC 请求返回 404
- python - Cartopy 是否会导致 Matplotlib clabels 成为 NoneType 对象?很奇怪的bug
- c# - C# Selenium - 在不重启 Chrome 浏览器的情况下更新代理
- angular - 角度 http 帖子未到达后端
- react-native - 我想列出我的数组并且不想重复相同的值
- azure-devops - Azure 管道如何从 Intranet TFS 2018 获取代码
- google-chrome - 为什么 Chrome 上的 VoiceOver 会读取 DIV 中的所有内容?
- python - Python C/C++ 包装器与纯 C/C++ 性能
- angular - 对表单进行更改后,FormControl 未更新状态原始/脏或值