2

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

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

更新

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

严重:作业运行失败,出现意外的 RuntimeException:
TypeError:无法将 null 的属性“innerHTML”设置为“已完成的脚本:已完成的脚本 MyFunctionName”

更新 2

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

webClient.waitForBackgroundJavaScriptStartingBefore(5000);

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

4

1 回答 1

0

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

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

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

于 2011-06-07T15:59:51.997 回答