I have been a Watir user since 2005, and (at least since changes away from the
original Watir) a repeated theme has been "How do I get the HTTP response
code?" (Alternatively called "status code", but I believe response code is
technically correct.)
As many of us know all too well, the Selenium-Webdriver team refuses to address
this issue. Many developers obviously believe that while their technical
excuses from the Selenium team may be true, that is insufficient to justify
their position on the issue, because the lack of this feature seriously weakens
the end product.
But even if it is a technical and (dare I say it?) religious issue for the
Selenium team, I see no reason why this feature could not be incorporated into
Watir-Webdriver. The feature was in the original Watir and I know that many
people would appreciate its return.
It would be nice to be able to just do "browser.goto(url)", and read the
response code. But since that isn't practical using the Selenium driver, I
suggest another method of doing almost the same thing. Since it is fairly
simple and lightweight, I propose a patch to Watir-Webdriver to implement it.
(*I KNOW* this has been a contentious issue. But I have 4 things to day about
that: [1] there is a very good argument that response codes actually reproduce
the user experience BETTER than tedious parsing of many and varied error pages,
[2] users, who are also contributors, have repeatedly demanded it, [3] while it
may not be easy to do in Selenium-Webdriver, it SHOULD BE easy to do in
Watir-Webdriver, and [4] the usefulness of such a feature is both widespread
and indisputable.)
A simple method is as follows. The cost is a bit of overhead from requiring
Net::HTTP (that is, if it isn't *already* required by Watir-Webdriver). Since
it is readily available in a standard Ruby install I see no great difficulty
there.
This is all it would take:
require 'net/http'
def get_response(uri)
Net::HTTP.get_response(URI(uri))
end
That's it. Then if "browser" is your browser instance in Watir-Webdriver, you
could simply do:
response = browser.get_response("http://blahblahblah.com/something")
and get your response code. The response consists of:
response.code # => "200"
response.message # => "OK"
When it fails it looks like this:
response.code # => "404"
response.message # => "Not Found"
(Or 500 "Internal Server Error ", 302 "Found" for redirects, etc.)
Note that this just does a HEAD request to the server. It does not need to
distinguish between GET, POST and so on, and it is fast since it does not have
to load pages.
I understand that some people might say "That's easy enough to do on your own;
why bother to put it in Watir-Webdriver?" And the answer is because so many
people have needed it, and had to both research and implement it on their own.
Many, many man-days have been unnecessarily wasted doing that. It is important
functionality, and I do not believe it should be left out of a serious web
testing tool, when it would be so easy to implement.
A problem with the above approach is that it may not resolve redirects. So an
additional recursive method might be called for, thus:
def get_response_with_redirects(uri, limit = 10)
raise "Holy Crap!!! Too Many Redirects" if limit == 0
response = Net::HTTP.get_response(URI(uri))
case response # Case needed to catch subclass. == doesn't work.
when Net::HTTPRedirection
location = response['location']
warn "Redirecting to #{location}."
get_response_with_redirects(location, limit - 1)
else
response
end
end
I have tested this code and it works fine. This follows redirects up to 10 or
some other value you supply. The response after redirects should reflect the
response from the final page. A shorter name would probably be better, though.
I strongly suggest incorporating this, or something very much like it, into
Watir-Webdriver. It will solve problems for lots of people, it is easy to do,
and if THEY want to just stick to "user experience only" they don't have to use
it. But I feel they should be able to choose, rather than spending hours
re-inventing the wheel every time this crops up for a different user. It's only
16 lines of code total, including the require.
Note, however, that this still does not allow you to just go to a web page in
your driven browser, and look at the response code. It require an extra line of
code, and it does make a separate request to the server. But it's just a HEAD
request so it is much faster than actually loading and rendering a page.
I would be happy to provide a patch if someone will point me at the procedure
for providing patches to Watir-Webdriver, and maybe what would be an
appropriate location in the code.
Lonny Eachus
============
--
--
Before posting, please read http://watir.com/support. In short: search before
you ask, be nice.
[email protected]
http://groups.google.com/group/watir-general
[email protected]
---
You received this message because you are subscribed to the Google Groups
"Watir General" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.