2011-04-08 12 views
8

Estoy raspando un sitio que utiliza una forma oculta como medio de contramedida contra exactamente lo que estoy tratando de hacer. Este formulario:¿Cómo establecer el valor de forma oculta en Mechanize/Python?

<input style="width: 2px; height: 25px" type="hidden" size="1" name="TestJavaScript" /> 

es el culpable. La forma espera que el valor de esta entrada se establece en "OK" por algo de JavaScript que se ejecuta más adelante en la línea:

function doSignOn() { 
    window.document.tether.method = "POST"; 
    window.document.tether.action = "https://missionlink.missionfcu.org/MFCU/login.aspx"; 
    window.document.tether.TestJavaScript.value = "OK"; 

    if (window.document.tether.user.value.length < 1) { 
     alert("Please enter your Member Number."); 
     return; 
    } 

    if (window.document.tether.PIN.value.length < 1) { 
     alert("Please enter your Password."); 
     return; 
    } 

    // If we're in the service interruption or notice window, put up an alert. 
    if (now <= interruption_end) { 
     if (now >= notice_begin) { 
      alert(prewarn_alert+'\n\nThank you.'); 
     } 
    } 
    window.document.tether.submit(); 
} 

inteligente. Estoy utilizando mecanizar para raspar la página, ¿cómo puedo establecer el valor de este elemento del formulario? Al imprimir el objeto form en Python, esto es lo que parece:

<tether POST https://missionlink.missionfcu.org/MFCU/login.aspx application/x-www-form-urlencoded 
    <TextControl(user=)> 
    <PasswordControl(PIN=)> 
    <HiddenControl(TestJavaScript=) (readonly)> 
    <SelectControl(signonDest=[*My Default Destination, Accounts.Activity, Accounts.Summary, Transfers.AddTransfer, SelfService.SelfService])> 
> 

Como se muestra como "sólo lectura", no puedo modificarlo, de lo contrario se produce una excepción. Sin duda hay una solución, ¿verdad? ¿Algunas ideas?

Respuesta

27

tal como fue anunciado elsewhere (es decir, en la página de preguntas frecuentes de la biblioteca mecanizar):

form.find_control("foo").readonly = False # allow changing .value of control foo 
form.set_all_readonly(False) # allow changing the .value of all controls 
Cuestiones relacionadas