2011-06-06 146 views
2

我在運行Google Apps腳本的Google協作平臺頁面上有一個鏈接。當我手動點擊Firefox中的鏈接時,它工作正常。如何從HtmlUnit運行Google Apps腳本?

當我使用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> 

在保存網頁編輯,谷歌網站會自動把它改爲:

<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 Sites網頁中識別Javascript的東西來替代Rhino)? 還是我犯的一些其他基本錯誤?

我迷路了,所以任何幫助非常感謝!

UPDATE

我跟着你的建議,羅德尼,發現問題並不註銷谷歌網站。單擊鏈接執行腳本後,使用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); 

非常感謝您的幫助,羅德尼 - 和納文的良好編輯!

回答

0

它在Firefox中工作嗎?如果是這樣,問題可能是htmlunit本身,這不是一個真正的瀏覽器。嘗試使用Watir或iMacros代替。

+0

是的,在Firefox中工作正常。但是我需要從正在執行的Java程序中觸發Google Apps腳本的運行。 HtmlUnit允許您通過幾個簡單的調用來完成此操作。我可以使用Watir或IMacros做到這一點嗎? – Marty 2011-06-06 23:33:53

0

HtmlUnit具有相當不錯的Javascript支持,所以我懷疑這是問題所在。

你怎麼知道腳本沒有運行?或者更好的是,如果腳本已經成功運行,您如何從HtmlUnit的角度知道?當你點擊FF中的鏈接時,你大概會看到一些事情發生。您依賴於人類視覺和瀏覽器供人類使用。使用HtmlUnit,您需要指示您的代碼「查看」相同的結果,無論是通過檢查隨後的DOM樹,還是處理彈出窗口或任何需要的內容。這在思維上有點轉變。

你的腳本是做什麼的?操作頁面的內容?打開一個對話框?重定向到另一個頁面? HtmlUnit會自動處理一些事情,有些(如打開對話框)需要處理程序定義。

+0

羅德尼,非常感謝您的回覆。 – Marty 2011-06-08 22:37:02

+0

是的,腳本修改了另一個網頁的內容。通過在事件發生後在Firefox中查看頁面,很容易檢查腳本是否從HtmlUnit運行。有沒有什麼方法可以知道HtmlUnit中的click(),除了檢查鏈接跳轉到的頁面click()函數的返回之外呢?由於click()只會觸發腳本函數,因此返回的Web頁面與當前頁面相同,所以這並不能告訴我發生了什麼。你認爲我需要一些額外的處理程序來做我想做的事嗎? – Marty 2011-06-08 22:52:28

+0

啊......「返回的網頁和現在的一樣」不太正確。它是「HtmlPage」的同一個實例,但是如果你的click()JS代碼實際上改變了頁面DOM,它的內容將被頁面上的任何Javascript更新。最壞的情況是,在調用click()之前和之後在頁面對象上調用asXml();理想情況下,你遍歷DOM尋找特定的變化。 – 2011-06-08 22:59:30