天天看點

java通路js自動填寫表單

初學java,最近自己又抽筋想刷一刷論壇的積分,故想編寫一個小程式。

對于該篇文章有疑問或者錯誤的地方,郵件至 [email protected],歡迎交流。

思路:

1、視窗:需要用到browser類,故選擇SWT視窗,使用GridLayout,簡單布局,通過Toolkit.getDefaultToolkit().getScreenSize()擷取螢幕尺寸,1/4屏。還有一種常見的視窗布局Formlayout,較GridLayout複雜,對于初學者建議先學習使用GirdLayout,再過渡。

2、java調用javascript自動點選網頁上超連結:需要用到execute()方法。視窗建立後,用browser.serUrl()(為了自己運作簡便,并沒有設定TextField來讀取網址這麼麻煩的步驟),但是問題來了,即使設定了Url,browser.execute()也不會立即執行,我猜browser類需要調用ie核心,是以不能在serUrl(http)之後立即使用excute(javascropt),需要用browser.addLocationListener()加上一個監聽,并且在自動點選後去掉該監聽,否則到了跳轉的頁面後,不停地點選該超連結,代碼如下

browser.addLocationListener(new LocationAdapter(){
			public void changed(LocationEvent event) {
				if(browser.execute(autoClick()))browser.removeLocationListener(this);
				//為什麼不用對象而用靜态的類?
				//System.out.println("click==="+browser.getUrl());
				//
			}	
        });
           

3、java調用javascript自動完成表單的填寫:同樣用到execute()方法,并且自動完成之後網頁會有一個自動跳轉的功能,需要去掉網頁的自動填寫,用到browser.clearSessions(),這兒即能用執行個體browser也能用類Browser。本來想在此處去除LocationListener,但是提示錯誤(此問題需要進一步研究,見諒)

browser.addProgressListener(new ProgressAdapter(){//example寫的是ProgressAdapter
			public void	completed(ProgressEvent event){
				//if(browser.execute(autoFinish()))browser./*stop();*/removeLocationListener();
				browser.execute(autoFinish());
				browser.clearSessions();
			}
			});
           

4、Js的自動點選和自動完成:看了很長時間的網頁源代碼,對于Js代碼完全不熟悉,邊看邊學,後來嘗試使用document.getElementById(id).getElementsByTagName(tagname),主要思想就是讀取id下的tag,傳回一個List,因為網頁中我需要自動點選的超連結無id、需要自動完成的textfield是自動配置設定id,不可能每次都手動填寫動态配置設定的id,是以需要将這些tagname擷取後在數組内找到對應的id。PS:為什麼不用stop?因為stop的API是Stop any loading and rendering activity,如果在判斷autoFinish傳回值為true後,讓browser.stop(),那麼有網頁有驗證碼就不加載了。