2010-01-13 18 views

回答

1

你需要通过浏览器做到这一点吗?您是否可以不使用用(例如)HttpClient编写的HTTP客户端应用程序提交表单?

如果你确实需要通过浏览器来做到这一点,它必须是Mozilla吗? Watij提供了一种简单的方式来启动IE的副本,填充字段和提交表单。

+0

亲爱的大脑, 我需要使用浏览器来做到这一点。我寻找Watij它解决了我的问题,但我只支持Windows,我的应用程序在Linux上。 你有没有类似的Linux工具? – Sunil 2010-01-13 08:38:17

+0

为什么你需要使用浏览器?由于cookies /会话? HttpClient可以为你做到这一点。不幸的是,我不知道Watij是否适用于Linux。 – 2010-01-13 08:48:08

+0

申请的要求是登录到客户账户并代表他进行交易(例如:paypal)。登录部分必须由java应用程序完成,用户应该能够导航到更多页面。 我们可以使用HttpClient来实现吗? – Sunil 2010-01-13 08:59:27

0

您将需要一个JNI库,它允许您从Mozilla访问方法。可能最简单的解决方案是使用SWT并创建一个带有SWT.MOZILLA的浏览器(例如,请参阅此snippet)。

请注意,您只是得到一个浏览器小部件,而不是像Firefox这样的全功能浏览器。

+0

亲爱的主席先生, 感谢您的回应。 每当从列表框中选择一个URL时,我的应用程序必须打开一个新的mozilla实例,填充登录详细信息并提交它。不知道使用小部件是否会达到我的目的。 Regards, Sunil。 – Sunil 2010-01-13 08:50:07

+0

您可以为每个浏览器小部件创建一个新的Shell(=新窗口)。所以我没有看到你的问题。 – 2010-01-13 08:59:24

0

你在寻找类似的东西吗?MozSwing

alt text

更多信息here

1

你也许能够使用的JavaXPCOM请查看Mozilla Embedding for Java

下面是一些示例代码

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.FileNotFoundException; 
import java.io.File; 

import javax.swing.*; 

import org.mozilla.xpcom.*; 
import org.mozilla.interfaces.*; 

/* 
Websites ref 
http://groups.google.com/group/mozilla.dev.tech.java/browse_thread/thread/898ba6751d0c57f7 
http://skrul.com/blog/code/ 
http://wirestorm.net/blog/?cat=9 

*/ 


public class BrowserTest implements nsIWebProgressListener,nsIWeakReference, nsIInterfaceRequestor, nsIWebBrowserChrome, nsISHistoryListener{ 
    static { 
     try { 
      System.loadLibrary("NativeWindow"); 
     } catch (UnsatisfiedLinkError e) { 
      System.err.println("can't find your library"); 
     } 
    } 
    private static final String frameTitle="GRE Embedded"; 
    public static void main(String[] args) { 
     BrowserConroller controler=new BrowserConroller(); 
     controler.run(); 
     new BrowserTest().start(); 
    } 

