Использовать CasperJS/Javascript для отправки формы?

Вот фрагмент моего кода:

this.sendKeys('.usertext.cloneable > div > div.md > textarea', "Message");
//...    
this.evaluate(function(){
    var entry = document.getElementsByClassName("usertext cloneable")[0].id;
    document.getElementById(entry).removeAttribute("action")
    document.querySelector('#'+entry).submit()
})

Этот код должен отправить форму, найденную на сайте (Reddit.com), после заполнения ее sendKeys. Он завершает заполнение текстового поля (я вижу на скриншоте через casper.capture), но не отправляет текст. Первоначально я полагал, что это произошло из-за неисправного селектора CSS, но я больше не уверен. Также казалось, что Casper не отправляет форму из-за атрибута action='#', поэтому он был удален перед отправкой формы. Я в недоумении, что попробовать дальше.

И форма:

<form action="#" class="usertext cloneable" onsubmit="return post_form(this, 'comment')" id="form-t3_3gp8yji5i">
    <input type="hidden" name="thing_id" value="t3_3gp8yj">
        <div class="usertext-edit md-container" style="">
            <div class="md">
                <textarea rows="1" cols="1" name="text" class=""></textarea>
            </div>
            <div class="bottom-area">
                <span class="help-toggle toggle" style="">
                    <a class="option active " href="#" tabindex="100" onclick="return toggle(this, helpon, helpoff)">formatting help</a>
                    <a class="option " href="#">hide help</a>
                </span>
                <a href="/wiki/reddiquette" class="reddiquette" target="_blank" tabindex="100">reddiquette</a>
                <span class="error TOO_LONG field-text" style="display:none"></span>
                <span class="error RATELIMIT field-ratelimit" style="display:none"></span>
                <span class="error NO_TEXT field-text" style="display:none"></span>
                <span class="error TOO_OLD field-parent" style="display:none"></span>
                <span class="error DELETED_COMMENT field-parent" style="display:none"></span>
                <span class="error DELETED_LINK field-parent" style="display:none"></span>
                <span class="error USER_BLOCKED field-parent" style="display:none"></span>
                <div class="usertext-buttons">
                    <button type="submit" onclick="" class="save">save</button>
                    <button type="button" onclick="cancel_usertext(this)" class="cancel" style="display:none">cancel</button>
                    <span class="status"></span>
                </div>
            </div>
            <div class="markhelp" style="display:none">
                <p></p>
                <p>reddit uses a slightly-customized version of <a href="http://daringfireball.net/projects/markdown/syntax">Markdown</a> for formatting. See below for some basics, or check <a href="/wiki/commenting">the commenting wiki page</a> for more detailed help and solutions to common issues.
                </p>

Вот сообщения об ошибках:

Console: Unsafe JavaScript attempt to access frame with URL https://www.reddit.com/ from frame with URL https://static.adzerk.net/reddit/ads.html?sr=-reddit.com,loggedin&bust2#https://www.reddit.com. Domains, protocols and ports must match.

Console: Unsafe JavaScript attempt to access frame with URL https://www.reddit.com/ from frame with URL https://static.adzerk.net/reddit/ads.html?sr=-reddit.com,loggedin&bust2#https://www.reddit.com. Domains, protocols and ports must match.

Console: Unsafe JavaScript attempt to access frame with URL https://www.reddit.com/r/Pokemon_adventures/comments/3gp8yj/test_post_please_ignore/?thing_id=t3_3gp8yj&text=%22jnjrkefejkn%22 from frame with URL https://static.adzerk.net/reddit/ads.html?sr=pokemon_adventures,loggedin&bust2#https://www.reddit.com. Domains, protocols and ports must match.

Console: Unsafe JavaScript attempt to access frame with URL https://www.reddit.com/r/Pokemon_adventures/comments/3gp8yj/test_post_please_ignore/?thing_id=t3_3gp8yj&text=%22jnjrkefejkn%22 from frame with URL https://static.adzerk.net/reddit/ads.html?sr=pokemon_adventures,loggedin&bust2#https://www.reddit.com. Domains, protocols and ports must match.

Console: Unsafe JavaScript attempt to access frame with URL https://www.reddit.com/r/Pokemon_adventures/comments/3gp8yj/test_post_please_ignore/?thing_id=t3_3gp8yj&text=Message from frame with URL https://static.adzerk.net/reddit/ads.html?sr=pokemon_adventures,loggedin&bust2#https://www.reddit.com. Domains, protocols and ports must match.

Console: Unsafe JavaScript attempt to access frame with URL https://www.reddit.com/r/Pokemon_adventures/comments/3gp8yj/test_post_please_ignore/?thing_id=t3_3gp8yj&text=Message from frame with URL https://static.adzerk.net/reddit/ads.html?sr=pokemon_adventures,loggedin&bust2#https://www.reddit.com. Domains, protocols and ports must match.

person The Novice    schedule 26.08.2015    source источник
comment
Пожалуйста, правильно отформатируйте разметку. Кроме того, я не вижу вашего сценария и того, как вы проверяете, что ничего не происходит. Скриншот делаешь или запросы смотришь?   -  person Artjom B.    schedule 26.08.2015
comment
@Artjom B. Использование скриншотов через casper.capture. Я также мог бы увидеть результаты скрипта (на Reddit.com), если бы пост прошел. Сейчас исправим разметку.   -  person The Novice    schedule 26.08.2015
comment
Зарегистрируйтесь на мероприятия resource.error, page.error, remote.message и casper.page.onResourceTimeout (пример). Возможно есть ошибки.   -  person Artjom B.    schedule 26.08.2015
comment
Ошибки/сообщения теперь можно найти в pastebin внизу.   -  person The Novice    schedule 26.08.2015


Ответы (2)


Поскольку ошибки, которые вы получили, не имеют ничего общего с отправкой формы, вы можете попробовать следующее:

  • Используйте средство CasperJS для отправки формы. Использовать

    this.fill(".usertext.cloneable", {}, true);
    

    вместо this.evaluate(...);.

  • Используйте средство CasperJS, чтобы нажать на кнопку:

    this.click(".usertext.cloneable button[type='submit']");
    

Если это не помогло, то вы можете попробовать то же самое, запустив CasperJS с параметрами командной строки --web-security=false --ssl-protocol=any --ignore-ssl-errors=true.

person Artjom B.    schedule 26.08.2015

action="#" в форме выглядит подозрительно, поэтому я бы удалил его, прежде чем пытаться снова.

Если вы не можете изменить HTML, вы можете удалить его с помощью casper.js перед отправкой формы.

person Filype    schedule 26.08.2015
comment
Думаете, вы могли бы немного уточнить? - person The Novice; 26.08.2015
comment
Casper.js не отправляет форму из-за action=#, поэтому, возможно, стоит удалить этот атрибут (действие) перед отправкой формы. - person Filype; 26.08.2015
comment
Попытка удалить действие с помощью следующего кода, но проблема не устранена. Форма не будет отправлена. casper.evaluate(function() { messageId = "form-t3_3gp8yji5i" document.getElementById(messageId).removeAttribute("action") document.querySelector('#'+messageId).submit() }) - person The Novice; 26.08.2015