如何使用selenium/javascript在jQuery handsontable上触发或“模拟”控制盘事件?

2024-05-23 20:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我的最终目标是能够滚动到handsontable的底部,并使用python/selenium脚本以编程方式(“手动”)添加一行数据(javascript也可以通过driver.execute_script(js_script)函数执行)。我不能只添加一行数据而不滚动,因为表中的所有元素只有滚动到视图中才会加载。我尝试了很多方法来避免使用jQuery函数(如$('selector').trigger(evt)和selenium ActionChains类)中的任何内容来使用anvil,但没有一种方法对我有效。理想情况下,我想这样做:

var e = jQuery.Event('wheel', {deltaY: 120}); 
$('#am-editor-table > div > div.wtHider > div.wtSpreader > table > tbody > tr:nth-child(1) > td:nth-child(2)').trigger(e);

但这也不行。(deltaY是wheel事件的属性,将其设置为正值会导致向下滚动。)下面是我正在使用的网站:https://live.amcharts.com/。只要创建一个图表,你就会看到我所说的表格。以下是处理handsontable上鼠标滚轮事件的处理程序的源代码,可以在google dev模式下使用事件侦听器断点找到该处理程序:

function handler(event) {
            var orgEvent = event || window.event, args = [].slice.call(arguments, 1), delta = 0, deltaX = 0, deltaY = 0, absDelta = 0, absDeltaXY = 0, fn;
            event = $.event.fix(orgEvent);
            event.type = "mousewheel";
            if (orgEvent.wheelDelta) {
                delta = orgEvent.wheelDelta;
            }
            if (orgEvent.detail) {
                delta = orgEvent.detail * -1;
            }
            if (orgEvent.deltaY) {
                deltaY = orgEvent.deltaY * -1;
                delta = deltaY;
            }
            if (orgEvent.deltaX) {
                deltaX = orgEvent.deltaX;
                delta = deltaX * -1;
            }
            if (orgEvent.wheelDeltaY !== undefined) {
                deltaY = orgEvent.wheelDeltaY;
            }
            if (orgEvent.wheelDeltaX !== undefined) {
                deltaX = orgEvent.wheelDeltaX * -1;
            }
            absDelta = Math.abs(delta);
            if (!lowestDelta || absDelta < lowestDelta) {
                lowestDelta = absDelta;
            }
            absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX));
            if (!lowestDeltaXY || absDeltaXY < lowestDeltaXY) {
                lowestDeltaXY = absDeltaXY;
            }
            fn = delta > 0 ? 'floor' : 'ceil';
            delta = Math[fn](delta / lowestDelta);
            deltaX = Math[fn](deltaX / lowestDeltaXY);
            deltaY = Math[fn](deltaY / lowestDeltaXY);
            args.unshift(event, delta, deltaX, deltaY);
            return ($.event.dispatch || $.event.handle).apply(this, args);
        }

老实说,我不知道handsontable在内部是如何工作的,它的文档也很差。我真的觉得我应该能够滚动一个特定的元素,而不必知道所有这些,但什么都不起作用,所以我刚刚进入了这个巨大的兔子洞。任何帮助都将不胜感激

谢谢, 杰克


Tags: diveventif事件mathhandsontablefndelta