我在运行 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 单击“注销”链接,使脚本运行正常。唯一的问题是它会引发以下错误(不会停止脚本运行):
SEVERE: Job run failed with unexpected RuntimeException:
TypeError: Cannot set property "innerHTML" of null to "Finished script: Finished script MyFunctionName"
更新 2
现在也解决了这个问题。在继续注销之前没有足够的时间让脚本完成。添加此修复它:
webClient.waitForBackgroundJavaScriptStartingBefore(5000);
非常感谢您的帮助,Rodney - 以及 Naveen 的出色编辑!
最佳答案
HtmlUnit 有很好的 Javascript 支持,所以我怀疑这就是问题所在。
你怎么知道脚本没有运行?或者更好的是,从 HtmlUnit 的 Angular 来看,您如何知道脚本是否已成功运行?当您单击 FF 中的链接时,您可能会看到发生了什么。您依赖于人类视觉和供人类使用的浏览器。使用 HtmlUnit,您需要指示您的代码“查看”相同的结果,无论是通过检查后续的 DOM 树,还是处理弹出窗口,或者任何需要的。这有点转变思维。
你的脚本是做什么的?操纵页面内容?打开对话框?重定向到另一个页面?有些事情 HtmlUnit 会自动处理,有些事情(比如打开对话框)需要定义处理程序。
关于javascript - 如何从 HtmlUnit 运行 Google Apps 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6259093/