├── TODO.md ├── selenium ├── libs │ ├── sac-1.3.jar │ ├── bsh-1.3.0.jar │ ├── guava-15.0.jar │ ├── jna-3.4.0.jar │ ├── htmlunit-2.13.jar │ ├── httpcore-4.3.jar │ ├── ini4j-0.5.2.jar │ ├── json-20080701.jar │ ├── testng-6.8.5.jar │ ├── xalan-2.7.1.jar │ ├── commons-io-2.2.jar │ ├── httpmime-4.3.1.jar │ ├── jcommander-1.29.jar │ ├── junit-dep-4.11.jar │ ├── nekohtml-1.9.19.jar │ ├── operadriver-1.5.jar │ ├── xml-apis-1.4.01.jar │ ├── apache-mime4j-0.6.jar │ ├── cglib-nodep-2.1_3.jar │ ├── commons-codec-1.8.jar │ ├── commons-exec-1.1.jar │ ├── commons-jxpath-1.3.jar │ ├── commons-lang3-3.1.jar │ ├── cssparser-0.9.11.jar │ ├── hamcrest-core-1.3.jar │ ├── httpclient-4.3.1.jar │ ├── jna-platform-3.4.0.jar │ ├── netty-3.5.7.Final.jar │ ├── serializer-2.7.1.jar │ ├── xercesImpl-2.10.0.jar │ ├── hamcrest-library-1.3.jar │ ├── protobuf-java-2.4.1.jar │ ├── commons-logging-1.1.1.jar │ ├── htmlunit-core-js-2.13.jar │ ├── jetty-websocket-8.1.8.jar │ ├── phantomjsdriver-1.1.0.jar │ └── commons-collections-3.2.1.jar ├── selenium-java-2.40.0.jar ├── selenium-java-2.40.0-srcs.jar └── CHANGELOG ├── BappManifest.bmf ├── BappDescription.html ├── README.md └── realRender.py /TODO.md: -------------------------------------------------------------------------------- 1 | * Attempt to fix Selenium deadlock when user manually intervenes on JavaScript alert boxes -------------------------------------------------------------------------------- /selenium/libs/sac-1.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/sac-1.3.jar -------------------------------------------------------------------------------- /selenium/libs/bsh-1.3.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/bsh-1.3.0.jar -------------------------------------------------------------------------------- /selenium/libs/guava-15.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/guava-15.0.jar -------------------------------------------------------------------------------- /selenium/libs/jna-3.4.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/jna-3.4.0.jar -------------------------------------------------------------------------------- /selenium/libs/htmlunit-2.13.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/htmlunit-2.13.jar -------------------------------------------------------------------------------- /selenium/libs/httpcore-4.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/httpcore-4.3.jar -------------------------------------------------------------------------------- /selenium/libs/ini4j-0.5.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/ini4j-0.5.2.jar -------------------------------------------------------------------------------- /selenium/libs/json-20080701.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/json-20080701.jar -------------------------------------------------------------------------------- /selenium/libs/testng-6.8.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/testng-6.8.5.jar -------------------------------------------------------------------------------- /selenium/libs/xalan-2.7.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/xalan-2.7.1.jar -------------------------------------------------------------------------------- /selenium/libs/commons-io-2.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/commons-io-2.2.jar -------------------------------------------------------------------------------- /selenium/libs/httpmime-4.3.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/httpmime-4.3.1.jar -------------------------------------------------------------------------------- /selenium/libs/jcommander-1.29.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/jcommander-1.29.jar -------------------------------------------------------------------------------- /selenium/libs/junit-dep-4.11.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/junit-dep-4.11.jar -------------------------------------------------------------------------------- /selenium/libs/nekohtml-1.9.19.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/nekohtml-1.9.19.jar -------------------------------------------------------------------------------- /selenium/libs/operadriver-1.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/operadriver-1.5.jar -------------------------------------------------------------------------------- /selenium/libs/xml-apis-1.4.01.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/xml-apis-1.4.01.jar -------------------------------------------------------------------------------- /selenium/selenium-java-2.40.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/selenium-java-2.40.0.jar -------------------------------------------------------------------------------- /selenium/libs/apache-mime4j-0.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/apache-mime4j-0.6.jar -------------------------------------------------------------------------------- /selenium/libs/cglib-nodep-2.1_3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/cglib-nodep-2.1_3.jar -------------------------------------------------------------------------------- /selenium/libs/commons-codec-1.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/commons-codec-1.8.jar -------------------------------------------------------------------------------- /selenium/libs/commons-exec-1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/commons-exec-1.1.jar -------------------------------------------------------------------------------- /selenium/libs/commons-jxpath-1.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/commons-jxpath-1.3.jar -------------------------------------------------------------------------------- /selenium/libs/commons-lang3-3.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/commons-lang3-3.1.jar -------------------------------------------------------------------------------- /selenium/libs/cssparser-0.9.11.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/cssparser-0.9.11.jar -------------------------------------------------------------------------------- /selenium/libs/hamcrest-core-1.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/hamcrest-core-1.3.jar -------------------------------------------------------------------------------- /selenium/libs/httpclient-4.3.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/httpclient-4.3.1.jar -------------------------------------------------------------------------------- /selenium/libs/jna-platform-3.4.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/jna-platform-3.4.0.jar -------------------------------------------------------------------------------- /selenium/libs/netty-3.5.7.Final.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/netty-3.5.7.Final.jar -------------------------------------------------------------------------------- /selenium/libs/serializer-2.7.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/serializer-2.7.1.jar -------------------------------------------------------------------------------- /selenium/libs/xercesImpl-2.10.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/xercesImpl-2.10.0.jar -------------------------------------------------------------------------------- /selenium/libs/hamcrest-library-1.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/hamcrest-library-1.3.jar -------------------------------------------------------------------------------- /selenium/libs/protobuf-java-2.4.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/protobuf-java-2.4.1.jar -------------------------------------------------------------------------------- /selenium/selenium-java-2.40.0-srcs.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/selenium-java-2.40.0-srcs.jar -------------------------------------------------------------------------------- /selenium/libs/commons-logging-1.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/commons-logging-1.1.1.jar -------------------------------------------------------------------------------- /selenium/libs/htmlunit-core-js-2.13.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/htmlunit-core-js-2.13.jar -------------------------------------------------------------------------------- /selenium/libs/jetty-websocket-8.1.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/jetty-websocket-8.1.8.jar -------------------------------------------------------------------------------- /selenium/libs/phantomjsdriver-1.1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/phantomjsdriver-1.1.0.jar -------------------------------------------------------------------------------- /selenium/libs/commons-collections-3.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PortSwigger/browser-repeater/master/selenium/libs/commons-collections-3.2.1.jar -------------------------------------------------------------------------------- /BappManifest.bmf: -------------------------------------------------------------------------------- 1 | Uuid: 215390e63f314c20958a23930eb1555a 2 | ExtensionType: 2 3 | Name: Browser Repeater 4 | RepoName: browser-repeater 5 | ScreenVersion: 0.1 6 | SerialVersion: 1 7 | MinPlatformVersion: 0 8 | ProOnly: False 9 | Author: Nadeem Douba 10 | ShortDescription: Automatically renders Repeater responses in Firefox. 11 | EntryPoint: realRender.py 12 | -------------------------------------------------------------------------------- /BappDescription.html: -------------------------------------------------------------------------------- 1 |

