|Think about Loose Coupling|
Is this a bug in mechanize::select(), or am I just confused? (or something else) (answer: bad html)by rustycar (Novice)
|on Jul 31, 2008 at 01:47 UTC||Need Help??|
rustycar has asked for the
wisdom of the Perl Monks concerning the following question:
Sorry in advance for such a long post here...
I'm using select() to select an item from a 'select' list (duh! :-) - but I do not know ahead of time what the names of said items are.
So, I wrote something like this:
However, it turns out that select will ALWAYS think that it can select entry 1, even if the list is empty. In other words, even when the html looks like this:
The above code will get '1' back from select and go running on forever. Not a good thing...
I discovered that if entry 2 didn't exist, and you tried to select THAT entry you'd get an appropriate error, so I ended up with this as a workaround:
It seems to me that the first form should have worked (see the Mechanize page under select() for details of why - won't bore everyone here with that), so I'm looking at the Mechanize and Form code to see why it allows a 'select' of 1 when there are no items.
I've looked at WWW::Mechanize, and the issue seems to be in Form instead. Here is the section that seems to be involved here:
When there is nothing in the select list, the above test still passes! I note, when stepping through the code, that if I print $val when I'm looking at the 'big if' above, I get a blank line, BUT defined($val) is true!
So, am I just confused, is the above test wrong, is my code wrong, or ???
(Conclusion: the HTML is wrong - its illegal to have a select with no option. You should have a single empty option, and detect that its an empty option (I'll have to RTFM for how to do that, but that's just Fine :-)
Final comment - thanks to Hermit (psini for his/her help - and sorry for not thinking to RTFM on how HTTP select fields work, once the comment was made (too focussed on Mechanize::select and figuring out how to get around having no (obvious) way to tell when there's nothing there....
Anyway, I consider this thread finished (and now I know what bug to file with the authors). I've modified the subject, at the suggestion of ambrus, to make it better. Thanks again!