2017-08-25 39 views
1

我用Selenium webdriver使用Java,我想知道是否有可能獲得JSON體響應?我問,因爲它有可能獲得使用此代碼JSON請求體:Java Selenium得到JSON響應體

driver.manage().logs().get(LogType.PERFORMANCE); 

,但我不能從響應得到的身體,但反應也存在於這個日誌。有什麼辦法得到響應體?

+0

數據是JSON響應comimg ..你想達到 –

+0

請說明您的具體問題或添加額外的細節亮點是什麼正是你所需要的。正如目前所寫,很難確切地說出你在問什麼。請參閱[問]頁面以獲得澄清此問題的幫助。 – JeffC

回答

1

編輯-2

由於未決問題,Geckodriver的,https://github.com/mozilla/geckodriver/issues/764

所以你需要使用一種變通方法,做GeckoDriver確實在後臺爲你

import net.lightbody.bmp.BrowserMobProxyServer; 
import net.lightbody.bmp.client.ClientUtil; 
import net.lightbody.bmp.core.har.Har; 
import net.lightbody.bmp.proxy.CaptureType; 
import org.openqa.selenium.Proxy; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.firefox.FirefoxProfile; 

import java.io.File; 
import java.io.IOException; 

/** 
* Created by tarun.lalwani on 08/29/17. 
*/ 
public class TestApp { 


    public static void main(String [] args) { 

     BrowserMobProxyServer proxyServer = new BrowserMobProxyServer(); 
     proxyServer.start(); 
     proxyServer.setHarCaptureTypes(CaptureType.getAllContentCaptureTypes()); 
     proxyServer.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT); 
     Proxy proxy = ClientUtil.createSeleniumProxy(proxyServer); 
     FirefoxProfile profile = new FirefoxProfile(); 

     String host = proxy.getHttpProxy().split(":")[0]; 
     int port = Integer.parseInt(proxy.getHttpProxy().split(":")[1]); 


     profile.setPreference("network.proxy.type", 1); 
     profile.setPreference("network.proxy.http", host); 
     profile.setPreference("network.proxy.http_port", port); 
     profile.setPreference("network.proxy.ssl", host); 
     profile.setPreference("network.proxy.ssl_port", port); 
     FirefoxDriver driver = new FirefoxDriver(profile); 

     proxyServer.newHar("mysite"); 

     driver.get("http://tarunlalwani.com"); 

