Executing javascript in java - Opening a URL and getting links
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.FileReader;
publ开发者_运维问答ic class Main {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
try {
FileReader reader = new FileReader("C:/yourfile.js");
engine.put("urlfromjava", "http://www.something.com/?asvb");
engine.eval(reader);
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Right now, the yourfile.js contains this line
function urlget(url)
{
print("URL:"+url);
var loc = window.open(url);
var link = document.getElementsByTagName('a')["61"].href;
return ("\nLink is: \n"+link);
}
var x = urlget(urlfromjava);
print(x);
I get the error
"javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "window" is not defined"
How to open a URL and get the links of it from java?
you can embed Env.js in Rhino to get this kind of functionality
According to the documentation:
The window object represents an open window in a browser.
Since you are not executing your script in a browser, the window object is not defined.
You can read the URL using the URL/URLConnecion classes and feed it to the ScriptEngine. There is a tutorial here.
In javascript window
means browser window. So when you are trying to execute this js from Java, it is unable to find browser window and you are getting error. You can use URL class in Java to get the content of the url.
try this:
import java.net.*;
import java.io.*;
public class URLConnectionReader {
public static void main(String[] args) throws Exception {
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yc = yahoo.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);// or save to some StringBuilder like this: sb.append(inputLine); then pass the sb.toString() to the method that gets links out of it - > see getLinks below
in.close();
}
}
private static final String CLOSING_QUOTE = "\"";
private static final String HREF_PREFIX = "href=\"";
private static final String HTTP_PREFIX = "http://";
public static Set<String> getLinks(String page) {
Set<String> links = new HashSet<String>();
String[] rawLinks = StringUtils.splitByWholeSeparator(page, HREF_PREFIX);
for (String str : rawLinks) {
if(str.startsWith(HTTP_PREFIX)) {
links.add(StringUtils.substringBefore(str, CLOSING_QUOTE));
}
}
return links;
}
you can use HtmlUnit is java API, i think it can help you to access the executed js content, as a simple html.
WebClient webClient = new WebClient();
HtmlPage myPage = (HtmlPage) webClient.getPage(new URL("YourURL"));
System.out.println(myPage.getVisibleText());
精彩评论