Try Bad Boy. http://www.badboy.com.au/
We ended up building our own, using JTidy to convert pages to XML, which I think HttpUnit or one of those might do. We didn't really want to build something, but everything seems to suck basically. The "record then play" approach, e.g. JMeter, just seems to be more trouble than it's worth.
Input into the web test is an XML doc, that's processed by a SAX reader.
You can use a 'param' element for hardcoded params, or 'paramPath' and specify an xpath expression that extracts data from the previous response. You can also use a 'dynParam' (dynamic param) element to call a remote method to get some test data. We've exposed some business objects that exist purely for testing using the Spring HttpInvoker, and can call a parameterless method to get data to be used in a GET or POST. This beats trying to maintain a 'testDB' with special values in it that your test script knows about.
Similarly, you can specify a 'url' element (hardcoded destination), or 'urlPath' that has an xpath expression, which allows you to pull a dynamic url from the previous response, e.g. get a url from a search result grid.
We've also got 'show' elements for println'ing stuff, and a 'compare' element for doing assertions.
It handles preservation of the session by requiring that jsessionid be embedded as a hidden field, which is a bit sucky, but not hard to do if you've got something like stdIncludes.jsp.
Lastly, it's got limited flow of control support with a <while> element to do loops.
We couldn't find anything else that did this. We're using Clover to test code coverage and couldn't really drive the coverage % up without these features.
Ended up just writing a Perl script to remove tags (c, fmt, etc...) and convert Struts tags to HTML (another example of why I prefer Spring's approach of avoiding HTML generation in tags). You can then use Ant's validate task to validate directly against the DTD. Now I can validate 500 pages in 10 seconds.Originally Posted by katentim