    public void start(){ 


     JFrame f = new JFrame(frameTitle); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(400, 150); 
     Container content = f.getContentPane(); 
     content.setBackground(Color.white); 
     content.setLayout(new FlowLayout()); 
     content.add(new JLabel("Initializing ... ")); 
     f.setVisible(true); 

     File grePath = null; 
     LocationProvider locProvider; 
     Mozilla mozilla = Mozilla.getInstance(); 

     GREVersionRange[] range = new GREVersionRange[1]; 
     range[0] = new GREVersionRange("1.8.0", true, "1.9", false); 

     try { 
      grePath = Mozilla.getGREPathWithProperties(range, null); 
      mozilla.initialize(grePath); 
      locProvider = new LocationProvider(grePath); 
      mozilla.initEmbedding(grePath, grePath, locProvider); 
     } 

     catch (FileNotFoundException e) { 
      System.out.println("Error: FileNotFoundException"); 
     } 
     catch (XPCOMException e) { 
      System.out.println("Error: XPCOMException"); 
     } 


     //---------- END GRE INITIALIZATION------------ 


     nsIServiceManager serviceManager = mozilla.getServiceManager(); 

     nsIAppStartup appStartup = (nsIAppStartup)serviceManager.getServiceByContractID("@mozilla.org/toolkit/app-startup;1", nsIAppStartup.NS_IAPPSTARTUP_IID); 
     nsIWindowCreator windowCreator = (nsIWindowCreator)appStartup.queryInterface(nsIWindowCreator.NS_IWINDOWCREATOR_IID); 

     nsIWindowWatcher windowWatcher =(nsIWindowWatcher)serviceManager.getServiceByContractID("@mozilla.org/embedcomp/window-watcher;1",nsIWindowWatcher.NS_IWINDOWWATCHER_IID); 

     windowWatcher.setWindowCreator(windowCreator); 

     nsIDOMWindow win = windowWatcher.openWindow(null, "http://google.com", "MAIN_WIN","chrome,resizable,centerscreen", null); 
     windowWatcher.setActiveWindow(win); 

     nsIComponentManager componentManager = mozilla.getComponentManager(); 
     String NS_IWEBBROWSER_CID = "F1EAC761-87E9-11d3-AF80-00A024FFC08C"; //$NON-NLS-1$ 
     nsIWebBrowser webBrowser = (nsIWebBrowser) componentManager.createInstance(NS_IWEBBROWSER_CID, null, nsIWebBrowser.NS_IWEBBROWSER_IID); 
     webBrowser.setContainerWindow(this); 
     webBrowser.addWebBrowserListener(this, nsIWebProgressListener.NS_IWEBPROGRESSLISTENER_IID); 


//  nsIWebNavigation webNavigation=(nsIWebNavigation)webBrowser.queryInterface(nsIWebNavigation.NS_IWEBNAVIGATION_IID); 
//  webNavigation.loadURI("http://www.zdnet.com", nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null); 
//  

     nsIBaseWindow baseWindow = (nsIBaseWindow) webBrowser.queryInterface(nsIBaseWindow.NS_IBASEWINDOW_IID);    
     long handle=FindWindow.getHWND(frameTitle); 

     baseWindow.initWindow(handle, 0, 0, 0,350,350); 
     baseWindow.create(); 
     baseWindow.setVisibility(true); 




//  
//  nsIDOMWindow domWin=webBrowser.getContentDOMWindow(); 
//  nsIDOMEventTarget domEventTarget= (nsIDOMEventTarget)domWin.queryInterface(nsIDOMEventTarget.NS_IDOMEVENTTARGET_IID); 
//  domEventTarget.addEventListener("click", new EventListener(), false); 
//  
     //Hide JFrame after it have been initialized 
     f.setVisible(true); 
//  
//  nsIWebNavigation webNavigation=(nsIWebNavigation)webBrowser.queryInterface(nsIWebNavigation.NS_IWEBNAVIGATION_IID); 
//  webNavigation.loadURI("http://www.zdnet.com", nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null); 
//  
     appStartup.run(); 
     System.out.println("try termEmbedding"); 
     try { 
      System.out.println("mozilla.termEmbedding(); START"); 
      mozilla.termEmbedding(); 
      System.out.println("mozilla.termEmbedding(); FINISHED"); 
     } 
     catch (XPCOMException e) { 
      System.out.println("Fehler: XPCOMException"); 
     } 
     System.out.println("finished termEmbedding"); 
     System.out.println("All done"); 
    } 



    public void onLocationChange(nsIWebProgress webProgress, nsIRequest request, nsIURI location) { 
     c("onLocationChange"); 

    } 

    public void onProgressChange(nsIWebProgress webProgress, nsIRequest request, int curSelfProgress, int maxSelfProgress, int curTotalProgress, int maxTotalProgress) { 
     c("onProgressChange"); 

    } 

    public void onSecurityChange(nsIWebProgress webProgress, nsIRequest request, long state) { 
     c("onSecurityChange"); 

    } 