     Har har = proxyServer.getHar(); 
     try { 
      har.writeTo(new File("har.json")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

編輯-1

因爲y你想用Java來做到這一點。您需要使用BrowserMobProxy庫爲Java及以下樣的代碼爲你

import net.lightbody.bmp.BrowserMobProxy; 
import net.lightbody.bmp.BrowserMobProxyServer; 
import net.lightbody.bmp.client.ClientUtil; 
import net.lightbody.bmp.core.har.Har; 
import net.lightbody.bmp.proxy.CaptureType; 


..... 

BrowserMobProxy proxy = new BrowserMobProxyServer(); 
proxy.start(0); 

Proxy selProxy = ClientUtil.createSeleniumProxy(proxy); 

DesiredCapabilities cap = new DesiredCapabilities(); 
cap.setCapability(CapabilityType.PROXY, selProxy); 


WebDriver driver = new FirefoxDriver(capabilities); 

proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT); 

proxy.newHar("mysite"); 

driver.get("http://tarunlalwani.com"); 


Har har = proxy.getHar(); 

原來的答案

您需要安裝Firefox的一個BrowserMobProxy應該工作。下面的代碼會爲你

import time 
from selenium import webdriver 

from browsermobproxy import Server 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile 

server = Server("/path/to/bin/browsermob-proxy") 
server.start() 
# If sleep is not added sometime `create_proxy` throws an error 
time.sleep(2) 
proxy = server.create_proxy() 

sel_proxy = proxy.selenium_proxy() 

profile = FirefoxProfile() 
profile.set_proxy(sel_proxy) 
driver = webdriver.Firefox(firefox_profile=profile) 
proxy.new_har("mysite", options={'captureHeaders': True, 'captureContent': True}) 
driver.get("http://tarunlalwani.com") 
print(proxy.har) 

工作這會給輸出像下面

'version': '1.2', 
'creator': { 
    'name': 'BrowserMob Proxy', 
    'version': '2.1.4', 
    'comment': '' 
}, 
'pages': [ 
    { 
    'id': 'mysite', 
    'startedDateTime': '2017-08-25T21:38:08.934+05:30', 
    'title': 'mysite', 
    'pageTimings': { 
     'comment': '' 
    }, 
    'comment': '' 
    } 
], 
'entries': [ 
    { 
    'pageref': 'mysite', 
    'startedDateTime': '2017-08-25T21:38:09.367+05:30', 
    'request': { 
     'method': 'GET', 
     'url': 'http://tarunlalwani.com/', 
     'httpVersion': 'HTTP/1.1', 
.... 

    'response': { 
     'status': 200, 
     'statusText': 'OK', 
     'httpVersion': 'HTTP/1.1', 
     'cookies': [ 

     ], 
     'content': { 
     'size': 21336, 
     'mimeType': 'text/html; charset=utf-8', 
     'text': '<!DOCTYPE html>\n<html lang="en">\n<head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article# website: http://ogp.me/ns/website#">\n <meta http-equiv="content-type" content="text/html; charset=utf-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">\n \n \n  <meta name="description" content="TARUN LALWANI">\n  <meta name="twitter:description" content="TARUN LALWANI">\n \n\n <meta property="og:title" content="TARUN LALWANI">\n <meta property="twitter:title" content="TARUN LALWANI">\n \n <meta property="og:type" content="website">\n \n <meta property="og:description" content="">\n <meta property="og:url" content="http://tarunlalwani.com/">\n <meta property="og:site_name" content="TARUN LALWANI">\n \n\n \n\n \n\n <meta name="generator" content="Hugo 0.25.1" />\n <title>TARUN LALWANI &middot; TARUN LALWANI</title>\n \n <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css">\n <link rel="stylesheet" href="http://tarunlalwani.com/css/style.css">\n\n \n\n \n <link href="http://tarunlalwani.com/index.xml" rel="alternate" type="application/rss+xml" title="TARUN LALWANI" />\n \n \n\n \n \n</head>\n<body>\n\n<nav class="navbar navbar-default navbar-fixed-top visible-xs">\n\t<div class="container-fluid">\n\t\t<div class="navbar-header">\n\t\t\t<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">\n\t\t\t\t<span class="sr-only">Toggle navigation</span>\n\t\t\t\t<span class="icon-bar"></span>\n\t\t\t\t<span class="icon-bar"></span>\n\t\t\t\t<span class="icon-bar"></span>\n\t\t\t</button>\n\t\t\t\n\t\t\t\t<a class="navbar-brand" href="http://tarunlalwani.com/">TARUN LALWANI</a>\n\t\t\t\n\t\t</div>\n\t\t<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">\n\t\t\t<ul class="nav navbar-nav">\n\t\t\t\t\n\t\t\t\t\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n</nav>\n<div class="container-fluid">\n\t<div class="row">\n\t\t<div id="menu" class="hidden-xs col-sm-4 col-md-3">\n\t<div id="menu-content" class="vertical-align">\n\t\t\n\t\t\t< 
+0

我不知道這種語言,我使用Java。在java的FirefoxProfile中我們沒有函數set_proxy –

+0

@MateuszSobczak,請檢查編輯 –

+0

這段代碼不起作用。您可以檢查https://stackoverflow.com/questions/45915525/browsermob-in-java-with-selenium-doesnt-work-different-errors-for-browsers –

1

我建議你看一下對於跟蹤網絡活動的專用工具,如Browsermob Proxy,這可能與硒輕鬆集成。內部硒日誌不適合這種用途。

+0

感謝您的幫助,但是當我實現這個庫到我的項目爲Firefox瀏覽器發生錯誤org.openqa.selenium.SessionNotCreatedException:InvalidArgumentError:預期[對象未定義]未定義是一個整數 –

+0

@MateuszSobczak可能更好地檢查BMP問題跟蹤。可能是最新FF版本/驅動程序的一些問題。 –

+0

什麼是BMP?我使用geckodriver 0.18.0和FIrefox ver 54.0.1 –