2015-10-05 122 views
1

我需要验证浏览器上显示的单词文件的内容。所以我下载了doc文件。 我的下载代码如下:在java中下载HTTPS文件

private String downloader(WebElement element, String attribute) throws IOException, NullPointerException, URISyntaxException {   
     localDownloadPath = "c:\\downloads"; 
fileToDownloadLocation = "https://xyz.abc.com/link1/docs/"+element.getAttribute(attribute); 

     if (fileToDownloadLocation.trim().equals("")) throw new NullPointerException("The element you have specified does not link to anything!"); 
     fileToDownloadLocation = fileToDownloadLocation.replaceAll(" ","%20");  

     URL fileToDownload = new URL(fileToDownloadLocation);    
     HttpClient client = HttpClientBuilder.create().build(); 
     HttpsURLConnection con = (HttpsURLConnection)fileToDownload.openConnection(); 
     System.out.println(con); 
     //for cookies management 
//  BasicHttpContext localContext = new BasicHttpContext(); 
     HttpClientContext localContext = HttpClientContext.create(); 
     LOG.info("Mimic WebDriver cookie state: " + this.mimicWebDriverCookieState); 
     if (this.mimicWebDriverCookieState) { 
      localContext.setAttribute(ClientContext.COOKIE_STORE, mimicCookieState(this.driver.manage().getCookies())); 
     } 

     //core downloading part 
     HttpGet request = new HttpGet(fileToDownload.toURI()); 
     LOG.info("Sending GET request for: " + request.getURI()); 
     HttpResponse response = client.execute(request, localContext); 
     this.httpStatusOfLastDownloadAttempt = response.getStatusLine().getStatusCode(); 
     LOG.info("HTTP GET request status: " + this.httpStatusOfLastDownloadAttempt); 
     File downloadedFile = new File(this.localDownloadPath + fileToDownload.getFile().replaceFirst("/|\\\\", ""));   
     if (downloadedFile.canWrite() == false) downloadedFile.setWritable(true); 
     LOG.info("Downloading file: " + downloadedFile.getName()); 
     FileUtils.copyInputStreamToFile(response.getEntity().getContent(), downloadedFile); 
     response.getEntity().getContent().close(); 

     String downloadedFileAbsolutePath = downloadedFile.getAbsolutePath(); 
     LOG.info("File downloaded to '" + downloadedFileAbsolutePath + "'"); 

     return downloadedFileAbsolutePath; 
    } 

它正在为http网站工作。它甚至可以为一个https网站工作。但是当我尝试它为其他https网站,我得到一个错误,如下所示:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 
    at sun.security.ssl.InputRecord.handleUnknownRecord(Unknown Source) 
    at sun.security.ssl.InputRecord.read(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:535) 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:403) 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177) 
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446) 
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) 
    at com.iso.mozart.test.ui.FileDownloader.downloader(FileDownloader.java:166) 
    at com.iso.mozart.test.ui.FileDownloader.downloadFile(FileDownloader.java:59) 
    at com.iso.mozart.test.pageobjects.SearchResultsPage.downloadAFile(SearchResultsPage.java:293) 
    at com.iso.mozart.test.pageobjects.SearchResultsPage.searchByKeywords(SearchResultsPage.java:142) 
    at com.iso.mozart.test.ui.MozartUITest.testMozart(MozartUITest.java:57) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

org.openqa.selenium.WebDriverException: Error communicating with the remote browser. It may have died. 
Build info: version: '2.45.0', revision: '5017cb8', time: '2015-02-26 23:59:50' 
System info: host: 'QAWIN7VMP04', ip: '10.16.96.19', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_40' 
Driver info: driver.version: EventFiringWebDriver 
Command duration or timeout: 9.17 seconds 
Build info: version: '2.45.0', revision: '5017cb8e7ca8e37638dc3091b2440b90a1d8686f', time: '2015-02-27 09:10:26' 
System info: host: 'enparajuli', ip: '192.168.79.35', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_05' 
Driver info: org.openqa.selenium.remote.RemoteWebDriver 
Capabilities [{nativeEvents=true, webdriver.remote.sessionid=4c85c8d0-e184-44d9-aba1-e439c4d50b78, browserName=internet explorer, takesScreenshot=true, javascriptEnabled=true, handlesAlerts=true, version=-1, cssSelectorsEnabled=true, platform=WINDOWS}] 
Session ID: 4c85c8d0-e184-44d9-aba1-e439c4d50b78 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204) 
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:622) 
    at org.openqa.selenium.remote.RemoteWebDriver.quit(RemoteWebDriver.java:468) 
    at com.iso.mozart.test.ui.common.driver.BrowserDriver.stop(BrowserDriver.java:666) 
    at com.iso.mozart.test.navigator.impl.MozartNavigatorImpl.stop(MozartNavigatorImpl.java:67) 
    at com.iso.mozart.test.ui.BaseTestCase.stop(BaseTestCase.java:83) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:37) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died. 
Build info: version: '2.45.0', revision: '5017cb8', time: '2015-02-26 23:59:50' 
System info: host: 'QAWIN7VMP04', ip: '10.16.96.19', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_40' 
Driver info: driver.version: EventFiringWebDriver 
Build info: version: '2.45.0', revision: '5017cb8e7ca8e37638dc3091b2440b90a1d8686f', time: '2015-02-27 09:10:26' 
System info: host: 'enparajuli', ip: '192.168.79.35', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_05' 
Driver info: driver.version: unknown 

我无法弄清楚我做错了什么。任何人都可以帮忙吗? 热烈欢迎任何形式的帮助。

回答

0

Java 7引入了默认启用的SNI支持。某些配置错误的服务器会在SSL握手中发送“无法识别的名称”警告,而大多数客户端会忽略此警告,但Java除外。

尝试将-Djsse.enableSNIExtension=false添加到Java命令参数中,并查看它是否有帮助。

From here

内下载方法,添加System.setProperty("jsse.enableSNIExtension", "false")看看它是否有帮助。

+0

我只想下载文件。我无法修改服务器文件。顺便说一下,该应用程序是使用dotnet开发的。 – i82186

+0

@ i82186不需要修改服务器文件。您只需要将此参数添加到启动测试的Java命令行中即可。或者,在'downloader'方法中设置属性(请参阅更新)。 – KDM

+0

我在我的下载器函数中添加了这个:System.setProperty(“jsse.enableSNIExtension”,“false”)。但仍遇到同样的错误。 – i82186