Эквивалент Perl HTML :: Form :: ForceValue в Python - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь автоматизировать вход на веб-сайт с помощью модуля mechanize Python. Далее указан логин form код:

    <TD><B>Site:</B></TD>
    <TD><SELECT name="site" class="drpdwn" size=1 width="200" onChange="populateZones(this, '');"><OPTION value="">Select a site</OPTION></SELECT>
    <INPUT type="hidden" name="shortsite" size="3" value=""></TD>
</TR>
<TR>
    <TD><B>Zone:</B></TD>
    <TD><SELECT name="zone" class="drpdwn" size=1 width="100"><OPTION value="">Select a zone</OPTION></SELECT></TD>
</TR>
<TR>
    <TD><B>User ID:</B></TD>
    <TD><INPUT type="text" name="user" size=20 value=""></TD>
</TR>
<TR>
    <TD><B>Password:</B></TD>
    <TD><INPUT type="password" name="password" size=20></TD>
</TR>
<TR>
    <TD>&nbsp;</TD>
    <TD><INPUT name="submit1" type="submit" value="Log On" style="color: #003399; font-weight: bold; font-size: 10pt">
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input name="reset1" type="reset" value="Reset" style="color: #003399; font-weight: bold; font-size: 10pt" onClick="resetform();">
    </TD>

Я могу проанализировать и заполнить user, password и shortsite поля без каких-либо затруднений.Проблема возникает при заполнении раскрывающегося списка zone.Как видно из приведенного выше HTML-кода, веб-страница использует функцию populateZones javascript для заполнения зон.Я ищу способ принудительно установить значение зоны, хранящееся в файле конфигурации.В прошлом я делал подобные вещи, используя HTML::Form::ForceValue. Есть ли какой-нибудь эквивалент в python?

Ниже приведен отрывок из скрипта python, над которым я работаю для автоматизации входа: <br> <code>br['user'] = self.config['COMMON.USER']
br['password'] = self.config['COMMON.PASSWORD']

if 'COMMON.SITE' in self.config and 'COMMON.ZONE' in self.config:
try:
br.form.set_all_readonly(False)
br.form["shortsite"] = self.config['COMMON.SITE']
br.form.find_control(name="zone").set_value_by_label([self.config['COMMON.ZONE']])
except ControlNotFoundError, err:
logger = logging.getLogger(__name__)
logger.info(str(err))

1 Ответ

0 голосов
/ 19 апреля 2012

Я смог добиться этого, подражая javascript. Совместное использование кода, который может быть полезным:

br.select_form(predicate=self.__form_with_fields("user", "password"))  
br.form.set_all_readonly(False)  
br['user']           = self.config['COMMON.USER']  
br['password']       = self.config['COMMON.PASSWORD']  
br.form["shortsite"] = self.config['COMMON.SITE'] 

zone1 = br.form.find_control("zone")

#Add drop down list value dynamically like the Javascript does
mechanize.Item(zone1, {"contents": "Hurray","value": "Hurray"})

#Choose the just added option
br.form["zone"] = ["Hurray"]
...