使用PhantomJS提交表单时出现TypeError

时间:2016-09-13 15:29:00

标签: javascript forms dom phantomjs

由于我的移动电话提供商不再提供短信网关电子邮件地址,我使用PhantomJS编写了一个小应用程序登录他们的网站并使用他们的网络文本表单发送短信。

问题是应用程序很少运行。我设法发送了一些短信,但大部分时间都无法执行。这是程序和Javascript代码:

using System;
using System.IO;
using System.Web.Script.Serialization;

namespace textSender {
    class Program {
        static void Main(string[] args) {
            var json = new JavaScriptSerializer();
            var phantomJS = new PhantomJS();

        phantomJS.OutputReceived += (sender, e) => {
            Console.WriteLine("PhantomJS output: {0}", e.Data);
        };
        phantomJS.ErrorReceived += (sender, e) => {
            Console.WriteLine("PhantomJS error: {0}", e.Data);
        };

        // execute login.js
        Console.WriteLine("Loading data from <carrier website>");
        try {
            phantomJS.Run(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "login.js"), new[] { "<carrier webtext URL>" });

        } finally {
            phantomJS.Abort();
        }
        Console.WriteLine("Execution finished. Press enter to close.");
        Console.In.ReadLine();
    }
}
}

相当基础,基于PhantomJS的一个例子。

var system = require('system');
var page = require('webpage').create();

var fillLoginInfo = function () {
    var loginForm = document.getElementById("UserLoginForm");
    loginForm.elements["UserTelephoneNo"].value = '<phone number>';
    loginForm.elements["UserPin"].value = '<password>';
    loginForm.submit();
}

var fillMessageInfo = function () {

    var messForm = document.getElementById("MessageSendForm");
    messForm.elements["MessageMessage"].value = 'This message was sent automatically';
    messForm.elements["MessageRecipientsIndividual0"].value = '<phoneNumber>';
    messForm.submit();
    console.log("Message sent");
}

page.onLoadFinished = function () {

    if (page.title == "<Homepage Title>") {
        console.log("Login page");
        page.evaluate(fillLoginInfo);
        return;
    }
    else if (page.title == "Webtext Page Title") {
        console.log("Message page");
        page.evaluate(fillMessageInfo);
        return;
    }
    else
        page.render('./screens/some.png');

    console.log("completed");
    phantom.exit();
}

page.open(system.args[1]);

简单解释一下login.js中应该发生什么;

  1. 该页面打开从Program.cs
  2. 传入的网址
  3. OnLoadFinished在页面打开时触发,执行fillLoginInfo
  4. fillLoginInfo提交表单,导航到webtext页面
  5. onloadFinished在加载webtext页面时再次触发
  6. 执行fillMessageInfo,发送短信
  7. 基于点缀的几个console.log命令,预期的输出将是:

    Loading data from <carrier website>...
    PhantomJS output: Login Page
    PhantomJS output: Message Page
    PhantomJS output: Message Sent
    PhantomJS output: completed
    Execution finished. Press enter to close.
    

    相反,我看到了这一点:

    Loading data from <carrier website>...
    PhantomJS output: Login Page
    PhantomJS output: Message Page
    PhantomJS output: Message Page
    PhantomJS output: Message Page
    PhantomJS output: TypeError: null is not an object (evaluating 'messForm.elements')
    PhantomJS output: Message Page
    PhantomJS output: Message Page
    

    等等。

    TypeError让我觉得javascript是在DOM完全加载之前尝试执行的,但在这种情况下,为什么page.onLoadFinished会被触发?同样,如果它在DOM完全加载之前执行,为什么它会反复加载消息页面?一个成功的表单提交重新加载页面,所以它循环这样的事实让我认为它成功提交,但显然它不是。

    我能够弄清楚的是,在为messForm赋值之后,fillMessageInfo函数会停止执行,这对于引用下一行中的元素的错误是有意义的。

    这可能是一件非常简单的事情,但是我已经看了太久了,只需要一双新鲜的眼睛来告诉我为什么我错了。

0 个答案:

没有答案