2010-12-21 4 views
3

Nous avons un formulaire avec quelques boutons d'envoi séparés qui effectuent des actions différentes. Le problème est que j'ai deux ou trois boutons qui ont le code HTML suivant:Mechanize submit

<input type="submit" name="submit" value="Submit" class="submitLink" title="Submit" /> 
<input type="submit" name="submit" value="Delete" class="submitLink" title="Delete" /> 

Maintenant, vous ne trouvez pas un élément en valeur avec la fonction standard de find_control. J'ai donc écrit une fonction sous-jacente qui trouverait mon élément, que je puis espère cliquer la manière suivante:

submit_button = self.br.form.find_control(predicate=submit_button_finder) 
self.br.submit(submit_button) 

Toutefois, les deux soumettre et cliquez sur appel interne élément trouver, et aucune méthode ne vous permet d'ajouter dans la mot-clé de prédicat, donc un appel comme celui-ci ne fonctionne pas non plus:

self.br.submit(predicate=submit_button_finder) 

Y at-il quelque chose qui me manque?!?

Mise à jour:

Ajouté Une fonction d'assistance pour récupérer tous les éléments qui répondent aux critères tels:

def find_controls(self, name=None, type=None, kind=None, id=None, predicate=None, label=None): 

    i = 0 
    results = [] 

    try : 
    while(True): 
     results.append(self.browswer.find_control(name, type, kind, id, predicate, label, nr=i)) 
     i += 1 
    except Exception as e: #Exception tossed if control not found 
    pass 
    return results 

ensuite remplacé les lignes suivantes:

submit_button = self.br.form.find_control(predicate=submit_button_finder) 
self.br.submit(submit_button) 

Avec:

submit_button = self.br.form.find_control(predicate=submit_button_finder) 
submit_buttons = self.find_controls(type="submit") 
for button in submit_buttons[:]: 
    if (button != submit_button) : self.br.form.controls.remove(button) 
self.br.submit() 
+1

Je suis sûr que vous ne devriez pas avoir deux boutons avec le même nom sur une page. Cela pourrait faire partie de votre problème. –

+0

@Alex Malheureusement, je n'ai aucun contrôle sur cela. – Scott

Répondre

3

Une solution de contournement relativement ghetto consiste à parcourir manuellement tous les contrôles dans le formulaire en question, puis supprimez les contrôles du formulaire que vous ne voulez pas en fonction de critères. Par exemple:

for each in form.controls[:]: 
    if each not "some criteria": 
    form.controls.remove(each) 

La meilleure idée est ici de limiter les contrôles que nous parcourons aux objets submitcontrol SEULEMENT. De cette façon, vous limiterez le formulaire à un bouton de soumission, et la méthode browser.submit() n'aura pas le choix de cliquer dessus.

+0

Ajout d'une fonction d'assistance pour nous permettre de tirer tous les éléments pour une stratégie de localisation. Puis retiré comme vous l'avez suggéré. Modification de la question d'origine pour inclure la réponse – Scott