gpt4 book ai didi

java - 如何通过Java代码捕获用户在浏览器上的操作?

转载 作者:行者123 更新时间:2023-12-01 15:28:57 25 4
gpt4 key购买 nike

我正在尝试从 Java 代码中捕获应用程序的浏览器 DOM。目标是在 Web 浏览器上呈现 Web 应用程序。用户将填充字段或执行任何操作来浏览应用程序。将有一个独立的 java 代码,它将捕获 Web 应用程序将导航到的每个页面的浏览器 DOM。我使用 HtmlUnit 捕获 DOM 并使用 Selenium WebDriver 来渲染 Web 应用程序,因为 HtmlUnit 是 headless 的。

问题是我无法跟踪我是否在应用程序的新页面上。语句 HtmlPage page = webClient.getCurrentWindow().getEnlinedPage() 不起作用,因为 HtmlPage 对象不会更改。

我尝试实现DomChangeListener,但如果数据填充是手动完成的,即在java代码之外,似乎没有DomChangeEvent。如果我填充内容并从代码提交页面,则 DomChangeListener 可以工作。但这不是我想要的。

有什么建议,如何实现这一目标?还有其他有用的 api 吗?

问候

最佳答案

这对于 Selenium/Webdriver 来说并不是一件容易的事。我做了一些非常类似的事情并让它发挥作用(我很快就会发布它)。基础知识是 JavaScript 事件处理程序和从 Java 轮询数据。

JavaScript:

var events = [];
var eventQueue = [];
var eventHistory = {};
var processing = false;

var nativeEvents = {
'submit': 'HTMLEvents',
'keypress': 'KeyEvents',
'click': 'MouseEvents',
'dblclick': 'MouseEvents',
'dragstart': 'MouseEvents',
'dragend': 'MouseEvents',
}

for(var eventName in nativeEvents) {
document.addEventListener(eventName, processEvent, true);
};

processEvent = function(event) {
if(event.triggeredManually) {
return true;
}
if(event.type in nativeEvents) {
storeEvent(event);
event.stopPropagation();
event.preventDefault();
return false;
}
}
storeEvent = function(event) {
ev = convertEvent(event);
if(processing) {
eventQueue.push(ev);
} else {
events.push(ev);
}
}

convertEvent = function(event) {
var ev = {};
var id = new Date().getTime() + ":" + Math.random();
ev['id'] = id;
ev['type'] = event.type;
ev['target'] = event.target;
ev['button'] = event.button;
ev['charCode'] = event.charCode;
ev['keyCode'] = event.keyCode;
ev['altKey'] = event.altKey;
ev['ctrlKey'] = event.ctrlKey;
ev['shiftKey'] = event.shiftKey;
ev['clientX'] = event.clientX;
ev['clientY'] = event.clientY;
ev['offsetX'] = event.offsetX;
ev['offsetY'] = event.offsetY;
eventHistory[id] = ev;
return ev;
}

这些函数用于检测和存储用户事件。需要以下代码来检索 Java 中的事件并随后发送事件。这是页面卸载所必需的,因为 unload 事件并非在每个浏览器中都能安全工作。

getEvents = function() {
processing = true;
events = events.concat(eventQueue);
eventQueue = [];
setTimeout(resetEvents, 10);
return events;
};

resetEvents = function() {
events = [];
processing = false;
};

triggerEvents = function(idsAsJson) {
// trigger pending events
var ids = JSON.parse(idsAsJson);
for (var i = 0; i < ids.length; i++) {
var event = eventHistory[ids[i]];
if(event) {
var evObj = null;
var evObjType = null;
var bubbling = true;
var cancelable = false;

if(event['type'] in nativeEvents) {
evObjType = nativeEvents[event['type']];
evObj = document.createEvent(evObjType);

// more info: http://www.howtocreate.co.uk/tutorials/javascript/domevents
if(evObjType == 'KeyEvents') {
evObj.initKeyEvent(event['type'], bubbling, cancelable, window, event['ctrlKey'], event['altKey'], event['shiftKey'], false, event['keyCode'], event['charCode']);
} else if(evObjType == 'MouseEvents') {
evObj.initMouseEvent(event['type'], bubbling, cancelable, window, 1, event['offsetX'], event['offsetY'], event['clientX'], event['clientY'], event['ctrlKey'], event['altKey'], event['shiftKey'], false, event['button'], null);
} else {
evObj.initEvent(event['type'], bubbling, cancelable);
}
evObj.triggeredManually = true;
event['target'].dispatchEvent(evObj);
}
}
}

};

然后您需要循环遍历 getEvents() 函数的 Java 代码,这样您就可以存储您需要的任何内容。之后,您需要执行 triggerEvents() 函数以处理用户交互。

关于java - 如何通过Java代码捕获用户在浏览器上的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com