This extension renders responses returned in the Repeater tool in a real browser (specifically Firefox). 2 |

3 |

The extension uses Selenium, a popular browser automation framework, to control the web browser when the Repeater tool is used in Burp Suite. 4 | Think of this extension as the automatic 'Show Response In Browser' (SRIB) tool. 5 | Instead of using the SRIB feature repeatedly in Burp Suite, this extension automates the process and makes pen-testing web apps that use mostly JavaScript rendered web pages much easier.

6 |

Known Issue: If a JavaScript alert box appears and the operator manually accepts the alert, Selenium will cease operation and the extension will deadlock. 7 | The only work around for this issue is to manually close the browser and restart the 8 | extension.

-------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | About 2 | ----- 3 | 4 | This BurpSuite plugin renders responses returned in the Repeater tool in a real browser (specifically Firefox). The plugin uses 5 | Selenium, a popular browser automation framework, to control the web browser when the Repeater tool is used in Burp 6 | Suite. Think of this extension as the automatic 'Show Response In Browser' (SRIB) tool. Instead of using the SRIB 7 | feature repeatedly in Burp Suite, this extension automates the process and makes pen-testing web apps that use mostly 8 | JavaScript rendered web pages much easier. 9 | 10 | 11 | Requirements 12 | ------------ 13 | 14 | You'll need the following to get started: 15 | - the standalone version of Jython available at http://www.jython.org/downloads.html. 16 | - the latest version of BurpSuite versions 1.6 or later. 17 | - Firefox 18 | - a positive attitude! 19 | 20 | 21 | Known Issues & Workarounds 22 | -------------------------- 23 | 24 | If a JavaScript alert box appears and the operator manually accepts the alert, Selenium will cease operation and the 25 | extension will deadlock. The only work around for this issue is to manually close the browser and restart the plugin. 26 | 27 | 28 | Help! 29 | ----- 30 | 31 | This is still a work in progress so their may be a few bugs I haven't hammered out. 32 | -------------------------------------------------------------------------------- /realRender.py: -------------------------------------------------------------------------------- 1 | from Queue import Queue 2 | import SocketServer 3 | from burp import (IBurpExtender, IHttpListener, IBurpExtenderCallbacks, IExtensionStateListener) 4 | from threading import Thread, Event 5 | 6 | import sys 7 | import os 8 | 9 | from urlparse import urlparse, urlunparse 10 | from urllib import quote 11 | 12 | import SimpleHTTPServer 13 | 14 | 15 | try: 16 | raise NotImplementedError("No error") 17 | except Exception, e: 18 | exc_type, exc_obj, exc_tb = sys.exc_info() 19 | root = os.path.dirname(exc_tb.tb_frame.f_code.co_filename) 20 | sys.path.extend([os.path.join(p, j) for p, d, f in os.walk(root) for j in f if j.endswith('.jar')]) 21 | 22 | from org.openqa.selenium import Proxy, NoAlertPresentException 23 | from org.openqa.selenium.firefox import FirefoxDriver 24 | from org.openqa.selenium.remote import DesiredCapabilities, CapabilityType 25 | 26 | __author__ = 'Nadeem Douba' 27 | __copyright__ = 'Copyright 2012, dotNetBeautifier Project' 28 | __credits__ = [] 29 | 30 | __license__ = 'GPL' 31 | __version__ = '0.1' 32 | __maintainer__ = 'Nadeem Douba' 33 | __email__ = 'ndouba@gmail.com' 34 | __status__ = 'Development' 35 | 36 | 37 | class DriverThread(Thread): 38 | def __init__(self, queue): 39 | super(DriverThread, self).__init__() 40 | self.queue = queue 41 | proxyServer = 'localhost:8080' 42 | proxy = Proxy() 43 | proxy.setHttpProxy(proxyServer) 44 | proxy.setSslProxy(proxyServer) 45 | capabilities = DesiredCapabilities() 46 | capabilities.setCapability(CapabilityType.PROXY, proxy) 47 | self.driver = FirefoxDriver(capabilities) 48 | 49 | def run(self): 50 | firstRun = True 51 | while True: 52 | url = self.queue.get() 53 | if not firstRun: 54 | self._acceptAlerts() 55 | elif firstRun: 56 | firstRun = False 57 | if not url: 58 | break 59 | sys.stdout.write('Fetching %s... ' % url) 60 | self.driver.get(url) 61 | print 'done.' 62 | self.queue.task_done() 63 | self.queue.task_done() 64 | self.driver.close() 65 | 66 | def _acceptAlerts(self): 67 | print '\n------ BEGIN ALERTS ------\n' 68 | while True: 69 | try: 70 | alert = self.driver.switchTo().alert() 71 | print 'javascript:alert(%s);' % repr(alert.getText()) 72 | alert.dismiss() 73 | except NoAlertPresentException: 74 | print '\n------ END ALERTS ------\n' 75 | self.driver.switchTo().defaultContent() 76 | return 77 | 78 | 79 | class DummyServer(Thread): 80 | 81 | def __init__(self): 82 | super(DummyServer, self).__init__() 83 | self._stop = Event() 84 | 85 | def run(self): 86 | httpd = SocketServer.TCPServer(('127.0.0.1', 31337), SimpleHTTPServer.SimpleHTTPRequestHandler) 87 | while not self.stopped(): 88 | httpd.handle_request() 89 | 90 | def stop(self): 91 | self._stop.set() 92 | 93 | def stopped(self): 94 | return self._stop.isSet() 95 | 96 | 97 | class BurpExtender(IBurpExtender, IHttpListener, IExtensionStateListener): 98 | _redirectTemplate = 'HTTP/1.1 200 OK\r\n' \ 99 | 'Cache-Control: no-cache, no-store\r\n' \ 100 | 'Pragma: no-cache\r\n' \ 101 | 'Content-Type: text/html; charset=utf-8\r\n' \ 102 | 'Expires: -1\r\n\r\n' \ 103 | '' \ 104 | 'Please wait while we redirect you to your final destination...\r\n\r\n' 105 | 106 | def registerExtenderCallbacks(self, callbacks): 107 | self._callbacks = callbacks 108 | self._helpers = callbacks.getHelpers() 109 | self._requestMaps = {} 110 | self._responses = {} 111 | self._counter = 0 112 | self._inCurrentSession = True 113 | 114 | self._queue = Queue() 115 | self._driver = DriverThread(self._queue) 116 | self._driver.start() 117 | self._dummyServer = DummyServer() 118 | self._dummyServer.start() 119 | 120 | callbacks.setExtensionName('Browser Renderer') 121 | callbacks.registerHttpListener(self) 122 | callbacks.registerExtensionStateListener(self) 123 | 124 | def _standardizeUrl(self, url): 125 | u = urlparse(url) 126 | if ':' not in u.netloc: 127 | return urlunparse(( 128 | u.scheme, 129 | '%s:%d' % (u.netloc, 80 if u.scheme == 'http' else 443), 130 | u.path, 131 | u.params, 132 | u.query, 133 | u.fragment 134 | )) 135 | return url 136 | 137 | def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo): 138 | url = self._standardizeUrl(str(messageInfo.getUrl())) 139 | if toolFlag == IBurpExtenderCallbacks.TOOL_REPEATER: 140 | if messageIsRequest and url not in self._requestMaps: 141 | uniqueUrl = 'http://localhost:31337/realRenderer/%d' % self._counter 142 | self._requestMaps[url] = uniqueUrl 143 | self._requestMaps[uniqueUrl] = url 144 | self._counter += 1 145 | elif not messageIsRequest: 146 | self._callbacks.printError('Saving response for %s\n' % url) 147 | self._queue.join() # block until the last request is completed 148 | self._responses[(self._requestMaps[url], url)] = messageInfo.getResponse() 149 | self._callbacks.printError('Save complete for %s!\n' % url) 150 | self._queue.put(self._requestMaps[url]) 151 | self._callbacks.printError('Navigating to %s in browser.\n' % url) 152 | elif toolFlag == IBurpExtenderCallbacks.TOOL_PROXY and not messageIsRequest: 153 | if url in self._requestMaps: 154 | if url.startswith('http://localhost:31337/realRenderer/'): 155 | messageInfo.setResponse( 156 | self._helpers.stringToBytes( 157 | self._redirectTemplate % quote(self._requestMaps[url]) 158 | ) 159 | ) 160 | else: 161 | for h in self._helpers.analyzeRequest(messageInfo.getRequest()).getHeaders(): 162 | if h.startswith('Referer:'): 163 | referer = self._standardizeUrl(h.split(': ')[1]) 164 | if (referer, url) in self._responses and self._responses[(referer, url)]: 165 | messageInfo.setResponse(self._responses[(referer, url)]) 166 | break 167 | 168 | 169 | def extensionUnloaded(self): 170 | self._queue.put(None) 171 | self._driver.join() 172 | self._dummyServer.stop() -------------------------------------------------------------------------------- /selenium/CHANGELOG: -------------------------------------------------------------------------------- 1 | v2.40.0 2 | ======= 3 | WebDriver: 4 | * Update to support native events for Firefox 27 (removed native event 5 | support for Firefox 25). 6 | * Removed the iPhone driver. Also leaving the atoms available, so that 7 | appium and iosdriver can use them. 8 | * Deleted the client side of the AndroidDriver. Note that the atoms 9 | are still left in place so that Selendroid can still be compiled. 10 | * Make the RemoteWebDriver implement TakesScreenshot. There's only one 11 | driver that doesn't implement the interface (the HtmUnitDriver) and 12 | this is the most common cause for using the Augmenter, which isn't 13 | very discoverable. 14 | * Imported PhantomJSDriver 1.1.0, removing 1.0.4 (previous version). 15 | * Implemented augmentation of previously augmented instances 16 | * Fixed JdkAugmenter's inability to add interfaces that are already implemented 17 | * Removed org.openqa.selenium.net.INetAddress, an unnecessary abstraction 18 | around java.net.InetAddress. 19 | * (on behalf of Tobias Lidskog) Add ability to send --silent flag to 20 | chromedriver. 21 | when building an inverted predicate. 22 | * Implemented part of advanced user interactions using injected atoms 23 | * Fixed HtmlUnitDriver to handle timeout exception on refresh. 24 | * Implemented page load timeouts in Firefox without stopping page 25 | loading. 26 | * Implemented pageLoadingStrategy capability in Firefox. 27 | * Migrated the WebDriverBackedSelenium to 28 | com.thoughtworks.selenium.webdriven. This also leaves behind a 29 | deprecated implementation of each of the key interfaces to ease 30 | migration for users. 31 | * Implemented proper error code for the case of invalid css selector 32 | empty class name, and compound class name in atoms. 33 | * Implemented alert and confirmation handling in WDBS (Java) 34 | * Throw a more descriptive error when typing in certain types of input 35 | elements in Chrome. Starting with Chrome 33, certain types of input 36 | elements do not support the selection API (in fact, they throw when 37 | you try to access the property). This prevents us from fully 38 | simulating typing in the atoms. 39 | * FIXED: 2397: (on behalf of TommyBeadle) Fixed exception handling 40 | * FIXED: 3991: Add Keys.chord(Iterable) as a utility 41 | method. 42 | * FIXED: 4606: Stop web page loading after timeout. 43 | * FIXED: 4843: (on behalf of Jonatan Kronqvist) Keys.META is now 44 | regarded as modifier key in SingleKeyAction. Keys.META, Keys.COMMAND, 45 | Keys.LEFT_ALT, Keys.LEFT_CONTROL and Keys.LEFT_SHIFT are now also 46 | regarded as modifier keys in SingleKeyAction (because of their 47 | aliases). 48 | * FIXED: 5397: Disabled validation of cookies loaded from the browser. 49 | If the browser could parse the cookie we are to be able to provide 50 | this information to the user even if the cookie is inalid. 51 | * FIXED: 5859: Implemented keyDownNative, keyUpNative and 52 | keyPressNative in WDBS. These commands are implemented via Actions. 53 | * FIXED: 6512: When the host is unknown, make the HtmlUnitDriver 54 | return an error page. 55 | * FIXED: 6657: Make the LoggingPreferences implement Serializable. 56 | * FIXED: 6681: Preventing augmentation of subclasses of RemoteWebDriver. Fixes 57 | * FIXED: 6830: (on behalf of GeorgeKlinich) Urlencoding result 58 | returned by server implementation of WebDriverBackedSelenium. 59 | * FIXED: 6834: Creating sesion cookie if expiry is not set. Fixes issue 6834 60 | * FIXED: 6947: Script timeout should get reset even when async 61 | callback is called synchronously. 62 | 63 | WebDriverJS: 64 | * For consistency with Closure's new promise API, use thenCatch() 65 | and thenFinally() instead of addCallback(), addErrback(), et al. 66 | * ResultType.EXCEPTION and ResultType.ERROR are handled the exact same way, 67 | so remove one of them and simplify some code. 68 | * Treat promise.fulfill/reject as no-ops instead of throwing if the 69 | promise has already been resolved. 70 | * Added some utility functions to simplify working with arrays of 71 | promises. 72 | * FIXED: 6826: Add support for custom locators in webdriverjs. 73 | 74 | Grid: 75 | * FIXED: 4589: Restrict the host where grid hub is listening if -host 76 | option is specified. 77 | * FIXED: 6445: Shorten string representation of capabilities in the 78 | hub log and grid console. 79 | 80 | RC: 81 | * Deprecated browser launchers for dead versions of firefox. 82 | 83 | v2.39.0 84 | ======= 85 | WebDriver: 86 | * Update to support native events for Firefox 26. 87 | * Removed server side of iPhone driver. 88 | * Removed server-side of AndroidDriver and deprecating client side. 89 | 90 | WebDriverJS: 91 | * FIXED: 6686: Changed Deferred#cancel() to silently no-op if the 92 | deferred has already been resolved. 93 | 94 | v2.38.0 95 | ======= 96 | WebDriver: 97 | * Update to support native events for Firefox 25. 98 | * Updated httpclient and httpcore maven dependencies 99 | * When moving the mouse relative to an element hidden in a parent's 100 | overflow region, that element must first be scrolled into view 101 | before the mouse move can be completed. 102 | * Removed WindowsProxyManager from InternetExplorerDriver, proxy 103 | management is implemented in IEDriverServer now. 104 | * The logging level for the FirefoxDriver's native components can now 105 | be set from the command line with the SELENIUM_LOG_LEVEL 106 | environment variable. Valid values are ERROR, WARN, INFO, DEBUG, 107 | and TRACE. If the value is not set, or an unrecognized value is 108 | specified, the log level will be set to FATAL (which was the 109 | previous behavior). 110 | * Implemented ability to return Date object from executeScript 111 | (Firefox only). 112 | * Fixed Firefox returning the actual state of nativeEvents. 113 | * Made it possible to switch the webdriver.xpi from the command line 114 | using a system property. 115 | * Removed hardcoded chromedriver version 116 | * SafariDriver WebElement#getTagName() should return a lowercase 117 | string. 118 | * If ChromeDriver fails to start, suppress any exceptions from the 119 | subsequent "clean-up" quit() so the error from start is not lost. 120 | * Added an alternate, and Android-friendly, implementation of the 121 | Augmenter that uses JDK interface proxies instead of cglib. This 122 | new implementation is available as org.openqa.remote.JdkAugmenter; 123 | the default Augmenter implementation still relies on cglib. 124 | * Prevented an infinite loop when computing overflow state when the 125 | documentElement has fixed position. 126 | * Improveed logging for UnixProcess#destroy(). 127 | * If an error is thrown while typing a key sequence, return that 128 | error to the client. Prior to this change, the driver would 129 | effectively hang. 130 | * Do not attempt to generate a key event if the target element is no 131 | longer attached to the DOM. nsIPressShell (which is used to 132 | dispatch events) will throw a generic NS_UNEXPECTED_ERROR if we 133 | fail to make this check. 134 | * FIXED: 3107: (On behalf of Ross Patterson) Preventing possible NPE. 135 | * FIXED: 4501: (On behalf of Robert Ambrus) Introduced a system 136 | property org.openqa.jetty.SocketListener.bufferSize that allows to 137 | set the size of the buffer Jetty uses for network communications. 138 | * FIXED: 4698: Added missing expected conditions. 139 | * FIXED: 5295: User defined element properties should be retrievable 140 | with getAttribute. 141 | * FIXED: 5900: Revamped the SafariDriver's internal networking. 142 | * FIXED: 6294: Implemented ability to switch to a frame by id or name 143 | in WDBS. 144 | * FIXED: 6358: Disabled Content Security Policy in Firefox. 145 | * FIXED: 6414: Fixed the way EventFiringWebDriver unwraps the 146 | underlying driver. 147 | * FIXED: 6431: Catch an exception thrown if the chrome executable is 148 | not found and stop chromedriver before propagating it. 149 | * FIXED: 6445: Shortened Firefox profile textual representation in 150 | capabilities. 151 | * FIXED: 6473: Implemented ability to pass --verbose option to 152 | chromedriver. 153 | 154 | WebDriver JS: 155 | * Always annotate errors for rejected promises 156 | * FIXED: 6284: Omit x/y offsets from the mouseMove command instead of 157 | defaulting to (0,0). 158 | * FIXED: 6471: Correctly document the contract on 159 | WebElement#getAttribute 160 | * FIXED: 6612: On Unix, use the default IANA ephemeral port range if 161 | unable to retrieve the current system's range. 162 | * FIXED: 6617: Checking for Error.captureStackTrace is sufficient to 163 | determine if an environment supports stack traces. This avoids 164 | unnecessarily triggering debuggers configured to halt when an error 165 | is thrown. 166 | * FIXED: 6627: Safely rebuild chrome.Options from a partial JSON spec. 167 | 168 | Grid: 169 | * FIXED: 6357: Added PhantomJS icon to the grid console. 170 | * FIXED: 6392: Removed misleading log messages. 171 | 172 | RC: 173 | * FIXED: 1666: Fixed typo in RegExp.test function name. 174 | * FIXED: 1758: Ignoring closed windows when collecting attributes 175 | from all windows (RC). 176 | * FIXED: 2508: Fixed screenshot size calculation for quirks mode (RC) 177 | * FIXED: 2845: Moved storedVars from test case level to test suite 178 | level. 179 | * FIXED: 3185: Fixed JSON converter (RC). 180 | * FIXED: 3270: Fixed switch to window by var= locator (RC). 181 | * FIXED: 5103: Fixed screenshooter in Firefox and Selenium RC, 182 | limiting the size of the screenshot to pevent failures. 183 | * FIXED: 6496: Enabled .htm and .xhtml extensions for test suites. 184 | 185 | v2.37.0 186 | ======= 187 | * Fix Firefox native event support on Linux for 23 & 24. 188 | 189 | v2.36.0 190 | ======= 191 | WebDriver: 192 | * Updated Firefox native event components to support Firefox 24. 193 | * Updated HtmlUnit to 2.13. 194 | * Updated HttpClient to 4.3. 195 | * Updated version of Guava to 15. 196 | * Updated version of wgxpath. 197 | * Return an empty string instead of "null" when the browserName and 198 | version capabilities are not set. 199 | * Stop propagation of the webdriver-evaluate custom event when 200 | executing user supplied JavaScript. Without this change, the event 201 | handler will trigger twice for async scripts, causing the driver to 202 | attempt to evaluate the user script twice, leading to unpredictable 203 | behavior. 204 | * Added a new pause action to the interactions API. 205 | * Improved support for using the HTML5 APIs through the remote 206 | server by augmenting the session driver before attempting to 207 | access HTML5 capabilities. If the driver does not support the 208 | requested feature, throw an UnsupportedCommandException instead of 209 | a ClassCastException. 210 | * Implemented elementScrollBehavior capability in FirefoxDriver. 211 | * Fixed getLocation to work on scrolled pages. 212 | * Fixed autoscrolling for elements located in frames. 213 | * Fixed drag-n-drop for elements in frames in Firefox with native 214 | events 215 | * Implemented SOCKS proxy support for FirefoxDriver 216 | * Fixed support for SVG documents in the atoms. 217 | * Fixed computing an element's container dimensions to account for 218 | the scrollbar size when scrolling 219 | * FIXED: 2670: Made subclasses of By serializable. 220 | * FIXED: 6200: Pass command line arguments to the Selenium server 221 | instead of to the JVM. 222 | * FIXED: 6293: Added more informative error message. 223 | * FIXED: 6346: Allow args to passed to the JVM using the jvmArgs 224 | option. 225 | 226 | Grid: 227 | * Added ability to fetch slotCounts from /grid/api/hub. The resource 228 | looks like this: 229 | 230 | { "slotCounts": { "total": 20, "free": 8 } } 231 | 232 | * Added ability to fetch newSessionRequestCount from the 233 | /grid/api/hub resource. 234 | 235 | 236 | v2.35.0 237 | ======= 238 | WebDriver: 239 | * Updated Firefox native event components to support Firefox 23. 240 | * Removing deprecated interactions interfaces (Keyboard, Mouse, 241 | TouchScreen). 242 | * Updated operadriver to 1.4. 243 | * Introduced ie.setProxyByServer capability to select how IE browser 244 | proxy will be set up, either by old Java code using Windows 245 | registry or inside IEDriverServer using WinINet methods. This 246 | capability is marked as deprecated and will be removed in future 247 | versions. In the future, IE proxy settings will be set up only by 248 | IEDriverServer. Current default value of ie.setProxyByServer is 249 | false so Windows registry will be used for IE proxy setup. 250 | * Guarded around IE returning an empty object for the active element. 251 | * FIXED: 6055: Fixing "invalid xpath" issue, actually invalid NS 252 | resolver. 253 | 254 | WebDriver JS: 255 | * FIXED: 6079: The parent process should not wait for spawned driver 256 | service processes (chromedriver, phantomjs, etc.) 257 | 258 | v2.34.0 259 | ======= 260 | 261 | WebDriver: 262 | * Updated Firefox native event components to support Firefox 22. 263 | * Update synthesized mouse implementation. Mouse moves are 264 | implemented using nsIDOMWindowUtils. 265 | * Finding libX11.so.6 in a slightly more intelligent way: Check that 266 | dlopen actually succeeds, if not found in one of the fixed paths, 267 | look in the LD_LIBRARY_PATH. 268 | * Added ExpectedConditions to check for the visibility of all 269 | WebElements in a List 270 | * Updated the wgxpath library. 271 | * Updated our copy of the Closure compiler and library to the most 272 | recent versions. 273 | * Updated the atoms library, including support for MS pointer events 274 | and refinements to element visibility tests. 275 | * Close all open connections when stopping the SafariDriver server. 276 | * Fall back to a loopback address if the current machine does not 277 | have an external IP address (as will be the case when there is no 278 | internet connection). 279 | * Remove sizzle dependency from the firefox driver. We only needed 280 | this for versions of firefox prior to 3.5, which we no longer 281 | support. 282 | * Fixed Select.escapeQuotes method. 283 | * Added SafariOptions and support for custom Safari extensions. 284 | * Moved Mouse, Keyboard and TouchScreen to the interactions package 285 | where they belong. This has the benefit of also making our build 286 | files simpler once we delete the original versions which have been 287 | deprecated. 288 | * Deprecated the HasTouchScreen interface. 289 | * Fixed condition in Select.select_by_index method to fix case when 290 | selection is performed by index on a multiple select element. 291 | * Implemented an alpha version of a Marionette (WebDriver implemented 292 | natively in Firefox) driver. 293 | * Deprecated IPhoneDriver. 294 | * Added support for the HTML5 "hidden" attribute. If an element, or 295 | ancestor, has hidden attribute make, it is not shown. 296 | * FIXED: 2285: Allow setting default logLevel for standalone-server. 297 | * FIXED: 5609: Adding the ability to redirect firefox process output 298 | to file. 299 | * FIXED: 5669: Add Driver#remote_status for the Ruby remote driver. 300 | * FIXED: 5715: Adding toString method for the event firing 301 | webelement. 302 | 303 | WebDriver JS: 304 | * When capturing console output, guard against user scripts that 305 | redefine the console global. 306 | * Improved logging in the test client. 307 | * Use goog.labs.testing.assertThat for the assertThat library. 308 | * Improved stack trace handling 309 | * Defined a webdriver.Capabilities class for webdriverjs. 310 | * Added native ChromeDriver support to WebDriverJs. 311 | * Mark discarded tasks as cancelled to prevent hanging on 312 | asynchronously scheduled callbacks. 313 | * Include the webdriverjs tests in the built npm package. Updated 314 | the README with instructions for running the tests using npm. 315 | * Add native PhantomJS support to webdriverjs. 316 | 317 | Grid: 318 | * Update grid for change in behavior of WebDriver's new session 319 | command. 320 | * Fixed handling of JSON conversion errors at node. 321 | * FIXED: 5942: Fix hang of hub when node machine is not available. 322 | 323 | RC: 324 | * Fixed RC tests failing in Firefox beta builds. This has been fixed 325 | in two ways: 326 | 327 | * Rely on the automation atoms where possible. 328 | * Obtain the document and window from the element the event is 329 | firing from. 330 | 331 | In the course of fixing this, all but one usage of "triggerEvent" 332 | was replaced. Because of this, the method has been inlined to the last 333 | call site. 334 | * FIXED: 1646: UTF-8 encoded user-extensions.js support. 335 | 336 | 337 | v2.33.0 338 | ======= 339 | 340 | WebDriver: 341 | * getText() ignores elements in the 342 | * Bundled OperaDriver version bumped to 1.3. 343 | * Added a FindAll annotation for the PageFactory to use. 344 | * Added a toString() implementation to Color. 345 | * Deleted the Selenium-backed WebDriver. 346 | * FIXED: 2218: IE >=9 versions triggerMouseEvent like other 347 | browsers. 348 | * FIXED: 2610: Implementing ability to specify path to the chrome 349 | executable in the node configuration file using chrome_binary 350 | capability. 351 | * FIXED: 2685: Increasing port range for Firefox to chose from when 352 | starting. 353 | * FIXED: 4790: Improvements made to Firefox startup in highly 354 | concurrent environments. 355 | * FIXED: 5045: Added support for fetching logs from SafariDriver. 356 | * FIXED: 5652: Adding unhandled alert text to the exception message. 357 | * Added LogType.PERFORMANCE, supported in chromedriver2 0.9+. 358 | 359 | WebDriver JS: 360 | * FIXED: 5511: Implement 361 | driver.manage().timeouts().pageLoadTimeout(ms) for WebDriverJs. 362 | * FIXED: 5632: It's now possible to create a new session with 363 | WebDriverJs when running in a browser. 364 | * Add a WebDriverJs client to the SafariDriver's logging window so 365 | it's possible to use WebDriver from the devtools REPL on that 366 | page. 367 | 368 | Grid: 369 | 370 | * Making "beta" console the default one, it's time to get out of 371 | beta status 372 | * Old console is now available at /grid/old/console/ 373 | * Addressed memory leaks caused by per-session logging. 374 | * FIXED: 3001: Making Selenium the default protocol if a node was 375 | started with "-role rc" option. 376 | 377 | RC: 378 | * FIXED: 3636: selenium.fireEvent works with the webdriver-backed 379 | selenium and IE. 380 | 381 | v2.32.0 382 | ======= 383 | 384 | WebDriver: 385 | This release supports Firefox verions: 10esr, 17esr, 19, 20 386 | 387 | * Let WindowsUtils.killPID() kill the whole process tree 388 | * Implementing support for implicit "submit" button type in 389 | HtmlUnitDriver. 390 | * bug fix for python hang with 302 response 391 | * Adding better support for SVG within Firefox. Has better scrolling 392 | to element and allows JavaScript execution 393 | * Fixing case of "no active element" for HtmlUnitDriver 394 | * WindowsUtils.kill() fix on Windows 8 395 | * Updating HtmlUnit to 2.12 (and cssparser to 0.9.9) 396 | * Fixing illegal negative timeout values for HtmlUnitDriver, zero 397 | means infinite wait 398 | * Implementing pageLoadTimeout in HtmlUnitDriver 399 | * Allow users to specify a custom location for Safari's data 400 | directory using the "safari.dataDir" capability. 401 | * Fix for using DesiredCapabilities with WebDriverBackedSelenium 402 | * PhantomJS Driver bindings updated to 1.0.3 403 | * Minimize the number of third party libraries used by the very 404 | heart of the remote webdriver server. 405 | * fix issue where server was appending '?null' to all forwarded 406 | requests 407 | * Issues fixed: 5293, 4902, 5283, 5278 408 | 409 | v2.31.0 410 | ======= 411 | (summary not created, check version history logs) 412 | 413 | v2.30.0 414 | ======= 415 | 416 | WebDriver: 417 | * Fixing a bug introduced by a change in how we get already logged 418 | messages from the console service in firefox. This allows us to 419 | function with firefox 19 420 | * FIXED: 1181: Improved loopback detection 421 | * FIXED: 1627: Implementing ability to use auto proxy in 422 | HtmlUnitDriver. 423 | * FIXED: 3652: moveToElement with offset should consider 0 as a 424 | valid value, not as "undefined". 425 | * FIXED: 3868: Better ephemeral port range selection. 426 | * FIXED: 4107: Added prebuilt version of the SafariDriver extension 427 | to the client jar. 428 | * FIXED: 4821: WebDriverBackedSelenium works when added to project 429 | via maven. 430 | * FIXED: 4940, 5075: Added iceweasel to list of firefox variants. 431 | * FIXED: 5022: Text node with overflow:hidden and height/width 0 to 432 | not be visible since we cant see them. 433 | * FIXED: 5030: Only send files to upload, not directories. 434 | * FIXED: 5079: FluentWait.until(Predicate) method does not propagate 435 | predicate message. 436 | * FIXED: 5109: We should show elements visible if there is a pixel 437 | visible. 438 | * Semi-private change: Changes in the Coordinate class. 439 | 440 | JS: 441 | * Update WebDriverJS to support parallel flows. This change renames 442 | several low-level classes and functions in the promise module: 443 | 444 | promise.Application -> promise.ControlFlow 445 | #schedule(string, function) -> #execute(function, [string]) 446 | #scheduleTimeout(string, number) -> #timeout(number, [string]) 447 | #scheduleWait(string, function, number, [string]) -> #wait(function, number, [string]) 448 | 449 | The old schedule* functions are still present, but will print a 450 | warning message if called. They will be removed in 2.31. 451 | 452 | RC: 453 | * Added ability to use relative path to an -htmlSuite file. 454 | * FIXED: 3498: Proxy based browsers are back to normal on HTTPS 455 | * FIXED: 5113: Implementing GET requests support for RC protocol. 456 | 457 | 458 | v2.29.0 459 | ======= 460 | 461 | WebDriver: 462 | * Firefox 18 support. 463 | * IEDriver supports "requireWindowFocus" desired capability. When 464 | using this and native events, the IE driver will demand focus and 465 | user interactions will use SendInput() for simulating user 466 | interactions. Note that this will mean you MUST NOT use the 467 | machine running IE for anything else as the tests are running. 468 | * Use the "webdriver.remote.shorten_log_messages" system property to 469 | reduce the verboseness of ouput from executeScript and 470 | executeAsyncScript when using the RemoteWebDriver. 471 | * Switching HtmlUnitDriver default from FIREFOX_3_6 to FIREFOX_10 472 | * SafariDriverExtension should restore Safari's previous settings on 473 | shutdown. 474 | * Bundled version of PhantomJSDriver bumped to 1.0.1 475 | * Updated the version of guava-libraries used to 14. 476 | * Updated HtmlUnit to 2.11 477 | * Deprecated XPathLookupException in favour of 478 | InvalidSelectorException 479 | * FIXED: 3602: Changing IE view port calculations to allow for 480 | always-present vertical scroll bar, and to test for horizontal 481 | scroll bar and adjust as required by page content. 482 | * FIXED: 4576: self registering proxy now check for user specified 483 | proxy id. 484 | * FIXED: 5010: icons in chrome newtab now correctly identified as 485 | being shown. 486 | 487 | RC: 488 | * FIXED: 4818: Make sure that each generated SSL cert has a unique 489 | ID associated with it. 490 | 491 | Project: 492 | * Moved to git. Most obvious in revision number in our exceptions. 493 | 494 | 495 | v2.28.0 496 | ======= 497 | 498 | WebDriver: 499 | * "null" can now be passed to executeScript 500 | * .Net: Corrected FileUtilities.FindFile() to correctly return the 501 | current directory if the specified file is located there. 502 | * .Net: Introduces the Updating the CustomFinderType property to the 503 | .NET FindsByAttribute. This allows use of custom By subclasses in 504 | the PageFactory. The custom finder must be a subclass of By, and 505 | it must expose a public constructor that takes a string argument. 506 | * SafariDriver: better attempts to catch native dialogs from user 507 | defined onbeforeunload handlers. 508 | * Updating HtmlUnit to 2.11 509 | * Added the PhantomJS bindings to the release. You'll still need to 510 | download PhantomJS itself separately. 511 | 512 | RC: 513 | * Implemented getAllWindowNames in WebDriverBackedSelenium 514 | * Implemented openWindow in WebDriverBackedSelenium to allow opening 515 | relative URLs 516 | 517 | 518 | v2.27.0 519 | ======= 520 | 521 | WebDriver: 522 | * Added support for native events for Firefox 17. 523 | * Added support for ghostdriver (PhantomJS) 524 | * Adding new capability "enableElementCacheCleanup" to the IE 525 | driver. When set to true, the IE driver will clean the 526 | known-element cache of invalid elements after every page 527 | load. This is intended to keep memory usage down and improve 528 | performance. However, it is an intrusive change, so this 529 | capability is provided temporarily to allow disabling this 530 | behavior if problems arise. The default of this new capability is 531 | "true", meaning this behavior is turned on by default. 532 | * Added shift key handling to the synthetic keyboard actions. 533 | * Modifying scroll behavior in IE driver SendKeysCommandHandler to 534 | call Element::GetLocationOnceScrolledIntoView() instead of calling 535 | the DOM scrollIntoView() function. Should result in less page 536 | scrolling during test runs. 537 | * Checking if CSS transforms on elements, or their parents, are 538 | hiding them and therefore returning they arent visible. 539 | * Add not, refreshed, invisibilityOfElementWithText to 540 | ExpectedConditions. 541 | * Added support for new IE10 pointer events. 542 | * FIXED: 1543: Allowing equal sign in a cookie value. 543 | * FIXED: 2103, 3508: Modified to no longer hang on alerts triggered 544 | by onchange of