javascript - Selenium:使用 C# 在 IWebElement 上触发鼠标滚轮

标签 javascript c# selenium mousewheel

描述:显示在屏幕上的 HTML 元素(矩形)的复杂结构,没有重叠,每个矩形具有不同的 HTML id 属性(因此可由 Selenium IWebDriver 和 C# 代码选择)。

目标:我需要以编程方式使用 Selenium 和 C# 在选定矩形元素上创建和触发鼠标滚轮事件(通过 IJavaScriptExecutor 或其他一些方法)。

问:如何做到这一点?谢谢

最佳答案

这是我调查后的实现

//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;
     }
 }

关于javascript - Selenium:使用 C# 在 IWebElement 上触发鼠标滚轮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41471422/

相关文章:

c# - 将 TextBox 的值填充到特定的 Textbox

c# - 在C#中读取用C格式化的文件

java - 为什么我必须通过 xpath 显式搜索 Selenium 中的相关元素?

javascript - 使用 CSS3 过渡时等效于 jQuery.animate 步进函数

javascript - 在模式窗口中选择已安装的证书

javascript - JQUERY/JavaScript - 正则表达式之后的所有内容,包括第 3 次出现的字符

javascript - Selenium Webdriver for 循环打开许多浏览器,不等待函数完成

javascript - 将递归函数转换为 while 循环

c# - 混合 javascript 和内联服务器代码

cssSelector 的 Selenium WebDriver 问题