このガイドhttps://developer.mozilla.org/en/Java_in_Firefox_Extensionsに従って、Firefox プラグインで Java クラスにアクセスできるようにしました (実際には、それらを Selenium ide のユーザー拡張機能に追加しています)。
私のJavaコードがインポートされたオブジェクトを初期化しようとするまで、すべてが上記のガイドでうまく機能します...
そのため、jtidy をインポートして html をクリーンアップしようとすると、初期化するとすぐに java.lang.reflect.InvocationTargetException 例外が発生します。興味深いことに、javascript で jtidy クラスを初期化してからこれを渡すことができ、dom を解析しようとするまで機能します。これはすべてアクセス許可に関係していると思いますが、ここからどこに行くべきかを知るには、Live Connect を十分に使用していません。
私のコードは次のとおりです。
Javascript
PageBot.prototype.locateElementByLabelText = function(labelText, inDocument) {
//var pageTitle = inDocument.getElementsByTagName('title').item(0).nodeName;
var pageTitle = inDocument.title;
LOG.warn("Title = "+ pageTitle);
var pageSource = inDocument.getElementsByTagName('html')[0].innerHTML;
LOG.warn("I have the page source");
var xpathValue = getXpathUsingJavaFnc(labelText, pageTitle, pageSource);
LOG.warn("Xpath = "+xpathValue);
return this.locateElementByXPath(xpathValue, inDocument);
};
Selenium.prototype.doLoadProject = function(locator, paramString) {
LOG.warn("starting to load Load Project "+locator + " " + paramString);
try{
var result = inst.initialiseProject(locator, Components.classes["@mozilla.org/process/environment;1"].getService(Components.interfaces.nsIEnvironment).get('AUTOMATED_HOME')+"/");
}catch(e){
LOG.warn(e.message);
}
LOG.warn("finished Load Project");
LOG.warn(result);
};
var basePath = Components.classes["@mozilla.org/process/environment;1"].getService(Components.interfaces.nsIEnvironment).get('AUTOMATED_HOME');
var fullPath = 'file:///' + basePath + '/ScenarioFramework-jar-with-dependencies.jar';
LOG.warn("full path = "+fullPath);
var extensionUrl = "file:///" + basePath +'/javaFirefoxExtensionUtils.jar';
var classLoaderJarpath = extensionUrl;
var myJarpath = fullPath;
//var testTidy = "file:///" + basePath +'/jtidy-r938.jar';
var urlArray = [];
urlArray[0] = new java.net.URL(myJarpath);
urlArray[1] = new java.net.URL(classLoaderJarpath);
urlArray[2] = new java.net.URL(testTidy);
var cl = java.net.URLClassLoader.newInstance(urlArray);
policyAdd(cl, urlArray);
var classToLoad = "scenario.framework.main.SeleniumRunner";
var aClass = cl.loadClass(classToLoad);
//var aClass = java.lang.Class.forName(classToLoad, true, cl);
var inst = aClass.newInstance();
LOG.warn("finished loading add Java");
function getXpathUsingJavaFnc(eleName, pageTitle, pageSource) {
LOG.warn("Testing getXpath");
try{
var xpathValue = inst.findElementUsingName(eleName, pageTitle, pageSource);
}catch(e){
//var jvm = Components.classes["@mozilla.org/oji/jvm-mgr;1"].getService(Components.interfaces.nsIJVMManager);
//jvm.showJavaConsole();
logExc(e);
}
return xpathValue;
};
function policyAdd (loader, urls) {
try {
var str = 'edu.mit.simile.javaFirefoxExtensionUtils.URLSetPolicy';
var policyClass = java.lang.Class.forName(
str,
true,
loader
);
var policy = policyClass.newInstance();
policy.setOuterPolicy(java.security.Policy.getPolicy());
java.security.Policy.setPolicy(policy);
policy.addPermission(new java.security.AllPermission());
for (var j=0; j < urls.length; j++) {
policy.addURL(urls[j]);
}
java.lang.System.setSecurityManager(null);
var t = java.lang.Thread.currentThread().setContextClassLoader(cl);
}catch(e) {
logExc(e);
}
}
function logExc(e) {
try {
while(e != null) {
LOG.warn(e);
e = e.getCause();
}
LOG.warn(netscape.javascript.JSUtil.getStackTrace(e));
} catch(exp) {
LOG.warn("exception while logging exception");
LOG.warn(exp);
LOG.warn("exception being logged");
LOG.warn(e);
}
}
ジャワ:
public static String findElementUsingName(String Name, String pageTitle, String html){
org.w3c.tidy.Tidy tidy = new org.w3c.tidy.Tidy();
return "//input[@id='password']";
}