Mechanize - gleichnamige Select-Felder
Hallo NG,
ich bastele gerade an meinem ersten Mechanize-Skript. Das Formular, das ich
bearbeite, enthält mehrere Select-Felder mit gleichem Namen.
$form->find_input("zone[]") findet nur das erste. Um auch die Werte der
anderen Felder setzen zu können, wollte ich sie erst (mit Hilfe von
HTML::Form) umbenennen und später wieder zurückbenennen:
| my ($zone, [at] zonen);
| my [at] werte = qw/ort fer/;
| foreach my $wert ( [at] werte) {
| $zone = $form->find_input('zone[]');
| print "Name alt ", $zone->name, "\n";
| $zone->value($wert);
| $zone->name('zone' . $wert);
| print "Name neu ", $zone->name, "\n";
| push ( [at] zonen, $zone);
| }
Leider findet Mechanize nach dem ersten Umbenennen keine weiteren Felder mit
dem Originalnamen:
| Name alt zone[]
| Name neu zoneort
| Can't call method "name" on an undefined value at ....
Weiß jemand einen Ausweg? Ein anderes Modul nehmen? Ich arbeite mit Perl
v5.8.4 von ActiveState.
Gruß
Klaus
Re: Mechanize - gleichnamige Select-Felder
K. Wittrock schrieb:
> Hallo NG,
>
> ich bastele gerade an meinem ersten Mechanize-Skript. Das Formular, das ich
> bearbeite, enthält mehrere Select-Felder mit gleichem Namen.
Wenn es mehrere Select-Felder mit gleichem Namen (ID) gibt, dann können
die nur in verschiedenen Forms untergebracht sein.
In diesem Fall müsstest du dir eine Liste der Forms holen und sie der
Reihe nach abarbeiten.
Gruß
Karlheinz
Re: Mechanize - gleichnamige Select-Felder
Karlheinz Weindl schrieb:
> K. Wittrock schrieb:
>
>
>>Hallo NG,
>>
>>ich bastele gerade an meinem ersten Mechanize-Skript. Das Formular, das ich
>>bearbeite, enthält mehrere Select-Felder mit gleichem Namen.
>
>
> Wenn es mehrere Select-Felder mit gleichem Namen (ID) gibt, dann können
> die nur in verschiedenen Forms untergebracht sein.
.... es sei denn du meinst ein Select-Felder mit Mehrfachauswahl!
In diesem Fall bekommst du dann allerdings jeden einzelnen ausgewählten
Wert unter dem gleichen Namen!
Dann mußt du allerdings auch die Methode im Arraykontext aufrufen, um
alle Werte zu bekommen.
[at] allvals = $form->find_input('name');
Gruß
Karlheinz
Re: Mechanize - gleichnamige Select-Felder
"Karlheinz Weindl" <karlheinz.weindl [at] arcor.de> schrieb im Newsbeitrag
news:4564c4a4$0$18833$9b4e6d93 [at] newsspool4.arcor-online.net.. .
> Karlheinz Weindl schrieb:
>
>> K. Wittrock schrieb:
>>
>>
>>>Hallo NG,
>>>
>>>ich bastele gerade an meinem ersten Mechanize-Skript. Das Formular, das
>>>ich
>>>bearbeite, enthält mehrere Select-Felder mit gleichem Namen.
>>
>>
>> Wenn es mehrere Select-Felder mit gleichem Namen (ID) gibt, dann können
>> die nur in verschiedenen Forms untergebracht sein.
>
> ... es sei denn du meinst ein Select-Felder mit Mehrfachauswahl!
> In diesem Fall bekommst du dann allerdings jeden einzelnen ausgewählten
> Wert unter dem gleichen Namen!
Nein, ich meine 5 Select-Felder mit Mehrfachauswahl direkt hintereinander im
selben Form und mit gleichem Namen (NAME):
| <select name="zone[]" size="1" style="margin-top:6pt;width:80%;">
Das i-te Feld wählt aus, was in der i-ten Spalte der Antwort stehen soll.
Alle Felder haben die gleiche Option-Liste. Ich habe keine Ahnung, ob das
dem Standard widerspricht. Funktioniert aber prima im IE und im Firefox.
Gruß
Klaus
Re: Mechanize - gleichnamige Select-Felder
K. Wittrock schrieb:
> Nein, ich meine 5 Select-Felder mit Mehrfachauswahl direkt
> hintereinander im
> selben Form und mit gleichem Namen (NAME):
> | <select name="zone[]" size="1" style="margin-top:6pt;width:80%;">
>
> Das i-te Feld wählt aus, was in der i-ten Spalte der Antwort stehen soll.
> Alle Felder haben die gleiche Option-Liste. Ich habe keine Ahnung, ob das
> dem Standard widerspricht. Funktioniert aber prima im IE und im Firefox.
Sei's drum.
Das ändert am Prinzip wie das behandelt wird nichts.
In dem Moment wo du Select-Felder mit Mehrfachauswahl hast bekommst du
Hash-Referenzen auf die einzelnen Optionen zurückgeliefert und zwar
soviele wie du in der Summe hast. Wenn du die Methode im Skalarkontext
aufrufst, dann bekommst du halt nur die erste Referenz.
An besten du siehst dir mit Data::Dumper mal die Struktur an, die du
zurückbekommst.
Gruß
Karlheinz
Re: Mechanize - gleichnamige Select-Felder
"K. Wittrock" <KWittrock [at] web.de> schrieb im Newsbeitrag
news:45658f27$0$18835$9b4e6d93 [at] newsspool4.arcor-online.net.. .
>
> "Karlheinz Weindl" <karlheinz.weindl [at] arcor.de> schrieb im Newsbeitrag
> news:4564c4a4$0$18833$9b4e6d93 [at] newsspool4.arcor-online.net.. .
>> Karlheinz Weindl schrieb:
>>
>>> K. Wittrock schrieb:
>>>
>>>
>>>>Hallo NG,
>>>>
>>>>ich bastele gerade an meinem ersten Mechanize-Skript. Das Formular, das
>>>>ich
>>>>bearbeite, enthält mehrere Select-Felder mit gleichem Namen.
>>>
>>>
>>> Wenn es mehrere Select-Felder mit gleichem Namen (ID) gibt, dann können
>>> die nur in verschiedenen Forms untergebracht sein.
>>
>> ... es sei denn du meinst ein Select-Felder mit Mehrfachauswahl!
>> In diesem Fall bekommst du dann allerdings jeden einzelnen ausgewählten
>> Wert unter dem gleichen Namen!
>
> Nein, ich meine 5 Select-Felder mit Mehrfachauswahl
Sorry, muss Einfachauswahl heißen.
> direkt hintereinander im
> selben Form und mit gleichem Namen (NAME):
> | <select name="zone[]" size="1" style="margin-top:6pt;width:80%;">
>
> Das i-te Feld wählt aus, was in der i-ten Spalte der Antwort stehen soll.
> Alle Felder haben die gleiche Option-Liste. Ich habe keine Ahnung, ob das
> dem Standard widerspricht. Funktioniert aber prima im IE und im Firefox.
>
> Gruß
>
> Klaus
>
Re: Mechanize - gleichnamige Select-Felder
K. Wittrock schrieb:
>> Nein, ich meine 5 Select-Felder mit Mehrfachauswahl
>
>
> Sorry, muss Einfachauswahl heißen.
Dann bekommst du wahrscheinlich _eine_ Hashreferenz auf eine
Datenstruktur die _ein_ Select-Feld darstellt in dem _alle_
Options-Felder in der Reihenfolge ihres Auftretens enthalten sind.
Ich kann dir nur nochmal raten Data::Dumper zu verwenden um zu sehen,
was du damit anfangen kannst.
Gruß
Karlheinz
Re: Mechanize - gleichnamige Select-Felder
"Karlheinz Weindl" <karlheinz.weindl [at] arcor.de> schrieb im Newsbeitrag
news:4565963c$0$5725$9b4e6d93 [at] newsspool3.arcor-online.net...
> K. Wittrock schrieb:
>> Nein, ich meine 5 Select-Felder mit Mehrfachauswahl
Sorry, muss Einfachauswahl heißen.
>> direkt hintereinander im
>> selben Form und mit gleichem Namen (NAME):
>> | <select name="zone[]" size="1" style="margin-top:6pt;width:80%;">
>>
>> Das i-te Feld wählt aus, was in der i-ten Spalte der Antwort stehen soll.
>> Alle Felder haben die gleiche Option-Liste. Ich habe keine Ahnung, ob das
>> dem Standard widerspricht. Funktioniert aber prima im IE und im Firefox.
>
> Sei's drum.
> Das ändert am Prinzip wie das behandelt wird nichts.
> In dem Moment wo du Select-Felder mit Mehrfachauswahl hast bekommst du
> Hash-Referenzen auf die einzelnen Optionen zurückgeliefert und zwar
> soviele wie du in der Summe hast. Wenn du die Methode im Skalarkontext
> aufrufst, dann bekommst du halt nur die erste Referenz.
>
> An besten du siehst dir mit Data::Dumper mal die Struktur an, die du
> zurückbekommst.
Ich rufe die Methode im Listenkontext auf. Es wird nur ein Select-Feld
dieses Namens gefunden und deshalb zeigt Data::Dumper auch nur die interne
Struktur dieses einen Objektes.
my [at] zonen = $form->find_input("zone[]");
print "Anz Zonen ", scalar [at] zonen, "\n";
print Dumper( [at] zonen);
Anz Zonen 1
$VAR1 = bless( {
'seen' => [
0,
0,
..............
],
'style' => 'margin-top:6pt;width:80%;',
'name' => 'zone[]',
'type' => 'option',
'size' => '1'
}, 'HTML::Form::ListInput' );
Inzwischen habe ich etwas anderes probiert: Ich hole mir alle Felder und
filtere selbst die heraus, die ich brauche. Aber auch dabei erhalte ich nur
eines der fünf Felder.
[at] zonen = ();
foreach ($form->inputs) {
next unless $_->name;
print ("gefunden\n") if $_->name eq 'zone[]';
push ( [at] zonen, $_) if $_->name eq 'zone[]';
}
print "Anz Zonen ", scalar [at] zonen, "\n";
gefunden
Anz Zonen 1
Meine ursprüngliche Frage ist also nach wie vor offen:
Weiß jemand einen Ausweg? Ein anderes Modul nehmen?
Gruß
Klaus
Re: Mechanize - gleichnamige Select-Felder
"Karlheinz Weindl" <karlheinz.weindl [at] arcor.de> schrieb im Newsbeitrag
news:4565ac92$0$27607$9b4e6d93 [at] newsspool2.arcor-online.net.. .
> K. Wittrock schrieb:
>
>>> Nein, ich meine 5 Select-Felder mit Mehrfachauswahl
>>
>>
>> Sorry, muss Einfachauswahl heißen.
>
> Dann bekommst du wahrscheinlich _eine_ Hashreferenz auf eine
> Datenstruktur die _ein_ Select-Feld darstellt
Richtig. Ich benötige aber (mindestens) das dritte Select-Feld.
> in dem _alle_
> Options-Felder in der Reihenfolge ihres Auftretens enthalten sind.
>
> Ich kann dir nur nochmal raten Data::Dumper zu verwenden um zu sehen,
> was du damit anfangen kannst.
Die Options-Felder interessieren mich im Moment nicht. Ich brauche Zugriff
auf andere Select-Felder als nur das erste.
Gruß
Klaus
Re: Mechanize - gleichnamige Select-Felder
K. Wittrock schrieb:
> Nein, ich meine 5 Select-Felder mit Mehrfachauswahl direkt
> hintereinander im
> selben Form und mit gleichem Namen (NAME):
> | <select name="zone[]" size="1" style="margin-top:6pt;width:80%;">
>
> Das i-te Feld wählt aus, was in der i-ten Spalte der Antwort stehen soll.
> Alle Felder haben die gleiche Option-Liste. Ich habe keine Ahnung, ob das
> dem Standard widerspricht. Funktioniert aber prima im IE und im Firefox.
Also!
Bevor wir eventuell in die Pampa reiten lass mich doch mal versuchen
zusammenfassen:
Du hast in einer Form 5 Select-Felder gleichen Names und Inhaltes!
Das ist für einen 'normalen' Submit sinnlos, da von vermutlich allen
Browsern nur die Auswahl des letzten Feldes an den Server übertragen wird!
Du weisst, dass die Select-Felder dazu verwendet werden die Reihenfolge
von Feldern einer Antwort (vermutlich Datenbankanfrage) festzulegen.
Daraus würde ich jetzt erst mal schliessen, dass auf dieser Seite
einiges an Javascript Code im Hintergrund eine Rolle spielt. Entweder
schon als Eventhandler bei einem onchange-Event der Select-Felder, oder
spätestens beim eigentlichen Submit, wo vermutlich die Select-Felder
ausgelesen werden um einen entsprechenden Query-String bzw.
PUT-Parameter zusammen zu stellen.
Wenn dem so ist, was willst du dann mit Hilfe von HTML::Form an diesen
Feldern bewirken? Was zwingt dich dazu überhaupt darauf zuzugreifen?
Wenn nicht, dann erklär uns doch wenigsten was auf dieser Seite ablaufen
soll.
Gruß
Karlheinz
Re: Mechanize - gleichnamige Select-Felder
Karlheinz Weindl wrote:
> Du hast in einer Form 5 Select-Felder gleichen Names und Inhaltes!
>
> Das ist für einen 'normalen' Submit sinnlos, da von vermutlich allen
> Browsern nur die Auswahl des letzten Feldes an den Server übertragen wird!
Wie kommst Du darauf?
Es ist IMO völlig legal sowas zu machen.
Allerdings braucht man dann auch entsprechenden Code,
der die Felder trotz gleichen Namens
auseinanderhalten kann.
Mit WWW::Mechanize kenne ich mich nicht aus,
daher kann ich zu dem konkreten Problem nichts sagen.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Mechanize - gleichnamige Select-Felder
Karlheinz Weindl schrieb:
> K. Wittrock schrieb:
>
>
>>Nein, ich meine 5 Select-Felder mit Mehrfachauswahl direkt
>>hintereinander im
>>selben Form und mit gleichem Namen (NAME):
>>| <select name="zone[]" size="1" style="margin-top:6pt;width:80%;">
>>
>>Das i-te Feld wählt aus, was in der i-ten Spalte der Antwort stehen soll.
>>Alle Felder haben die gleiche Option-Liste. Ich habe keine Ahnung, ob das
>>dem Standard widerspricht. Funktioniert aber prima im IE und im Firefox.
>
>
> Also!
> Bevor wir eventuell in die Pampa reiten lass mich doch mal versuchen
> zusammenfassen:
>
> Du hast in einer Form 5 Select-Felder gleichen Names und Inhaltes!
>
> Das ist für einen 'normalen' Submit sinnlos, da von vermutlich allen
> Browsern nur die Auswahl des letzten Feldes an den Server übertragen wird!
Bin schon unterwegs in die Pampa!
Natürlich werden alle Felder übertragen, man muß nur dafür sorgen, dass
man sie serverseitig auch alle richtig ausliest!
Die Frage aber bleibt, warum du die Select-Felder überhaupt mit
HTML::Form Methoden anfassen mußt und die eventuell daraus generierten
Parameter nicht direkt herstellst?
Gruß
Karlheinz
Re: Mechanize - gleichnamige Select-Felder
K. Wittrock schrieb:
> Inzwischen habe ich etwas anderes probiert: Ich hole mir alle Felder und
> filtere selbst die heraus, die ich brauche. Aber auch dabei erhalte ich
> nur eines der fünf Felder.
Was daran liegt, dass HTML::Form aus den fünf gleichnamigen
Select-Feldern _eines_ macht das die Optionen von allen Fünfen enthält,
aber als selektiert (Hashkey 'seen') nur die Position der zuletzt
gefundene Auswahl angibt!
> [at] zonen = ();
> foreach ($form->inputs) {
> next unless $_->name;
> print ("gefunden\n") if $_->name eq 'zone[]';
> push ( [at] zonen, $_) if $_->name eq 'zone[]';
> }
> print "Anz Zonen ", scalar [at] zonen, "\n";
>
> gefunden
> Anz Zonen 1
>
> Meine ursprüngliche Frage ist also nach wie vor offen:
> Weiß jemand einen Ausweg? Ein anderes Modul nehmen?
Hängt davon ab, was du konkret machen willst.
HTML::Form hat in Bezug auf diesen Fall offenbare Defizite. Auf
mehrfache gleichnamige Textfelder z.B. kannst du problemlos (sogar mit
Indexangabe) zugreifen.
Gruß
Karlheinz
Re: Mechanize - gleichnamige Select-Felder
"Karlheinz Weindl" <karlheinz.weindl [at] arcor.de> schrieb im Newsbeitrag
news:4565e4a8$0$5728$9b4e6d93 [at] newsspool3.arcor-online.net...
> Karlheinz Weindl schrieb:
>
>> K. Wittrock schrieb:
>>
>>
>>>Nein, ich meine 5 Select-Felder mit Mehrfachauswahl direkt
>>>hintereinander im
>>>selben Form und mit gleichem Namen (NAME):
>>>| <select name="zone[]" size="1" style="margin-top:6pt;width:80%;">
>>>
>>>Das i-te Feld wählt aus, was in der i-ten Spalte der Antwort stehen soll.
>>>Alle Felder haben die gleiche Option-Liste. Ich habe keine Ahnung, ob das
>>>dem Standard widerspricht. Funktioniert aber prima im IE und im Firefox.
>>
>>
>> Also!
>> Bevor wir eventuell in die Pampa reiten lass mich doch mal versuchen
>> zusammenfassen:
>>
>> Du hast in einer Form 5 Select-Felder gleichen Names und Inhaltes!
>>
>> Das ist für einen 'normalen' Submit sinnlos, da von vermutlich allen
>> Browsern nur die Auswahl des letzten Feldes an den Server übertragen
>> wird!
>
> Bin schon unterwegs in die Pampa!
>
> Natürlich werden alle Felder übertragen, man muß nur dafür sorgen, dass
> man sie serverseitig auch alle richtig ausliest!
Prima, die gegenseitigen Missverständnisse werden weniger. Die Felder stehen
im Request in derselben Reihenfolge wie im Formular, der Server hat da keine
Probleme mit dem Auseinanderhalten.
>
> Die Frage aber bleibt, warum du die Select-Felder überhaupt mit
> HTML::Form Methoden anfassen mußt und die eventuell daraus generierten
> Parameter nicht direkt herstellst?
Schlicht und einfach aus Unwissen. Inzwischen habe ich in HTTP::Request eine
Möglichkeit gefunden, den Requeststring per Regex abzuändern. Offline klappt
das schon. Jetzt muss ich nur noch schaffen, den Submit-Button anzuklicken.
Der hat nämlich keinen Namen, sondern eine ID. Mit HTML::Form kann ich ihm
einen Namen geben. Also Land in Sicht.
Gruß
Klaus
Re: Mechanize - gleichnamige Select-Felder
"K. Wittrock" <KWittrock [at] web.de> schrieb im Newsbeitrag
news:4566d334$0$27615$9b4e6d93 [at] newsspool2.arcor-online.net.. .
>
> "Karlheinz Weindl" <karlheinz.weindl [at] arcor.de> schrieb im Newsbeitrag
> news:4565e4a8$0$5728$9b4e6d93 [at] newsspool3.arcor-online.net...
>> Karlheinz Weindl schrieb:
>>
>>> K. Wittrock schrieb:
>>>
>>>
>>>>Nein, ich meine 5 Select-Felder mit Mehrfachauswahl direkt
>>>>hintereinander im
>>>>selben Form und mit gleichem Namen (NAME):
>>>>| <select name="zone[]" size="1" style="margin-top:6pt;width:80%;">
>>>>
>>>>Das i-te Feld wählt aus, was in der i-ten Spalte der Antwort stehen
>>>>soll.
>>>>Alle Felder haben die gleiche Option-Liste. Ich habe keine Ahnung, ob
>>>>das
>>>>dem Standard widerspricht. Funktioniert aber prima im IE und im Firefox.
>>>
>>>
>>> Also!
>>> Bevor wir eventuell in die Pampa reiten lass mich doch mal versuchen
>>> zusammenfassen:
>>>
>>> Du hast in einer Form 5 Select-Felder gleichen Names und Inhaltes!
>>>
>>> Das ist für einen 'normalen' Submit sinnlos, da von vermutlich allen
>>> Browsern nur die Auswahl des letzten Feldes an den Server übertragen
>>> wird!
>>
>> Bin schon unterwegs in die Pampa!
>>
>> Natürlich werden alle Felder übertragen, man muß nur dafür sorgen, dass
>> man sie serverseitig auch alle richtig ausliest!
>
> Prima, die gegenseitigen Missverständnisse werden weniger. Die Felder
> stehen im Request in derselben Reihenfolge wie im Formular, der Server hat
> da keine Probleme mit dem Auseinanderhalten.
>
>>
>> Die Frage aber bleibt, warum du die Select-Felder überhaupt mit
>> HTML::Form Methoden anfassen mußt und die eventuell daraus generierten
>> Parameter nicht direkt herstellst?
>
> Schlicht und einfach aus Unwissen. Inzwischen habe ich in HTTP::Request
> eine Möglichkeit gefunden, den Requeststring per Regex abzuändern. Offline
> klappt das schon. Jetzt muss ich nur noch schaffen, den Submit-Button
> anzuklicken. Der hat nämlich keinen Namen, sondern eine ID. Mit HTML::Form
> kann ich ihm einen Namen geben. Also Land in Sicht.
Das mit dem Submit-Button war Quatsch, damit wird der unveränderte Request
geschickt, und ich erhalte nur die erste Spalte. Ich habe jetzt den Request
mit LWP::UserAgent verschickt und erhalte die Antwort in voller Schönheit.
Jetzt muss ich nur anstandshalber noch den "Content-Length header value"
korrigieren.
Karlheinz, vielen Dank für deine Geduld.
Gruß
Klaus