Проблема записи в текстовый ввод в модуле механизации python - PullRequest
1 голос
/ 23 июня 2011

Прежде всего, я пишу скрипт на 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 элемента имени.Я не могу использовать name = "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 abuse@dreamhost.com).");
    }
}
</script>

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

1 Ответ

1 голос
/ 23 июня 2011

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

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

...