【问题标题】:Use CasperJS/Javascript to submit a form?使用 CasperJS/Javascript 提交表单?
【发布时间】:2015-11-20 02:07:45
【问题描述】:

这是我的代码中的一个 sn-p:

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()
})

此代码应在填写 sendKeys 后提交在网站 (Reddit.com) 上找到的表单。它完成了文本框的填写(我可以通过casper.capture看到截图),但不提交文本。我最初认为这是因为 CSS 选择器有问题,但我不再确定。由于 action='#' 属性,Casper 似乎没有发送表单,因此在提交表单之前将其删除。我不知道下一步该尝试什么。

还有形式:

<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>

以下是报告的错误:

控制台:不安全的 JavaScript 尝试从具有 URL https://static.adzerk.net/reddit/ads.html?sr=-reddit.com,loggedin&bust2#https 的框架访问具有 URL https://www.reddit.com/ 的框架://www.reddit.com。域、协议和端口必须匹配。 控制台:不安全的 JavaScript 尝试从具有 URL https://static.adzerk.net/reddit/ads.html?sr=-reddit.com,loggedin&bust2#https 的框架访问具有 URL https://www.reddit.com/ 的框架://www.reddit.com。域、协议和端口必须匹配。 控制台:不安全的 JavaScript 尝试使用 URL https://www.reddit.com/r/Pokemon_adventures/cmets/3gp8yj/test_post_please_ignore/?thing_id=t3_3gp8yj&text=%22jnjrkefejkn%22 从具有 URL https://static.adzerk 的框架访问框架.net/reddit/ads.html?sr=pokemon_adventures,loggedin&bust2#https://www.reddit.com。域、协议和端口必须匹配。 控制台:不安全的 JavaScript 尝试使用 URL https://www.reddit.com/r/Pokemon_adventures/cmets/3gp8yj/test_post_please_ignore/?thing_id=t3_3gp8yj&text=%22jnjrkefejkn%22 从具有 URL https://static.adzerk 的框架访问框架.net/reddit/ads.html?sr=pokemon_adventures,loggedin&bust2#https://www.reddit.com。域、协议和端口必须匹配。 控制台:不安全的 JavaScript 尝试使用 URL https://www.reddit.com/r/Pokemon_adventures/cmets/3gp8yj/test_post_please_ignore/?thing_id=t3_3gp8yj&text=来自具有 URL https://static.adzerk.net/ 的框架的消息reddit/ads.html?sr=pokemon_adventures,loggedin&bust2#https://www.reddit.com。域、协议和端口必须匹配。 控制台:不安全的 JavaScript 尝试使用 URL https://www.reddit.com/r/Pokemon_adventures/cmets/3gp8yj/test_post_please_ignore/?thing_id=t3_3gp8yj&text=来自具有 URL https://static.adzerk.net/ 的框架的消息reddit/ads.html?sr=pokemon_adventures,loggedin&bust2#https://www.reddit.com。域、协议和端口必须匹配。

【问题讨论】:

  • 请正确格式化您的标记。另外,我看不到您的脚本以及您如何验证没有发生任何事情。你是在截屏还是在看请求?
  • @Artjom B. 通过 casper.capture 使用屏幕截图。如果帖子通过了,我还可以看到脚本的结果(在 Reddit.com 上)。立即修复标记。
  • 请注册resource.errorpage.errorremote.messagecasper.page.onResourceTimeout 活动 (Example)。可能有错误。
  • 现在可以在底部的 pastebin 中找到错误/消息。

标签: javascript css-selectors casperjs reddit


【解决方案1】:

表单中的action="#" 看起来很可疑,所以我会在重试之前将其删除。

如果您无法更改 HTML,您可以在提交表单之前使用 casper.js 将其删除。

【讨论】:

  • 觉得你可以详细说明一下吗?
  • Casper.js 没有发送表单,因为 action=# 因此,在提交表单之前删除该属性(操作)可能是值得的
  • 尝试使用以下代码删除操作,但问题仍然存在。表格不会提交。 casper.evaluate(function() { messageId = "form-t3_3gp8yji5i" document.getElementById(messageId).removeAttribute("action") document.querySelector('#'+messageId).submit() })
【解决方案2】:

由于您遇到的错误与表单提交无关,您可以尝试以下操作:

  • 使用 CasperJS 工具提交表单。使用

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

    而不是this.evaluate(...);

  • 使用 CasperJS 工具点击按钮:

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

如果这没有帮助,那么您可以尝试使用 --web-security=false --ssl-protocol=any --ignore-ssl-errors=true 命令行选项运行 CasperJS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多