我正在使用一个linux应用程序,它应该在mozilla中打开一个URL,在表单中填充用户名和密码(url,用户名和密码从mysql数据库获得)并提交。如何从Java应用程序打开mozilla浏览器并提交它?
任何人都可以建议如何使用mozilla API来做到这一点。
Regards, Sunil。
我正在使用一个linux应用程序,它应该在mozilla中打开一个URL,在表单中填充用户名和密码(url,用户名和密码从mysql数据库获得)并提交。如何从Java应用程序打开mozilla浏览器并提交它?
任何人都可以建议如何使用mozilla API来做到这一点。
Regards, Sunil。
你需要通过浏览器做到这一点吗?您是否可以不使用用(例如)HttpClient编写的HTTP客户端应用程序提交表单?
如果你确实需要通过浏览器来做到这一点,它必须是Mozilla吗? Watij提供了一种简单的方式来启动IE的副本,填充字段和提交表单。
您将需要一个JNI库,它允许您从Mozilla访问方法。可能最简单的解决方案是使用SWT并创建一个带有SWT.MOZILLA
的浏览器(例如,请参阅此snippet)。
请注意,您只是得到一个浏览器小部件,而不是像Firefox这样的全功能浏览器。
亲爱的主席先生, 感谢您的回应。 每当从列表框中选择一个URL时,我的应用程序必须打开一个新的mozilla实例,填充登录详细信息并提交它。不知道使用小部件是否会达到我的目的。 Regards, Sunil。 – Sunil 2010-01-13 08:50:07
您可以为每个浏览器小部件创建一个新的Shell(=新窗口)。所以我没有看到你的问题。 – 2010-01-13 08:59:24
你也许能够使用的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浏览器,但你应该能够访问表单字段代码来填充和提交它们。
感谢您的建议。我会试试这个,希望它解决了我的问题:) – Sunil 2010-01-13 10:10:23
然后将它标记为您接受的答案 – 2010-01-13 12:08:10
OK,这可能会相当晚了......但你可以使用硒的webdriver实现你在找什么。
您可以创建一个Mozilla窗口的新实例并使用它处理窗体。
您可以通过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();
亲爱的大脑, 我需要使用浏览器来做到这一点。我寻找Watij它解决了我的问题,但我只支持Windows,我的应用程序在Linux上。 你有没有类似的Linux工具? – Sunil 2010-01-13 08:38:17
为什么你需要使用浏览器?由于cookies /会话? HttpClient可以为你做到这一点。不幸的是,我不知道Watij是否适用于Linux。 – 2010-01-13 08:48:08
申请的要求是登录到客户账户并代表他进行交易(例如:paypal)。登录部分必须由java应用程序完成,用户应该能够导航到更多页面。 我们可以使用HttpClient来实现吗? – Sunil 2010-01-13 08:59:27