我在运行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的好编辑!
答案 0 :(得分:0)
在Firefox中有效吗?如果是这样,问题可能是htmlunit本身,这不是一个真正的浏览器。请尝试使用Watir或iMacros。
答案 1 :(得分:0)
HtmlUnit具有相当不错的Javascript支持,所以我怀疑这是个问题。
你怎么知道脚本没有运行?或者更好的是,从HtmlUnit的角度来看,如果脚本运行成功,你怎么知道呢?当您单击FF中的链接时,您可能会看到发生的事情。您依靠人类视觉和人类使用的浏览器。使用HtmlUnit,您需要指示代码“看到”相同的结果,无论是通过检查后续DOM树,还是处理弹出窗口,或者需要什么。这是一种思维转变。
你的脚本做什么?操纵页面的内容?打开一个对话框?重定向到另一个页面? HtmlUnit会自动处理一些事情,有些事情(比如打开对话框)需要定义处理程序。