Mechanize - gleichnamige Select-Felder

Mechanize - gleichnamige Select-Felder

am 22.11.2006 16:24:48 von KWittrock

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, @zonen);
| my @werte = qw/ort fer/;
| foreach my $wert (@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 (@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

am 22.11.2006 21:22:56 von Karlheinz Weindl

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

am 22.11.2006 22:44:08 von Karlheinz Weindl

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.

@allvals = $form->find_input('name');

Gruß
Karlheinz

Re: Mechanize - gleichnamige Select-Felder

am 23.11.2006 13:06:42 von KWittrock

"Karlheinz Weindl" schrieb im Newsbeitrag
news:4564c4a4$0$18833$9b4e6d93@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):
|
>
> 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

am 23.11.2006 14:28:09 von KWittrock

"K. Wittrock" schrieb im Newsbeitrag
news:45658f27$0$18835$9b4e6d93@newsspool4.arcor-online.net.. .
>
> "Karlheinz Weindl" schrieb im Newsbeitrag
> news:4564c4a4$0$18833$9b4e6d93@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):
> |
>>
>> 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 @zonen = $form->find_input("zone[]");
print "Anz Zonen ", scalar @zonen, "\n";
print Dumper(@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.

@zonen = ();
foreach ($form->inputs) {
next unless $_->name;
print ("gefunden\n") if $_->name eq 'zone[]';
push (@zonen, $_) if $_->name eq 'zone[]';
}
print "Anz Zonen ", scalar @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

am 23.11.2006 18:03:29 von KWittrock

"Karlheinz Weindl" schrieb im Newsbeitrag
news:4565ac92$0$27607$9b4e6d93@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

am 23.11.2006 18:35:20 von Karlheinz Weindl

K. Wittrock schrieb:

> Nein, ich meine 5 Select-Felder mit Mehrfachauswahl direkt
> hintereinander im
> selben Form und mit gleichem Namen (NAME):
> |
>>
>>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

am 23.11.2006 20:12:15 von Karlheinz Weindl

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!

> @zonen = ();
> foreach ($form->inputs) {
> next unless $_->name;
> print ("gefunden\n") if $_->name eq 'zone[]';
> push (@zonen, $_) if $_->name eq 'zone[]';
> }
> print "Anz Zonen ", scalar @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

am 24.11.2006 12:00:37 von KWittrock

"Karlheinz Weindl" schrieb im Newsbeitrag
news:4565e4a8$0$5728$9b4e6d93@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):
>>>|
>>>>
>>>>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