Это непростая задача с 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);
}
}
}
};
Затем вам нужен код Java, который зацикливается на функции getEvents()
, и вы можете хранить все, что вам нужно. После этого вам нужно выполнить функцию triggerEvents()
, чтобы обработать взаимодействия с пользователем.