Проблема записи в текстовый ввод в модуле механизации python

1

Прежде всего, я пишу скрипт python для автоматизации покупки определенных доменов от dreamhost.com. Сначала я перехожу на панель веб-сайта, где пользователи могут делать практически все, что может предложить сайт. Вот код:

br = mechanize.Browser()
br.open("https://panel.dreamhost.com/index.cgi?tree=domain.registration&")
br.select_form(name="a")
br["username"]="my_username_here"
br["password"]="my_password_here"
br.submit()

Это кодовые слова отлично и записывает меня в панель. Здесь есть текстовое поле для ввода вашего домена и многоэкранный выбор, чтобы выбрать расширение - при отправке этой формы он проверяет наличие.

Я использую аналогичный подход к успеху выше и выполняю следующее:

br.select_form(name="f")
br["Pick Domain Name"] = "domainiwanttobuy"    #textbox
br["tld"] = [extension list]                   #select from dropdown
br.submit()

Полученный HTML-код после отправки этой формы показывает, что выпадающее меню изменяется соответствующим образом, но текстовое поле пустое, и я получаю сообщение об ошибке от dreamhost, в котором говорится: "Ошибка: введите доменное имя выше".

Поэтому поле ввода не работает - я посмотрел на соответствующий HTML-код страницы и вот он:

<input name="fqdn" id="fqdn" class="text reg_domain_input" name="Pick Domain Name" value="mynewdomain" onChange="tradeMarkCheck(this.id)">

Прежде всего, он подозревает, что есть 2 элемента имени. Я не могу использовать имя = "fqdn" или он говорит, что такого элемента управления не существует. Во-вторых, я вижу, что при изменении значения вызывается функция javascript. Я знаю, что механизатор не может обрабатывать Javascript, но я не считаю, что функция делает что-то ценное. Поэтому я не думаю, что это вызывает проблему. Вот соответствующая функция javascript:

<script type="text/javascript">
function tradeMarkCheck(x) {
    var domain = document.getElementById(x).value;
    var bad = /(dream.*host|host.*dream)/;

    if (bad.test(domain)) {
        alert("NOTE: Domains containing 'DreamHost' in them are not eligible for use with DreamHost Rewards.  Also, please ensure that your site/domain does not dilute or infringe upon the 'DreamHost' trademark (if you have any questions as to whether a use is legal or not, contact us at [email protected]).");
    }
}
</script>

Я потратил несколько часов на отладку и попытался найти решение. Любые идеи очень приветствуются. Заранее спасибо!

Теги:
mechanize
textinput
submit

1 ответ

1
Лучший ответ

Я не смотрел сайт, но я сильно подозреваю, что некоторые javascript делают то, что вы не делаете с механизацией. Стандартный ответ в этих случаях - использовать Selenium Webdriver для автоматизации браузера (он имеет API Python).

Изменение: у Selenium Webdriver есть браузер без заголовка HtmlUnit, который немного поддерживает javascript, но это далеко не полная поддержка javascript. PhantomJS может помочь вам, это безголовая версия Webkit.

  • 0
    Единственная проблема в том, что у меня не может быть процесса, видимого для пользователя, и, насколько я знаю, нет способа скрыть браузер от пользователя с селеном, верно?
  • 0
    Я закончил с Selenium - документация для Python была ужасной, но все работало правильно, как только вы выяснили синтаксис. Спасибо за вашу помощь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню