HtmlUnit JavaScript对Java方法的回调
我需要使用HtmlUnit钩住JavaScript函数调用。 我写过这样的东西:HtmlUnit JavaScript对Java方法的回调,java,javascript,htmlunit,Java,Javascript,Htmlunit,我需要使用HtmlUnit钩住JavaScript函数调用。 我写过这样的东西: var orgSetInterval = window.setInterval; window.setInterval = function(p1, p2) { myfunc(p1,p2); orgSetInterval(p1, p2); } 所以。我只需要在JavaScript代码中调用一些Java方法(myfunc)。是否可以使用HtmlUnit?导入java.lang.reflect.Invoc
var orgSetInterval = window.setInterval;
window.setInterval = function(p1, p2)
{
myfunc(p1,p2);
orgSetInterval(p1, p2);
}
所以。我只需要在JavaScript代码中调用一些Java方法(myfunc)。是否可以使用HtmlUnit?导入java.lang.reflect.InvocationTargetException;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.slf4j.LoggerFactory;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebWindow;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.javascript.AbstractJavaScriptEngine;
import com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine;
import com.gargoylesoftware.htmlunit.javascript.PostponedAction;
import com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import me.jc.amazing.core.util.ReflectUtil;
import me.jc.amazing.core.util.Strings;
import me.jc.amazing.web.util.RspMsgUtil;
import net.sourceforge.htmlunit.corejs.javascript.Context;
import net.sourceforge.htmlunit.corejs.javascript.Scriptable;
import net.sourceforge.htmlunit.corejs.javascript.ScriptableObject;
import net.sourceforge.htmlunit.corejs.javascript.annotations.JSConstructor;
import net.sourceforge.htmlunit.corejs.javascript.annotations.JSFunction;
import net.sourceforge.htmlunit.corejs.javascript.annotations.JSGetter;
public class TestHtmlUnitDriver {
public static void main(String[] args) {
HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.CHROME, true);
// WebDriver driver = new HtmlUnitDriver(BrowserVersion.CHROME,true);
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.valueOf("ERROR"));
((HtmlUnitDriver) driver).setJavascriptEnabled(true);
try {
driver.get("https://www.baidu.com");
(new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
Context ctx = Context.getCurrentContext();
//Scriptable scope = ctx.initStandardObjects();
try {
WebWindow window = (WebWindow) ReflectUtil.invokeMethod(d, "getCurrentWindow");
Scriptable scope = window.getScriptableObject();
ScriptableObject.defineClass(scope, Counter.class);
} catch (Exception e) {
e.printStackTrace();
}
//Scriptable testCounter = ctx.newObject(scope, "Counter");
System.out.println(((JavascriptExecutor) driver).executeScript("return new Counter(123312).getCount()"));;
Object element = ((JavascriptExecutor) driver)
.executeScript("return document.getElementsByTagName(\"html\")");
System.out.println(element);
return element != null;
}
});
} catch (Exception e) {
e.printStackTrace();
}
driver.quit();
// JavascriptExecutor javascript = (JavascriptExecutor) driver;
// Object obj = javascript.executeScript("return
// document.getElementsByTagName(\"html\")");
// Object obj =
// ((HtmlUnitDriver)driver).executeScript("document.getElementsByTagName(\"html\")");
// System.out.println(obj);
}
public static class Counter extends ScriptableObject {
private static final long serialVersionUID = 438270592527335642L;
// The zero-argument constructor used by Rhino runtime to create instances
public Counter() {
}
// @JSConstructor annotation defines the JavaScript constructor
@JSConstructor
public Counter(int a) {
count = a;
}
// The class name is defined by the getClassName method
@Override
public String getClassName() {
return "Counter";
}
// The method getCount defines the count property.
@JSGetter
@JSFunction
public int getCount() {
return count++;
}
// Methods can be defined the @JSFunction annotation.
// Here we define resetCount for JavaScript.
@JSFunction
public void resetCount() {
count = 0;
}
private int count;
}
}
导入java.util.concurrent.TimeUnit;
导入org.openqa.selenium.JavascriptExecutor;
导入org.openqa.selenium.WebDriver;
导入org.openqa.selenium.WebElement;
导入org.openqa.selenium.htmlunit.HtmlUnitDriver;
导入org.openqa.selenium.remote.DesiredCapabilities;
导入org.openqa.selenium.support.ui.ExpectedCondition;
导入org.openqa.selenium.support.ui.WebDriverWait;
导入org.slf4j.LoggerFactory;
导入com.gargoylesoftware.htmlunit.BrowserVersion;
导入com.gargoylesoftware.htmlunit.WebClient;
导入com.gargoylesoftware.htmlunit.WebWindow;
导入com.gargoylesoftware.htmlunit.html.HtmlPage;
导入com.gargoylesoftware.htmlunit.javascript.AbstractJavaScriptEngine;
导入com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine;
导入com.gargoylesoftware.htmlunit.javascript.PostponedAction;
导入com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration;
导入ch.qos.logback.classic.Level;
导入ch.qos.logback.classic.LoggerContext;
导入me.jc.amazing.core.util.reflectil;
导入me.jc.amazing.core.util.Strings;
导入me.jc.amazing.web.util.RspMsgUtil;
导入net.sourceforge.htmlunit.corejs.javascript.Context;
导入net.sourceforge.htmlunit.corejs.javascript.Scriptable;
导入net.sourceforge.htmlunit.corejs.javascript.ScriptableObject;
导入net.sourceforge.htmlunit.corejs.javascript.annotations.JSConstructor;
导入net.sourceforge.htmlunit.corejs.javascript.annotations.JSFunction;
导入net.sourceforge.htmlunit.corejs.javascript.annotations.JSGetter;
公共类TestHtmlUnitDriver{
公共静态void main(字符串[]args){
HtmlUnitDriver驱动程序=新的HtmlUnitDriver(BrowserVersion.CHROME,true);
//WebDriver driver=新的HtmlUnitDriver(BrowserVersion.CHROME,true);
LoggerContext LoggerContext=(LoggerContext)LoggerFactory.getILoggerFactory();
loggerContext.getLogger(“com.gargoylesoftware.htmlunit”).setLevel(Level.valueOf(“ERROR”));
((HtmlUnitDriver)driver).setJavascriptEnabled(true);
试一试{
驱动程序。获取(“https://www.baidu.com");
(新的WebDriverWait(驱动程序,10500))。直到(新的ExpectedCondition(){
公共布尔应用(WebDriver d){
Context ctx=Context.getCurrentContext();
//Scriptable scope=ctx.initStandardObjects();
试一试{
WebWindow window=(WebWindow)reflectil.invokeMethod(d,“getCurrentWindow”);
Scriptable scope=window.getScriptableObject();
ScriptableObject.defineClass(作用域、计数器、类);
}捕获(例外e){
e、 printStackTrace();
}
//脚本化testCounter=ctx.newObject(作用域,“计数器”);
System.out.println(((JavascriptExecutor)driver.executeScript(“返回新计数器(123312.getCount()));;
对象元素=((JavascriptExecutor)驱动程序)
.executeScript(“return document.getElementsByTagName(\“html\”);
系统输出打印项次(元素);
返回元素!=null;
}
});
}捕获(例外e){
e、 printStackTrace();
}
driver.quit();
//JavascriptExecutor javascript=(JavascriptExecutor)驱动程序;
//Object obj=javascript.executeScript(“返回
//document.getElementsByTagName(\“html\”);
//对象对象对象=
//((HtmlUnitDriver)driver.executeScript(“document.getElementsByTagName(\“html\”);
//系统输出打印项次(obj);
}
公共静态类计数器扩展ScriptableObject{
私有静态最终长serialVersionUID=438270592527335642L;
//Rhino运行时用于创建实例的零参数构造函数
公众柜位(){
}
//@JSConstructor注释定义JavaScript构造函数
@JSConstructor
公共柜台(INTA){
计数=a;
}
//类名由getClassName方法定义
@凌驾
公共字符串getClassName(){
返回“计数器”;
}
//getCount方法定义count属性。
@杰斯盖特
@JSFunction
public int getCount(){
返回计数++;
}
//方法可以通过@JSFunction注释定义。
//这里我们为JavaScript定义resetCount。
@JSFunction
公共无效重置计数(){
计数=0;
}
私人整数计数;
}
}
让我看看这是否正确。您想使用HTMLUnit从JavaScript函数调用Java方法吗?我想在这一点上最明显的问题是:您有权访问服务器的代码吗?你在哪里托管JavaScript?不,我正在使用HtmlUnit开发客户端应用程序。目标是在网站上自动执行操作。网站使用setInterval func更新其拥有的数据。我的应用程序需要钩住这个事件并处理它(使用纯Java代码)。简单的)参考链接: