Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HtmlUnit JavaScript对Java方法的回调_Java_Javascript_Htmlunit - Fatal编程技术网

HtmlUnit JavaScript对Java方法的回调

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

我需要使用HtmlUnit钩住JavaScript函数调用。 我写过这样的东西:

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代码)。简单的)参考链接: