Hello everyone! First of all, I'd like to thank everyone involved with the twill project for creating and maintaining a very useful tool!
To time-deprived readers, I'll explain it briefly: My problem is that unnamed forms that sit on a page that have a named form that has the unnamed form's number as part of its name cannot be accessed through regular fv's. For instance, if form #1 is named "Form-123" then unnamed forms #2 and #3 cannot be accessed by fv (2, , ) or fv ( "3", , ) because the numbers 2 and 3 and the strings "2" and "3" are matched to the "Form-123" form. I suppose that a pretty solution would be to subclass the twill browser and add a matching process that prioritizes number matching. But I cannot do so right now. So I made an ugly workaround: I set the unnamed form to a certain name and use it normally onwards, through the set name. To those who need more info, I'll explain in length: We at http://stoa.usp.br/ are beginning to use twill to monitor our site for any "system breaks" that might follow one of the developers submitting poor code. Recently, we started using a Google-provided form that makes searches in our site. With this, our main page has the following forms: >>> showforms() Form name=searchform (#1) ## ## __Name__________________ __Type___ __ID________ __Value__________________ 1 tag text (None) 2 user_type select (None) [''] of ['', 'person', 'community', ... 3 1 None submit (None) Ok Form name=searchbox_006456382451512069951:41lst14sjem (#2) ## ## __Name__________________ __Type___ __ID________ __Value__________________ 1 cx hidden (None) 006456382451512069951:41lst14sjem 2 cof hidden (None) FORID:0 3 q text (None) 4 1 sa submit (None) Search Form #3 ## ## __Name__________________ __Type___ __ID________ __Value__________________ 1 username text username 2 password password password 3 passthru_url hidden (None) http://stoa.usp.br/ 4 action hidden (None) log_on 5 1 submit submit (None) Ok 6 remember checkbox (None) ['on'] of ['on'] As you can see, form #2 is the Google-provided form, with a long string as its name, and this string contains numbers, note specially that it contains the numbers 1 and 3. Now, I need to fv the unnamed form #3, but if I try it directly I get an error: >>> fv (3, "username", "test") Traceback (most recent call last): File "<stdin>", line 1, in ? File "/usr/lib/python2.4/site-packages/twill-0.9b1-py2.4.egg/twill/commands.py", line 428, in formvalue control = browser.get_form_field(form, fieldname) File "/usr/lib/python2.4/site-packages/twill-0.9b1-py2.4.egg/twill/browser.py", line 366, in get_form_field raise Exception('no field matches "%s"' % (fieldname,)) Exception: no field matches "username" >>> fv ("3", "username", "test") Traceback (most recent call last): File "<stdin>", line 1, in ? File "/usr/lib/python2.4/site-packages/twill-0.9b1-py2.4.egg/twill/commands.py", line 428, in formvalue control = browser.get_form_field(form, fieldname) File "/usr/lib/python2.4/site-packages/twill-0.9b1-py2.4.egg/twill/browser.py", line 366, in get_form_field raise Exception('no field matches "%s"' % (fieldname,)) Exception: no field matches "username" The reason is that twill matches 3 or "3" first to the Google-provided form, because it has the number 3 as part of it's string name! I get the "no field matches" error because there is no "username" at the Google-provided form! Now I hope there is a better way to solve this issue (other than rewriting the site), but I came up with this ugly solution: I retrieve a forms list with a call to a browser object's get_all_forms() method; I name the third form as "login"; I use the string "login" to use such form, instead of using the number 3. It works, check it out: >>> b = get_browser() >>> b.get_all_forms()[2].name = "login" >>> fv ("login", "username", "test") >>> showforms() Form name=searchform (#1) ## ## __Name__________________ __Type___ __ID________ __Value__________________ 1 tag text (None) 2 user_type select (None) [''] of ['', 'person', 'community', ... 3 1 None submit (None) Ok Form name=searchbox_006456382451512069951:41lst14sjem (#2) ## ## __Name__________________ __Type___ __ID________ __Value__________________ 1 cx hidden (None) 006456382451512069951:41lst14sjem 2 cof hidden (None) FORID:0 3 q text (None) 4 1 sa submit (None) Search Form name=login (#3) ## ## __Name__________________ __Type___ __ID________ __Value__________________ 1 username text username test 2 password password password 3 passthru_url hidden (None) http://stoa.usp.br/ 4 action hidden (None) log_on 5 1 submit submit (None) Ok 6 remember checkbox (None) ['on'] of ['on'] Well, I know it ain't pretty, but it works. At least until the developers change the front page again. I thought this would be of interest to anyone having problems with named and unnamed forms on the same page: the problem is, possibly due to a form that has numbers as part of its name. Again, I'd like to thank Titus and the rest of the crew. Great work! See ya! Renato.
_______________________________________________ twill mailing list [email protected] http://lists.idyll.org/listinfo/twill
