如何使用现有WebClient发布自定义HEAD请求?即页面上没有表单,我想手动设置请求属性.
我刚刚开始使用HTMLUnit,我正在寻找的是获取一个网页并从中提取原始文本减去所有的html标记.
htmlunit可以实现吗?如果是这样,怎么样?或者我应该看另一个图书馆?
例如,如果页面包含
<body><p>para1 test info</p><div><p>more stuff here</p></div>
Run Code Online (Sandbox Code Playgroud)
我想要输出
para1 test info more stuff here
Run Code Online (Sandbox Code Playgroud)
谢谢
我还没有找到一个明确而明显的建议来模仿HtmlUnit中浏览器的"后退"按钮.你做过这个吗?如果是这样,怎么样?
我想出的最好的事情是在当前页面上执行javascript:
ScriptResult result = currentPage.executeJavaScript("javascript:window.history.back();");
currentPage = (HtmlPage)result.getNewPage();
Run Code Online (Sandbox Code Playgroud)
是否有建议的方法用htmlunit返回历史记录中的一个页面?回到上面的代码会有什么影响?虽然我没有说服自己HtmlUnit实际上对不同浏览器的javascript解释进行了任何准确的模拟,但是我使用上述代码使用HtmlUnit的完整容量来模拟浏览器的后退按钮有多接近?有没有办法比这更好地模拟浏览器的后退按钮?
另外,我注意到HtmlUnit中的History类,但它似乎毫无价值.思考?
这是我的代码:
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
final WebClient webClient = new WebClient();
final HtmlPage startPage = webClient.getPage("http://htmlunit.sf.net");
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
11-04 21:58:08.761: ERROR/dalvikvm(17868): Could not find class 'com.gargoylesoftware.htmlunit.DefaultCssErrorHandler', referenced from method com.gargoylesoftware.htmlunit.WebClient.<init>
11-04 21:58:08.771: ERROR/dalvikvm(17868): Could not find class 'com.gargoylesoftware.htmlunit.DefaultCssErrorHandler', referenced from method com.gargoylesoftware.htmlunit.WebClient.<init>
11-04 21:58:09.501: ERROR/AndroidRuntime(17868): FATAL EXCEPTION: AsyncTask #1
11-04 21:58:09.501: ERROR/AndroidRuntime(17868): java.lang.RuntimeException: An error occured while executing doInBackground()
11-04 21:58:09.501: ERROR/AndroidRuntime(17868): at android.os.AsyncTask$3.done(AsyncTask.java:200)
11-04 21:58:09.501: ERROR/AndroidRuntime(17868): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
11-04 21:58:09.501: ERROR/AndroidRuntime(17868): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
11-04 21:58:09.501: ERROR/AndroidRuntime(17868): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
11-04 21:58:09.501: …Run Code Online (Sandbox Code Playgroud) 我只想要页面的文本内容,我希望获取尽可能轻量级.我可以关闭HTMLUnit开箱即用的JavaScript,CSS和其他外部内容的所有解析和附加加载吗?
我已经下载了htmlunit 2.11 zip.我提取它.然后我试图将它们粘贴到我的项目的libs文件夹中.从libs文件夹我已经在构建路径中添加它们.然后我得到这个错误,而我正在尝试运行我的应用程序
conversion to dalvik format failed with error 1
然后,从stackoverflow我发现,一个人说要删除xalan xercesImpl xml-apis.我删除了它们.但得到这个错误:
Error generating final archive: Found duplicate file for APK: about.html
错误消息还显示哪些文件存在冲突.他们jetty-http jetty-io jetty-util jetty-websocket然后我再次运行我的应用程序.这次它显示了一些警告.我忽略了他们.但我的应用程序崩溃说classNotFound
顺便说一句,我也删除了httpclientjar.因为有人说httpclient已经内置了android.
这是我的问题.现在,任何人都可以帮助我吗?我真的想在我的应用程序中使用htmlunit
编辑:
如果你向我展示步骤,'如何在我的项目中添加htmlunit',这将非常有用
编辑2:
主要是我有一个链接,我登录后得到(我通过网页浏览登录)这个链接给我一个简单的页面.在该页面中有一个textarea和一个提交按钮.并且还有一些javascript(我认为这些javascript运行,当我按下提交按钮).我可以通过webview来做,但由于某种原因,我不想使用webview.当我按下提交按钮时,它会提供textarea的值以及现有cookie的隐藏字段的某些值(当我通过webview登录时获取)Post方法.我需要在没有webview的情况下这样做.现在除了htmlunit还有其他选择吗?我听说过HttpClient,HttpUrlConnection.还有一件事,agter提交它会将我重定向到另一页.我不需要对此重定向页面执行任何操作.
注意:如果这个问题不适合我之前的问题,那么你可以建议我,我会发一个新问题.谢谢
--- TL; DR
此时我建议大家将他们的持续集成服务器/服务绑定到https://ghostinspector.com/
老问题
经过三天的谷歌搜索和测试,我放弃了,我需要帮助.
我的目标是允许我的同事用Selenium IDE记录一个或多个测试.导出它们,将它们上传到服务器,然后使用带有htmlunit的webdriver让这台服务器运行这些测试.在我们构建或修复应用程序时,我们将上传测试以制作测试库.
用Selenium IDE记录测试是可以的.但让它运行就是问题所在.我们打算让测试的机器是linux亚马逊服务器.没有前端的东西,没有kde,gtk,所以没有firefox,chrome等...这就是为什么我已经指定了htmlunit驱动程序.
到目前为止,我无法将此任务运行到我的机器上 - Ubuntu 12.04 x86_64.
我下载了selenium-server tarball,并尝试运行:
java -jar selenium-server.jar -htmlSuite "*webdriver" "our.site.org" "/path/to/testsuite1.html" "/path/to/report1.html"
Run Code Online (Sandbox Code Playgroud)
没有成功.甚至更改"*webdriver"(使用其他弹出浏览器屏幕).
我试过运行服务器和独立服务器并通过浏览器连接.
我试过facebook的PHP绑定.
我已经尝试过PHPUnit和测试Selenium类 - 以及他们各自从Selenium Formatters导出的脚本.
我真的不知道我在哪里滑倒.任何人都可以给我一个安全的方向,教程等跟随?
--- 编辑
好的,我的问题可能会恢复为:
使用HtmlUnit驱动程序,允许我使用selenium-server运行selenese脚本的命令行是什么?
continuous-integration selenium ui-testing htmlunit selenium-webdriver
我是maven和jasmine的新手,我在设置maven以在角度应用程序上运行单元测试时遇到问题.一旦我将angular-mocks.js添加到test/javascript/lib文件夹中,我就陷入了麻烦.
mvn testhtmlunit.ScriptException通过添加angular-mocks文件抛出一个just.如果我删除文件,它运行得很好(当然没有部件依赖于模拟,但它们作为单元测试失败而不是抛出错误).
有谁知道什么可能导致此错误以及如何解决它?
编辑
我强烈怀疑这是一个htmlunit问题,因为更改时错误不同<browserVersion>:
CHROME给出:
TypeError:在对象[object HTMLDocument]中找不到函数attachEvent.(
http://localhost:55408/src/lib/angular.js#1568)
FIREFOX_3_6给出:
使用参数[String,NativeArray,Boolean]调用Node.removeEventListener()的异常
INTERNET_EXPLORER_9给出:
使用参数[String,NativeArray]调用Node.detachEvent()的异常
堆栈跟踪(摘录FF):
[ERROR] Failed to execute goal com.github.searls:jasmine-maven-plugin:1.3.1.2:test (default) on project my-jasmine-project: The jasmine-maven-plugin encountered an exception:
[ERROR] java.lang.RuntimeException: org.openqa.selenium.WebDriverException: com.gargoylesoftware.htmlunit.ScriptException: Exception invoking Node.removeEventListener() with arguments [String, NativeArray, Boolean]
[ERROR] Build info: version: '2.32.0', revision: '6c40c187d01409a5dc3b7f8251859150c8af0bcb', time: '2013-04-09 10:39:28'
[ERROR] System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.8.4', java.version: '1.6.0_51'
[ERROR] Driver info: driver.version: HtmlUnitDriver
[ERROR] …Run Code Online (Sandbox Code Playgroud) unit-testing mocking htmlunit angularjs jasmine-maven-plugin
我试图从一个动态附加数据加载的页面获取数据.
规格:HTMLUnit:版本:2.14
但滚动后我无法获得新页面.我尝试使用各种浏览器版本和所有可能的代码更改.如果有人能让我知道我做错了什么就会很棒.而且document.documentElement.scrollTop;总是归零.
final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.waitForBackgroundJavaScript(60000);
HtmlPage page = webClient.getPage("http://www.snapdeal.com/products/mobiles-mobile-phones/?q=Brand:Samsung");
System.out.println(page.getTitleText());
final String pageAsXml = page.asXml();
System.out.println("Page1=\n" + pageAsXml);
String s = "window.scrollBy(0, window.innerHeight);document.documentElement.scrollTop;";
ScriptResult sr = page.executeJavaScript(s);
JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager();
while (manager.getJobCount() > 4) {
System.out.println("SCript Job count = " + manager.getJobCount());
Thread.sleep(1000);
}
System.out.println("Result= " + sr.getJavaScriptResult() + "\n");
HtmlPage page2 = (HtmlPage) sr.getNewPage();
if(page == page2)
System.out.println("No difference");
else
System.out.println("Page2\n" + page2.asXml());
Run Code Online (Sandbox Code Playgroud)
感谢和问候
Reeni
我使用GoDaddy SSL证书在Glassfish上有一个JAVA EE webapp.HTTP侦听器重定向到HTTPS.
我正在尝试HtmlUnit从webapp获取Googlebot抓取工具的页面.代码在未启用SSL的登台服务器上按预期工作.但是,在带有GoDaddy SSL证书的实时服务器上,HtmlUnit尝试获取网页时出现以下错误.
我已经尝试了这里指定的解决方法(http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/),但是没有没有帮助.任何想法,为什么我得到这个错误?
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1917)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:301)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:295)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1471)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:936)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:871)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1043)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:275)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:254)
at com.gargoylesoftware.htmlunit.HtmlUnitSSLConnectionSocketFactory.connectSocket(HtmlUnitSSLConnectionSocketFactory.java:155)
at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:117)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:314)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:178)
at …Run Code Online (Sandbox Code Playgroud) htmlunit ×10
java ×5
android ×2
angularjs ×1
automation ×1
browser ×1
java-ee ×1
javascript ×1
mocking ×1
selenium ×1
ssl ×1
ui-testing ×1
unit-testing ×1