How to get HTTP Response Code using Selenium WebDriver
我已经使用Selenium2 / WebDriver编写了测试,并且想测试HTTP请求是否返回HTTP 403 Forbidden。
是否可以使用Selenium WebDriver获取HTTP响应状态代码?
一言以蔽之。无法使用Selenium WebDriver API。此问题已在项目的问题跟踪器中进行了讨论,并且该功能不会添加到API中。
可以使用Selenium和Chrome或Firefox获取http请求的响应代码。您要做的就是以日志记录模式启动Chrome或Firefox。我将在下面显示一些示例。
Java +硒+铬
这是一个Java + Selenium + Chrome的示例,但我想它可以用任何语言(python,c#,...)完成。
您需要做的就是告诉chromedriver执行" Network.enable"。这可以通过启用性能日志记录来完成。
1 2 3 | LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs); |
请求完成后,您要做的就是获取并迭代Perfomance日志,并为请求的URL找到" Network.responseReceived":
1 | LogEntries logs = driver.manage().logs().get("performance"); |
这是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | import java.util.Iterator; import java.util.logging.Level; import org.json.JSONException; import org.json.JSONObject; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.logging.LogEntries; import org.openqa.selenium.logging.LogEntry; import org.openqa.selenium.logging.LogType; import org.openqa.selenium.logging.LoggingPreferences; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; public class TestResponseCode { public static void main(String[] args) { // simple page (without many resources so that the output is // easy to understand String url ="http://www.york.ac.uk/teaching/cws/wws/webpage1.html"; DownloadPage(url); } private static void DownloadPage(String url) { ChromeDriver driver = null; try { ChromeOptions options = new ChromeOptions(); // add whatever extensions you need // for example I needed one of adding proxy, and one for blocking // images // options.addExtensions(new File(file,"proxy.zip")); // options.addExtensions(new File("extensions", //"Block-image_v1.1.crx")); DesiredCapabilities cap = DesiredCapabilities.chrome(); cap.setCapability(ChromeOptions.CAPABILITY, options); // set performance logger // this sends Network.enable to chromedriver LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(cap); // navigate to the page System.out.println("Navigate to" + url); driver.navigate().to(url); // and capture the last recorded url (it may be a redirect, or the // original url) String currentURL = driver.getCurrentUrl(); // then ask for all the performance logs from this request // one of them will contain the Network.responseReceived method // and we shall find the"last recorded url" response LogEntries logs = driver.manage().logs().get("performance"); int status = -1; System.out.println("\ List of log entries:\ "); for (Iterator<LogEntry> it = logs.iterator(); it.hasNext();) { LogEntry entry = it.next(); try { JSONObject json = new JSONObject(entry.getMessage()); System.out.println(json.toString()); JSONObject message = json.getJSONObject("message"); String method = message.getString("method"); if (method != null &&"Network.responseReceived".equals(method)) { JSONObject params = message.getJSONObject("params"); JSONObject response = params.getJSONObject("response"); String messageUrl = response.getString("url"); if (currentURL.equals(messageUrl)) { status = response.getInt("status"); System.out.println( "---------- bingo !!!!!!!!!!!!!! returned response for" + messageUrl +":" + status); System.out.println( "---------- bingo !!!!!!!!!!!!!! headers:" + response.get("headers")); } } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("\ status code:" + status); } finally { if (driver != null) { driver.quit(); } } } } |
输出看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | Navigate to http://www.york.ac.uk/teaching/cws/wws/webpage1.html List of log entries: {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameAttached","params":{"parentFrameId":"172.1","frameId":"172.2"}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameStartedLoading","params":{"frameId":"172.2"}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameNavigated","params":{"frame":{"securityOrigin":"://","loaderId":"172.1","name":"chromedriver dummy frame","id":"172.2","mimeType":"text/html","parentId":"172.1","url":"about:blank"}}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameStoppedLoading","params":{"frameId":"172.2"}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameStartedLoading","params":{"frameId":"3928.1"}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.requestWillBeSent","params":{"request":{"headers":{"Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"},"initialPriority":"VeryHigh","method":"GET","mixedContentType":"none","url":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html"},"frameId":"3928.1","requestId":"3928.1","documentURL":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html","initiator":{"type":"other"},"loaderId":"3928.1","wallTime":1.47619492749007E9,"type":"Document","timestamp":20226.652971}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.responseReceived","params":{"frameId":"3928.1","requestId":"3928.1","response":{"headers":{"Accept-Ranges":"bytes","Keep-Alive":"timeout=4, max=100","Cache-Control":"max-age=300","Server":"Apache/2.2.22 (Ubuntu)","Connection":"Keep-Alive","Content-Encoding":"gzip","Vary":"Accept-Encoding","Expires":"Tue, 11 Oct 2016 14:13:47 GMT","Content-Length":"1957","Date":"Tue, 11 Oct 2016 14:08:47 GMT","Content-Type":"text/html"},"connectionReused":false,"timing":{"pushEnd":0,"workerStart":-1,"proxyEnd":-1,"workerReady":-1,"sslEnd":-1,"pushStart":0,"requestTime":20226.65335,"sslStart":-1,"dnsStart":0,"sendEnd":31.6569999995409,"connectEnd":31.4990000006219,"connectStart":0,"sendStart":31.5860000009707,"dnsEnd":0,"receiveHeadersEnd":115.645999998378,"proxyStart":-1},"encodedDataLength":-1,"remotePort":80,"mimeType":"text/html","headersText":"HTTP/1.1 200 OK\ \ Date: Tue, 11 Oct 2016 14:08:47 GMT\ \ Server: Apache/2.2.22 (Ubuntu)\ \ Accept-Ranges: bytes\ \ Cache-Control: max-age=300\ \ Expires: Tue, 11 Oct 2016 14:13:47 GMT\ \ Vary: Accept-Encoding\ \ Content-Encoding: gzip\ \ Content-Length: 1957\ \ Keep-Alive: timeout=4, max=100\ \ Connection: Keep-Alive\ \ Content-Type: text/html\ \ \ \ ","securityState":"neutral","requestHeadersText":"GET /teaching/cws/wws/webpage1.html HTTP/1.1\ \ Host: www.york.ac.uk\ \ Connection: keep-alive\ \ Upgrade-Insecure-Requests: 1\ \ User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\ \ Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\ \ Accept-Encoding: gzip, deflate, sdch\ \ Accept-Language: en-GB,en-US;q=0.8,en;q=0.6\ \ \ \ ","url":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html","protocol":"http/1.1","fromDiskCache":false,"fromServiceWorker":false,"requestHeaders":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Upgrade-Insecure-Requests":"1","Connection":"keep-alive","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36","Host":"www.york.ac.uk","Accept-Encoding":"gzip, deflate, sdch","Accept-Language":"en-GB,en-US;q=0.8,en;q=0.6"},"remoteIPAddress":"144.32.128.84","statusText":"OK","connectionId":11,"status":200},"loaderId":"3928.1","type":"Document","timestamp":20226.770012}}} ---------- bingo !!!!!!!!!!!!!! returned response for http://www.york.ac.uk/teaching/cws/wws/webpage1.html: 200 ---------- bingo !!!!!!!!!!!!!! headers: {"Accept-Ranges":"bytes","Keep-Alive":"timeout=4, max=100","Cache-Control":"max-age=300","Server":"Apache/2.2.22 (Ubuntu)","Connection":"Keep-Alive","Content-Encoding":"gzip","Vary":"Accept-Encoding","Expires":"Tue, 11 Oct 2016 14:13:47 GMT","Content-Length":"1957","Date":"Tue, 11 Oct 2016 14:08:47 GMT","Content-Type":"text/html"} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.dataReceived","params":{"dataLength":2111,"requestId":"3928.1","encodedDataLength":1460,"timestamp":20226.770425}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameNavigated","params":{"frame":{"securityOrigin":"http://www.york.ac.uk","loaderId":"3928.1","id":"3928.1","mimeType":"text/html","url":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html"}}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.dataReceived","params":{"dataLength":1943,"requestId":"3928.1","encodedDataLength":825,"timestamp":20226.782673}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.loadingFinished","params":{"requestId":"3928.1","encodedDataLength":2285,"timestamp":20226.770199}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.loadEventFired","params":{"timestamp":20226.799391}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameStoppedLoading","params":{"frameId":"3928.1"}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.domContentEventFired","params":{"timestamp":20226.845769}}} {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.requestWillBeSent","params":{"request":{"headers":{"Referer":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"},"initialPriority":"High","method":"GET","mixedContentType":"none","url":"http://www.york.ac.uk/favicon.ico"},"frameId":"3928.1","requestId":"3928.2","documentURL":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html","initiator":{"type":"other"},"loaderId":"3928.1","wallTime":1.47619492768527E9,"type":"Other","timestamp":20226.848174}}} status code: 200 |
Java +硒+ Firefox
我终于也找到了Firefox的窍门。您需要使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.GeckoDriverService; public class TestFirefoxResponse { public static void main(String[] args) throws InterruptedException, IOException { GeckoDriverService service = null; // tell firefox to log http requests // at level 4 = PR_LOG_DEBUG: debug messages, notices // you could log everything at level 5, but the log file will // be larger. // create a temporary log file that will be parsed for // response code Map<String, String> map = new HashMap<String, String>(); map.put("MOZ_LOG","timestamp,sync,nsHttp:4"); File tempFile = File.createTempFile("mozLog",".txt"); map.put("MOZ_LOG_FILE", tempFile.getAbsolutePath()); GeckoDriverService.Builder builder = new GeckoDriverService.Builder(); service = builder.usingAnyFreePort() .withEnvironment(map) .build(); service.start(); WebDriver driver = new FirefoxDriver(service); // test 200 String url ="https://api.ipify.org/?format=text"; // test 404 // String url ="https://www.advancedwebranking.com/lsdkjflksdjfldksfj"; driver.get(url); driver.quit(); String logContent = FileUtils.readFileToString(tempFile); ParseLog(logContent, url); } private static void ParseLog(String logContent, String url) throws MalformedURLException { // this is how the log looks like when the request starts // I have to get the id of the request using a regular expression // and use that id later to get the response // // 2017-11-02 14:14:01.170000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::BeginConnect [this=000000BFF27A5000] // 2017-11-02 14:14:01.170000 UTC - [Main Thread]: D/nsHttp host=api.ipify.org port=-1 // 2017-11-02 14:14:01.170000 UTC - [Main Thread]: D/nsHttp uri=https://api.ipify.org/?format=text String pattern ="BeginConnect \\\\[this=(.*?)\\\\](?:.*?)uri=(.*?)\\\\s"; Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); Matcher m = p.matcher(logContent); String urlID = null; while (m.find()) { String id = m.group(1); String uri = m.group(2); if (uri.equals(url)) { urlID = id; break; } } System.out.println("request id =" + urlID); // this is how the response looks like in the log file // ProcessResponse [this=000000CED8094000 httpStatus=200] // I will use another regular espression to get the httpStatus // // 2017-11-02 14:45:39.296000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::OnStartRequest [this=000000CED8094000 request=000000CED8014BB0 status=0] // 2017-11-02 14:45:39.296000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::ProcessResponse [this=000000CED8094000 httpStatus=200] pattern ="ProcessResponse \\\\[this=" + urlID +" httpStatus=(.*?)\\\\]"; p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); m = p.matcher(logContent); if (m.find()) { String responseCode = m.group(1); System.out.println("response code found" + responseCode); } else { System.out.println("response code not found"); } } } |
的输出将是
request id = 0000007653D67000
response code found 200
响应头也可以在日志文件中找到。如果需要,可以获取它们。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp http response [ 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp HTTP/1.1 404 Not Found 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Accept-Ranges: bytes 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Cache-control: no-cache="set-cookie" 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Content-Type: text/html; charset=utf-8 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Date: Thu, 02 Nov 2017 14:54:36 GMT 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp ETag:"7969-55bc076a61e80" 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Last-Modified: Tue, 17 Oct 2017 16:17:46 GMT 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Server: Apache/2.4.23 (Amazon) PHP/5.6.24 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Set-Cookie: AWSELB=5F256FFA816C8E72E13AE0B12A17A3D540582F804C87C5FEE323AF3C9B638FD6260FF473FF64E44926DD26221AAD2E9727FD739483E7E4C31784C7A495796B416146EE83;PATH=/ 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Content-Length: 31081 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Connection: keep-alive 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp OriginalHeaders 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Accept-Ranges: bytes 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Cache-control: no-cache="set-cookie" 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Content-Type: text/html; charset=utf-8 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Date: Thu, 02 Nov 2017 14:54:36 GMT 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp ETag:"7969-55bc076a61e80" 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Last-Modified: Tue, 17 Oct 2017 16:17:46 GMT 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Server: Apache/2.4.23 (Amazon) PHP/5.6.24 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Set-Cookie: AWSELB=5F256FFA816C8E72E13AE0B12A17A3D540582F804C87C5FEE323AF3C9B638FD6260FF473FF64E44926DD26221AAD2E9727FD739483E7E4C31784C7A495796B416146EE83;PATH=/ 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Content-Length: 31081 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp Connection: keep-alive 2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp ] 2017-11-02 14:54:36.775000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::OnStartRequest [this=0000008A65D85000 request=0000008A65D1F900 status=0] 2017-11-02 14:54:36.775000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::ProcessResponse [this=0000008A65D85000 httpStatus=404] |
您可以使用BrowserMob代理使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // Start the BrowserMob proxy ProxyServer server = new ProxyServer(9978); server.start(); server.addResponseInterceptor(new HttpResponseInterceptor() { @Override public void process(HttpResponse response, HttpContext context) throws HttpException, IOException { System.out.println(response.getStatusLine()); } }); // Get selenium proxy Proxy proxy = server.seleniumProxy(); // Configure desired capability for using proxy server with WebDriver DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(CapabilityType.PROXY, proxy); // Set up driver WebDriver driver = new FirefoxDriver(capabilities); driver.get("http://stackoverflow.com/questions/6509628/webdriver-get-http-response-code"); // Close the browser driver.quit(); |
对于那些使用Python的人,您可能会考虑Selenium Wire,这是我开发的用于检查测试期间浏览器发出的请求的库。
您可以通过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from seleniumwire import webdriver # Import from seleniumwire # Create a new instance of the Firefox driver driver = webdriver.Firefox() # Go to the Google home page driver.get('https://www.google.com') # Access requests via the `requests` attribute for request in driver.requests: if request.response: print( request.path, request.response.status_code, request.response.headers['Content-Type'] ) |
印刷品:
1 2 3 4 5 6 7 | https://www.google.com/ 200 text/html; charset=UTF-8 https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png 200 image/png https://consent.google.com/status?continue=https://www.google.com&pc=s×tamp=1531511954&gl=GB 204 text/html; charset=utf-8 https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 200 image/png https://ssl.gstatic.com/gb/images/i2_2ec824b0.png 200 image/png https://www.google.com/gen_204?s=webaft&t=aft&atyp=csi&ei=kgRJW7DBONKTlwTK77wQ&rt=wsrt.366,aft.58,prt.58 204 text/html; charset=UTF-8 ... |
该库使您能够访问标头,状态代码,正文内容,以及修改标头和重写URL的能力。
我也遇到了同样的问题,并且停留了几天,但经过一些研究,我发现我们实际上可以使用chrome的" --remote-debugging-port"结合硒Web驱动程序来拦截请求。
使用以下伪代码作为参考:
使用远程调试创建chrome驱动程序实例
1 2 3 4 5 | int freePort = findFreePort(); chromeOptions.addArguments("--remote-debugging-port=" + freePort); ChromeDriver driver = new ChromeDriver(chromeOptions);` |
拨打http://127.0.0.1:freePort
1 |
提取chrome的webSocket Url进行收听,您可以看到响应并弄清楚如何提取
1 | String webSocketUrl = response.substring(response.indexOf("ws://127.0.0.1"), response.length() - 4); |
连接到此套接字,您可以使用asyncHttp
1 | socket = maketSocketConnection( webSocketUrl ); |
启用网络捕获
1 | socket.send( {"id" : 1,"method" :"Network.enable" } ); |
现在chrome将发送所有与网络相关的事件并按如下方式捕获它们
1 2 3 4 5 6 7 8 9 | socket.onMessageReceived( String message ){ Json responseJson = toJson(message); if( responseJson.method =="Network.responseReceived" ){ //extract status code } } driver.get("http://stackoverflow.com"); |
您可以执行开发工具网站中提到的所有操作。
参见https://chromedevtools.github.io/devtools-protocol/
注意:-使用chromedriver 2.39或更高版本。
希望对您有所帮助。
参考:使用Google Chrome远程调试协议
获取任何语言的响应代码(使用JavaScript):
如果您的Selenium测试在现代浏览器中运行,则获取响应代码的一种简单方法是发送同步
1 2 3 4 5 | var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://exampleurl.ex', false); xhr.send(null); assert(200, xhr.status); |
您可以通过请求Selenium执行脚本,将该技术与任何编程语言一起使用。例如,在Java中,您可以使用
1 2 3 4 5 6 7 8 | final String GET_RESPONSE_CODE_SCRIPT = "var xhr = new XMLHttpRequest();" + "xhr.open('GET', arguments[0], false);" + "xhr.send(null);" + "return xhr.status"; JavascriptExecutor javascriptExecutor = (JavascriptExecutor) webDriver; Assert.assertEquals(200, javascriptExecutor.executeScript(GET_RESPONSE_CODE_SCRIPT,"http://exampleurl.ex")); |
*您可以改为发送异步
获取Java中的响应代码:
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | URL url = new URL("http://exampleurl.ex"); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); // You may need to copy over the cookies that Selenium has in order // to imitate the Selenium user (for example if you are testing a // website that requires a sign-in). Set<Cookie> cookies = webDriver.manage().getCookies(); String cookieString =""; for (Cookie cookie : cookies) { cookieString += cookie.getName() +"=" + cookie.getValue() +";"; } httpURLConnection.addRequestProperty("Cookie", cookieString); Assert.assertEquals(200, httpURLConnection.getResponseCode()); |
该方法可能也可以推广到其他语言,但是需要进行修改以适合该语言(或库)的API。
不确定这是您要查找的内容,但是我有一个不同的目标是检查是否存在远程映像,并且不会出现403错误,因此可以使用以下方法:
1 2 3 4 5 6 7 8 9 10 11 12 | public static boolean linkExists(String URLName){ try { HttpURLConnection.setFollowRedirects(false); HttpURLConnection con = (HttpURLConnection) new URL(URLName).openConnection(); con.setRequestMethod("HEAD"); return (con.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (Exception e) { e.printStackTrace(); return false; } } |
直接使用Selenium WebDriver无法获得HTTP响应代码。该代码可以通过使用Java代码获得,并且可以在Selenium WebDriver中使用。
要通过java获取HTTP响应代码:
1 2 3 4 5 6 7 | public static int getResponseCode(String urlString) throws MalformedURLException, IOException{ URL url = new URL(urlString); HttpURLConnection huc = (HttpURLConnection)url.openConnection(); huc.setRequestMethod("GET"); huc.connect(); return huc.getResponseCode(); } |
现在,您可以编写Selenium WebDriver代码,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private static int statusCode; public static void main(String... args) throws IOException{ WebDriver driver = new FirefoxDriver(); driver.manage().window().maximize(); driver.get("https://www.google.com/"); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); List<WebElement> links = driver.findElements(By.tagName("a")); for(int i = 0; i < links.size(); i++){ if(!(links.get(i).getAttribute("href") == null) && !(links.get(i).getAttribute("href").equals(""))){ if(links.get(i).getAttribute("href").contains("http")){ statusCode= getResponseCode(links.get(i).getAttribute("href").trim()); if(statusCode == 403){ System.out.println("HTTP 403 Forbidden #" + i +"" + links.get(i).getAttribute("href")); } } } } } |
您可以尝试Mobilenium(https://github.com/rafpyprog/Mobilenium),这是一个将BrowserMob代理和Selenium绑定在一??起的python软件包。
一个用法示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> from mobilenium import mobidriver >>> >>> browsermob_path = 'path/to/browsermob-proxy' >>> mob = mobidriver.Firefox(browsermob_binary=browsermob_path) >>> mob.get('http://python-requests.org') 301 >>> mob.response['redirectURL'] 'http://docs.python-requests.org' >>> mob.headers['Content-Type'] 'application/json; charset=utf8' >>> mob.title 'Requests: HTTP for Humans \\u2014 Requests 2.13.0 documentation' >>> mob.find_elements_by_tag_name('strong')[1].text 'Behold, the power of Requests' |