    public void onStateChange(nsIWebProgress webProgress, nsIRequest request, long stateFlags, long status) { 
     c("onStateChange"); 

    } 

    public void onStatusChange(nsIWebProgress webProgress, nsIRequest request, long status, String message) { 
     c("onStatusChange"); 

    } 

    public nsISupports queryInterface(String uuid) { 
     c("queryInterface"); 
     return null; 
    } 



    public nsISupports queryReferent(String uuid) { 
     c("queryReferent"); 
     return null; 
    } 

    public nsISupports getInterface(String uuid) { 
     c("getInterface"); 
     return null; 
    } 
    private void c(Object o){ 
     System.out.println(o); 
    } 

    public void destroyBrowserWindow() { 
     c("destroyBrowserWindow"); 

    } 

    public void exitModalEventLoop(long status) { 
     c("exitModalEventLoop"); 

    } 

    public long getChromeFlags() { 
     c("getChromeFlags"); 
     return 0; 
    } 

    public nsIWebBrowser getWebBrowser() { 
     c("getWebBrowser");  
     return null; 
    } 

    public boolean isWindowModal() { 
     c("isWindowModal");  
     return false; 
    } 

    public void setChromeFlags(long chromeFlags) { 
     c("setChromeFlags");  

    } 

    public void setStatus(long statusType, String status) { 
     c("setStatus"); 

    } 

    public void setWebBrowser(nsIWebBrowser webBrowser) { 
     c("setWebBrowser");   
    } 

    public void showAsModal() { 
     c("showAsModal"); 

    } 

    public void sizeBrowserTo(int acx, int acy) { 
     c("sizeBrowserTo"); 

    } 

    public boolean onHistoryGoBack(nsIURI backURI) { 
     c("onHistoryGoBack"); 
     return false; 
    } 

    public boolean onHistoryGoForward(nsIURI forwardURI) { 
     c("onHistoryGoForward"); 
     return false; 
    } 

    public boolean onHistoryGotoIndex(int index, nsIURI gotoURI) { 
     c(" onHistoryGotoIndex"); 
     return false; 
    } 

    public void onHistoryNewEntry(nsIURI newURI) { 
     c(" onHistoryNewEntry"); 
    } 

    public boolean onHistoryPurge(int numEntries) { 
     c(" onHistoryPurge"); 
     return false; 
    } 

    public boolean onHistoryReload(nsIURI reloadURI, long reloadFlags) { 
     c(" onHistoryReload"); 
     return false; 
    } 


} //public class JavaXPCOM_test1[/code] 

当然这只是加载在JFrame中的Mozilla浏览器,但你应该能够访问表单字段代码来填充和提交它们。

+0

感谢您的建议。我会试试这个,希望它解决了我的问题:) – Sunil 2010-01-13 10:10:23

+0

然后将它标记为您接受的答案 – 2010-01-13 12:08:10

0

你可以创建自己的Greasemonkey脚本调用提交

+0

我们如何从java应用程序调用greasemonkey脚本? – Sunil 2010-01-13 10:37:37

0

OK,这可能会相当晚了......但你可以使用硒的webdriver实现你在找什么。

您可以创建一个Mozilla窗口的新实例并使用它处理窗体。

0

您可以通过webdriver的

继的帮助下做几乎任何事情是我的代码登录到网站

WebDriver driver = new FireFoxDriver(); 
    driver.get("http://172.16.16.219:9081/LOSWebApp/security/login.htm"); 
     WebDriverWait wait = new WebDriverWait(driver, 3000); 
    wait.until(ExpectedConditions.visibilityOfElementLocated((By.name("ssoId")))); 

    WebElement userid = driver.findElement(By.name("ssoId")); 
    WebElement password = driver.findElement(By.name("password")); 
    WebElement loginButton = driver.findElement(By.name("button")); 
    userid.sendKeys("userID"); 
    password.sendKeys("pwd"); 

    loginButton.click(); 
相关问题