如何从HtmlUnit运行Google Apps脚本?

时间:2011-06-06 23:17:25

标签: java javascript htmlunit google-apps-script

我在运行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)? 还是我做过的其他一些基本错误?

我迷失了,所以任何帮助都非常感激!!

更新

我按照你的建议,罗德尼,发现问题没有退出谷歌网站。单击链接以执行脚本后,使用HtmlUnit单击“注销”链接,使脚本运行正常。唯一的问题是它会引发以下错误(不会停止脚本运行):

  

严重:作业运行因意外而失败   RuntimeException的:
  TypeError:不能   将null的属性“innerHTML”设置为   “完成的剧本:完成的剧本   MyFunctionName“

更新2

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

webClient.waitForBackgroundJavaScriptStartingBefore(5000);

非常感谢你的帮助,Rodney - 和Naveen的好编辑!

2 个答案:

答案 0 :(得分:0)

在Firefox中有效吗?如果是这样,问题可能是htmlunit本身,这不是一个真正的浏览器。请尝试使用Watir或iMacros。

答案 1 :(得分:0)

HtmlUnit具有相当不错的Javascript支持,所以我怀疑这是个问题。

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

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