简体   繁体   English

硒:使用C#在IWebElement上触发鼠标滚轮

[英]Selenium: Trigger mousewheel on an IWebElement with C#

Description: A complex structure of HTML elements (rectangles) displayed on the screen, no overlaps, each rectangle having a distinct HTML id attribute (hence pickable by Selenium IWebDriver and C# code). 说明:屏幕上显示的HTML元素(矩形)的复杂结构,没有重叠,每个矩形都有不同的HTML id属性(因此可以由Selenium IWebDriver和C#代码选择)。

Target: I need programatically with Selenium and C# to create and trigger mousewheel event (via IJavaScriptExecutor or some other methods) on a selected rectangle element. 目标:我需要以编程方式使用Selenium和C#在选定的矩形元素上创建和触发鼠标滚轮事件(通过IJavaScriptExecutor或其他方法)。

Q: How this can be done? 问:该怎么做? Thank you 谢谢

This is my implementation after investigating 这是我调查后的实现

//wheelTicks: negative for zoomin, positive to zoomout 
public object zoomElementById(string elemId, int wheelTicks=1)
{
     object response = null;

     string myJavaScript =

            // Callback (place in first!) used to notify the caller that the async callee is ready
            "  var callback = arguments[arguments.length - 1];                                           " +
            "  var maxIntervals = arguments[1];                                                          " +
            //ms
            "  var intervalDuration = 150;                                                               " +
            "  console.log('javascripting...', callback, arguments);                                     " +

            "var d = new Date();                                                                         " +
            "var n = d.getTime();                                                                        " +

            "  var myZoomCenterElement = document.getElementById('" + elemId + "');                      " +
            // some debug output in the console 
            "  console.log(myZoomCenterElement);                                                         " +

            // *** THE CORE OF THE SOLUTION *** Creates proper WheelEvent object and triggers WheelEvent(Zoom)   
            "  var box = myZoomCenterElement.getBoundingClientRect();                                    " +    
            "  var boxMiddleX = Math.round((box.right + box.left )/2);                                   " +    
            "  var boxMiddleY = Math.round((box.bottom + box.top )/2);                                   " +
            "  var myWheelableElement = document.getElementsByClassName('svg-tree-view')[0];             " +
            "  var wheelEventInitDict = {                                                                " +
            "               'deltaX'    :      0.0,                                                      " +
            "               'deltaY'    :   -200.0,                                                      " +
            "               'deltaZ'    :      0.0,                                                      " +
            "               'deltaMode' :        0,                                                      " +
            "               'clientX'   :        boxMiddleX,                                             " +
            "               'clientY'   :        boxMiddleY                                              " +
            "               };                                                                           " +
            "  var myWheelEvent = new WheelEvent('wheel', wheelEventInitDict);                           " +
            "  console.log(wheelEventInitDict, boxMiddleX, boxMiddleY, myWheelEvent);                    " +

            " var myIntervalCounter = 0;                                                                 " +
            " var myInterval = setInterval(function(){                                                   " +
            "                    myWheelableElement.dispatchEvent(myWheelEvent);                         " +
            "                    myIntervalCounter++;                                                    " +
            "                    if (myIntervalCounter > maxIntervals) clearInterval(myInterval);        " +
            "                }, intervalDuration);                                                       " +

            " var sthToReturn = 'Returning: Nothing requested!';                                         " +
            " var asyncAwaitInMiliSeconds = Math.ceil( 1.2 * intervalDuration * maxIntervals );          " +

            // Triggers the callback (to indicate async ready) 
            " setTimeout( function(){                                                                    " +
            "                       console.log((new Date()).getTime()-n);                               " +
            "                       callback(sthToReturn);                                               " +
            "           }, asyncAwaitInMiliSeconds);                                                     " +

            ""
            ;
     _driver.Manage().Timeouts().SetScriptTimeout(new TimeSpan(0, 0, 20));

     IJavaScriptExecutor js = _driver as IJavaScriptExecutor;
     try
     {
            // addititonal args(optional) to be sent to the javascript func are put after the first arg 
            return response = js.ExecuteAsyncScript(myJavaScript, elemId, wheelTicks);

     }
     catch(UnhandledAlertException e)
     {
            Console.WriteLine("Error Occured! \n {0}", e.ToString() );
            return null;
     }
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM