【问题标题】:How to run Google Apps script from HtmlUnit?如何从 HtmlUnit 运行 Google Apps 脚本?
【发布时间】:2011-09-09 16:29:42
【问题描述】:

我在运行 Google Apps 脚本的 Google 协作平台页面中有一个链接。当我在 Firefox 中手动单击链接时,它工作正常。

当我使用 HtmlUnit 做同样的事情时,一切似乎都正常。使用 HtmlUnit,我可以登录(运行 Google Apps 脚本时必须登录)、访问网页、识别链接并单击它,但脚本无法运行。

代码的内容很简单:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
HtmlPage page = webClient.getPage("https://sites.google.com/site/mywebpage");
HtmlAnchor anchor = page.getAnchorByName("MyAnchor");
anchor.click();

那么缺少什么,或者我做错了什么?

我在网页中创建了原始链接:

<a href="/macros/sites?action=run&lib=094bahv51120b3d65&funcName=MyFunctionName" name="MyAnchor">Click here to run function</a>

保存网页编辑后,Google 协作平台自动将其更改为:

<a href="#" name="MyAnchor" class="apps-script-run-link" id="ACiQKe2HyNeo..etc...01120b3d65#MyFunctionName">Click here to run function</a>

click() 是否不起作用,因为它作用于现在只是“#”而不是链接定义的 href 属性? 还是 HtmlUnit 对 JavaScript (Mozilla Rhino) 的语言支持不能正确执行 Javascript 来处理单击的链接(这意味着我需要用能够识别 Google 站点网页中的 Javascript 的东西替换 Rhino)? 还是我犯了其他一些基本错误?

我迷路了,非常感谢任何帮助!

更新

Rodney,我听从了您的建议,发现问题不在于退出 Google 网站。单击链接执行脚本后,使用HtmlUnit单击“退出”链接,使脚本运行正常。唯一的问题是它会引发以下错误(不会停止脚本运行):

严重:作业运行因意外而失败 运行时异常:
类型错误:不能 将 null 的属性“innerHTML”设置为 "完成的脚本:完成的脚本 我的函数名”

更新 2

现在也解决了这个问题。在继续注销之前,没有足够的时间让脚本完成。添加这个修复它:

webClient.waitForBackgroundJavaScriptStartingBefore(5000);

非常感谢您的帮助,Rodney - 以及 Naveen 的出色编辑!

【问题讨论】:

    标签: java javascript htmlunit google-apps-script


    【解决方案1】:

    HtmlUnit 有相当好的 Javascript 支持,所以我怀疑这就是问题所在。

    你怎么知道脚本没有运行?或者更好的是,从 HtmlUnit 的角度来看,您如何知道脚本是否已成功运行?当您单击 FF 中的链接时,您可能会看到发生了一些事情。您依赖的是人类视觉和供人类使用的浏览器。使用 HtmlUnit,您需要指示您的代码“看到”相同的结果,无论是通过检查后续的 DOM 树,还是处理弹出窗口,或任何需要的东西。思路有点转变。

    你的脚本是做什么的?操纵页面的内容?打开对话框?重定向到另一个页面?有些事情 HtmlUnit 会自动处理,有些事情(比如打开对话框)需要定义处理程序。

    【讨论】:

    • 是的,脚本修改了另一个网页的内容。事件发生后,通过在 Firefox 中查看页面,很容易检查脚本是否从 HtmlUnit 运行。除了检查链接跳转到的页面的 click() 函数的返回之外,还有什么方法可以知道 HtmlUnit 中的 click() 做了什么?由于 click() 只触发脚本函数,返回的网页与当前网页相同,所以这并不能告诉我发生了什么。你认为我需要定义一些额外的处理程序来做我想做的事吗?
    • 啊...“返回的网页与当前网页相同”不太正确。它与“HtmlPage”的实例相同,但如果您的 click() JS 代码确实更改了页面 DOM,则其内容将由页面上的任何 Javascript 更新。在最坏的情况下,在调用 click() 之前和之后在页面对象上调用 asXml();理想情况下,您遍历 DOM 以寻找特定的更改。
    • 脚本更改了不同页面上的内容,而不是运行脚本的链接所在的页面(这很重要吗?)。这不会阻止我在 HtmlUnit 中转到该页面并按照您的建议检查内容,但是它怎么可能改变任何东西,因为不是证明我稍后在 Firefox 中手动浏览并发现没有任何改变?还是这里发生了更复杂的事情,实际上 HtmlUnit 进行了更改,但不知何故没有正确记录服务器端?你认为你的 asXml() 测试值得做吗?
    • 它改变了另一个页面上的东西?对不起,错过了。只需使用 HtmlUnit “浏览”该页面并查找更改。与您手动执行的过程完全相同,您只需在代码中执行即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多