Watir - determine order of the controls

P

Patrick Spence

I've written a ScreenScraper class that "harvests" all the HTML
elements; textfields, checkboxes, radiobuttons, etc., from a web page
and populates a SQL Server table. This is a process needed to fully
automate the testing of a ASP.NET app from a data-driven approach. The
problem is that the developers that wrote the app did not use the
"tabindex" property on any of the controls. Had they done so, the
ScreenScraper class could've collected that information as well and we'd
know in what order the controls have to be populated. Although it's a
valid test, under normal circumstances you wouldn't want to click the
"Login" button until both a username and password are provided.

My question... Is there a way to collect a list of all the controls on a
page _in the order they appear on the screen_? I suspect drilling into
the DOM is going to be part of the solution. Just wondering if someone
else has run into this issue and what they did to resolve it. No sense
in re-inventing the wheel.

An alternative would be a Ruby script that records the mouse clicks as
each control is clicked, stuffing the "taborder" into a table, or some
such.

Thanks!
 
A

Alex LeDonne

I've written a ScreenScraper class that "harvests" all the HTML
elements; textfields, checkboxes, radiobuttons, etc., from a web page
and populates a SQL Server table. This is a process needed to fully
automate the testing of a ASP.NET app from a data-driven approach. The
problem is that the developers that wrote the app did not use the
"tabindex" property on any of the controls. Had they done so, the
ScreenScraper class could've collected that information as well and we'd
know in what order the controls have to be populated. Although it's a
valid test, under normal circumstances you wouldn't want to click the
"Login" button until both a username and password are provided.

My question... Is there a way to collect a list of all the controls on a
page _in the order they appear on the screen_? I suspect drilling into
the DOM is going to be part of the solution. Just wondering if someone
else has run into this issue and what they did to resolve it. No sense
in re-inventing the wheel.

An alternative would be a Ruby script that records the mouse clicks as
each control is clicked, stuffing the "taborder" into a table, or some
such.

Thanks!

I don't think this is a well-defined problem. The order in which
fields appear on screen is not deterministic with respect to the
source document; it can be affected by CSS and even by the user agent
(it's possible to have field A below field B in Firefox, but above in
Internet Explorer). Considering tables & columns, even "before" and
"after" become ambiguous... how would you order the fields in the
following HTML table, with respect to screen layout?

<form>
<table>
<tr>
<td><input type="text" name="field_0"/></td>
<td rowspan=2><input type="text" name="field_center"/></td>
<td><input type="text" name="field_R"/></td>
</tr>
<tr>
<td><input type="text" name="field__"/></td>
<td><input type="text" name="field_5"/></td>
</tr>
</table>
</form>

You'll probably need to explicitly define dependencies based on the field names.

-Alex
 
P

Patrick Spence

Alex said:
I don't think this is a well-defined problem. The order in which
fields appear on screen is not deterministic with respect to the
source document; it can be affected by CSS and even by the user agent
(it's possible to have field A below field B in Firefox, but above in
Internet Explorer). Considering tables & columns, even "before" and
"after" become ambiguous... how would you order the fields in the
following HTML table, with respect to screen layout?
<snip>
If you're referring to my question, I thought it the problem was defined
quite clearly; here's what I have, here's what I need, how do I get
there?

As to CSS affecting the layout, you're absolutely correct. The more I
think about this, I believe my "alternative" approach would be a better
solution. Even though it will involve someone going thru each page of
the app and clicking on the controls *in the proper order*. However,
this will only have to be done once as the "click order", or "taborder",
will be written to a SQL Server table upon each mouse click. This sounds
like a really interesting project!
 
A

Alex LeDonne

<snip>
If you're referring to my question, I thought it the problem was defined
quite clearly; here's what I have, here's what I need, how do I get
there?

As to CSS affecting the layout, you're absolutely correct. The more I
think about this, I believe my "alternative" approach would be a better
solution. Even though it will involve someone going thru each page of
the app and clicking on the controls *in the proper order*. However,
this will only have to be done once as the "click order", or "taborder",
will be written to a SQL Server table upon each mouse click. This sounds
like a really interesting project!

Sorry if I was unlear; your description was well-stated, I was saying
that your core question, "Is there a way to collect a list of all the
controls on a page _in the order they appear on the screen_?" is not
well-defined, because the order in which controls appear on the screen
is not well-defined given a source document.

Your "record-the-order" plan sounds like a good one.

Good luck!

-A
 
C

Chris McMahon

As to CSS affecting the layout, you're absolutely correct. The more I
think about this, I believe my "alternative" approach would be a better
solution. Even though it will involve someone going thru each page of
the app and clicking on the controls *in the proper order*. However,
this will only have to be done once as the "click order", or "taborder",
will be written to a SQL Server table upon each mouse click. This sounds
like a really interesting project!

I wouldn't be too hasty, there, those controls are going to change over
time, breaking both your scripts and your database records.

I've built a number of these sorts of things, and I find that it is
better to define sets of paths through the application that accomplish
particular objectives, as opposed to testing widget-by-widget.
 
C

Chris McMahon

As to CSS affecting the layout, you're absolutely correct. The more I
think about this, I believe my "alternative" approach would be a better
solution. Even though it will involve someone going thru each page of
the app and clicking on the controls *in the proper order*. However,
this will only have to be done once as the "click order", or "taborder",
will be written to a SQL Server table upon each mouse click. This sounds
like a really interesting project!

I wouldn't be too hasty, there, those controls are going to change over
time, breaking both your scripts and your database records.

I've built a number of these sorts of things, and I find that it is
better to define sets of paths through the application that accomplish
particular objectives, as opposed to testing widget-by-widget.
 
J

Jonathan Kohl

I wouldn't be too hasty, there, those controls are going to change over
time, breaking both your scripts and your database records.

I've built a number of these sorts of things, and I find that it is
better to define sets of paths through the application that accomplish
particular objectives, as opposed to testing widget-by-widget.

Chris has a good point. Furthermore, most modern browsers "fix" HTML,
by adding missing tags, etc. Testing that the HTML elements are correct
might be better done at the HTTP layer.

Hope that helps.

-Jonathan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top