Selenium WebDriver C#.NET 拖放测试抛出异常错误

问题描述 投票:0回答:1

我使用了动作类的拖放选项。

Actions action = new Actions(driver);
     IWebElement source = driver.FindElement(By.XPath("(//span[@class='fa fa-bars fa-lg'])[1]"));
     IWebElement dest= driver.FindElement(By.XPath("(//span[@class='fa fa-bars fa-lg'])[2]"));
     action.DragAndDrop(source,dest).Build().Perform();

但得到以下异常错误。

消息:OpenQA.Selenium.WebDriverException:javascript error:javascript error:。 OpenQA.Selenium.WebDriverException : javascript error: Failed to execute 'elementsFromPoint' on 'Document': 提供的双值是非无限的。

堆栈跟踪:OpenQA.Selenium.WebDriverException : javascript错误:在'Document'上执行'elementsFromPoint'失败:提供的双值是非无限的。 RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)RemoteWebDriver.Execute(String driverCommandToExecute,Dictionary2 parameters) RemoteWebDriver.PerformActions(IList1动作序列列表) Actions.Perform()

c# selenium-webdriver nunit
1个回答
0
投票

我设法解决了这个问题,如下。希望这对将来的人有帮助。https:/www.testautomatisierung.orgdrag-drop-fuer-html-5-elemente-mit-selenium

using OpenQA.Selenium;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RCS.Tests.Common
{
    class DragDropHelper
    {
        public enum Position
        {
            Top_Left,
            Top,
            Top_Right,
            Left,
            Center,
            Right,
            Bottom_Left,
            Bottom,
            Bottom_Right
        }

        public static int getX(Position pos, int width)
        {
            if (Position.Top_Left.Equals(pos) || Position.Left.Equals(pos) || Position.Bottom_Left.Equals(pos))
            {
                return 1;
            }
            else if (Position.Top.Equals(pos) || Position.Center.Equals(pos) || Position.Bottom.Equals(pos))
            {
                return width / 2;
            }
            else if (Position.Top_Right.Equals(pos) || Position.Right.Equals(pos) || Position.Bottom_Right.Equals(pos))
            {
                return width - 30;
            }
            else
            {
                return 0;
            }
        }

        static int getY(Position pos, int height)
        {
            if (Position.Top_Left.Equals(pos) || Position.Top.Equals(pos) || Position.Top_Right.Equals(pos))
            {
                return 20;
            }
            else if (Position.Left.Equals(pos) || Position.Center.Equals(pos) || Position.Right.Equals(pos))
            {
                return height / 2;
            }
            else if (Position.Bottom_Left.Equals(pos) || Position.Bottom.Equals(pos) || Position.Bottom_Right.Equals(pos))
            {
                return height - 1;
            }
            else
            {
                return 0;
            }
        }

        private static string javaScriptEventSimulator = "" +
            /* Creates a drag event */
            "function createDragEvent(eventName, options)\r\n" +
            "{\r\n" +
            "var event = document.createEvent('HTMLEvents');\r\n" +
            "event.initEvent('DragEvent', true, true);\r\n" +
            //" var event = document.createEvent(\"DragEvent\");\r\n" +
            "   var screenX = window.screenX + options.clientX;\r\n" +
            "   var screenY = window.screenY + options.clientY;\r\n" +
            "   var clientX = options.clientX;\r\n" +
            "   var clientY = options.clientY;\r\n" +
            "   var dataTransfer = {\r\n" +
            "       data: options.dragData == null ? {} : options.dragData,\r\n" +
            "       setData: function(eventName, val){\r\n" +
            "           if (typeof val === 'string') {\r\n" +
            "               this.data[eventName] = val;\r\n" +
            "           }\r\n" +
            "       },\r\n" +
            "       getData: function(eventName){\r\n" +
            "           return this.data[eventName];\r\n" +
            "       },\r\n" +
            "       clearData: function(){\r\n" +
            "           return this.data = {};\r\n" +
            "       },\r\n" +
            "       setDragImage: function(dragElement, x, y) {}\r\n" +
            "   };\r\n" +
            "   var eventInitialized=false;\r\n" +
            "   if (event != null && event.initDragEvent) {\r\n" +
            "       try {\r\n" +
            "           event.initDragEvent(eventName, true, true, window, 0, screenX, screenY, clientX, clientY, false, false, false, false, 0, null, dataTransfer);\r\n" +
            "           event.initialized=true;\r\n" +
            "       } catch(err) {\r\n" +
            "           // no-op\r\n" +
            "       }\r\n" +
            "   }\r\n" +
            "   if (!eventInitialized) {\r\n" +
            "       event = document.createEvent(\"CustomEvent\");\r\n" +
            "       event.initCustomEvent(eventName, true, true, null);\r\n" +
            "       event.view = window;\r\n" +
            "       event.detail = 0;\r\n" +
            "       event.screenX = screenX;\r\n" +
            "       event.screenY = screenY;\r\n" +
            "       event.clientX = clientX;\r\n" +
            "       event.clientY = clientY;\r\n" +
            "       event.ctrlKey = false;\r\n" +
            "       event.altKey = false;\r\n" +
            "       event.shiftKey = false;\r\n" +
            "       event.metaKey = false;\r\n" +
            "       event.button = 0;\r\n" +
            "       event.relatedTarget = null;\r\n" +
            "       event.dataTransfer = dataTransfer;\r\n" +
            "   }\r\n" +
            "   return event;\r\n" +
            "}\r\n" +

            /* Creates a mouse event */
            "function createMouseEvent(eventName, options)\r\n" +
            "{\r\n" +
            "   var event = document.createEvent(\"MouseEvent\");\r\n" +
            "   var screenX = window.screenX + options.clientX;\r\n" +
            "   var screenY = window.screenY + options.clientY;\r\n" +
            "   var clientX = options.clientX;\r\n" +
            "   var clientY = options.clientY;\r\n" +
            "   if (event != null && event.initMouseEvent) {\r\n" +
            "       event.initMouseEvent(eventName, true, true, window, 0, screenX, screenY, clientX, clientY, false, false, false, false, 0, null);\r\n" +
            "   } else {\r\n" +
            "       event = document.createEvent(\"CustomEvent\");\r\n" +
            "       event.initCustomEvent(eventName, true, true, null);\r\n" +
            "       event.view = window;\r\n" +
            "       event.detail = 0;\r\n" +
            "       event.screenX = screenX;\r\n" +
            "       event.screenY = screenY;\r\n" +
            "       event.clientX = clientX;\r\n" +
            "       event.clientY = clientY;\r\n" +
            "       event.ctrlKey = false;\r\n" +
            "       event.altKey = false;\r\n" +
            "       event.shiftKey = false;\r\n" +
            "       event.metaKey = false;\r\n" +
            "       event.button = 0;\r\n" +
            "       event.relatedTarget = null;\r\n" +
            "   }\r\n" +
            "   return event;\r\n" +
            "}\r\n" +

            /* Runs the events */
            "function dispatchEvent(webElement, eventName, event)\r\n" +
            "{\r\n" +
            "   if (webElement.dispatchEvent) {\r\n" +
            "       webElement.dispatchEvent(event);\r\n" +
            "   } else if (webElement.fireEvent) {\r\n" +
            "       webElement.fireEvent(\"on\"+eventName, event);\r\n" +
            "   }\r\n" +
            "}\r\n" +

            /* Simulates an individual event */
            "function simulateEventCall(element, eventName, dragStartEvent, options) {\r\n" +
            "   var event = null;\r\n" +
            "   if (eventName.indexOf(\"mouse\") > -1) {\r\n" +
            "       event = createMouseEvent(eventName, options);\r\n" +
            "   } else {\r\n" +
            "       event = createDragEvent(eventName, options);\r\n" +
            "   }\r\n" +
            "   if (dragStartEvent != null) {\r\n" +
            "       event.dataTransfer = dragStartEvent.dataTransfer;\r\n" +
            "   }\r\n" +
            "   dispatchEvent(element, eventName, event);\r\n" +
            "   return event;\r\n" +
            "}\r\n";

        /**
         * Simulates an individual events
         */
        private static string simulateEvent = javaScriptEventSimulator +
                "function simulateEvent(element, eventName, clientX, clientY, dragData) {\r\n" +
                "   return simulateEventCall(element, eventName, null, {clientX: clientX, clientY: clientY, dragData: dragData});\r\n" +
                "}\r\n" +

                "var event = simulateEvent(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);\r\n" +
                "if (event.dataTransfer != null) {\r\n" +
                "   return event.dataTransfer.data;\r\n" +
                "}\r\n";

        /**
         * Simulates drag and drop
         */
        private static string simulateHTML5DragAndDrop = javaScriptEventSimulator +
                "function simulateHTML5DragAndDrop(dragFrom, dragTo, dragFromX, dragFromY, dragToX, dragToY) {\r\n" +
                "   var mouseDownEvent = simulateEventCall(dragFrom, \"mousedown\", null, {clientX: dragFromX, clientY: dragFromY});\r\n" +
                "   var dragStartEvent = simulateEventCall(dragFrom, \"dragstart\", null, {clientX: dragFromX, clientY: dragFromY});\r\n" +
                "   var dragEnterEvent = simulateEventCall(dragTo,   \"dragenter\", dragStartEvent, {clientX: dragToX, clientY: dragToY});\r\n" +
                "   var dragOverEvent  = simulateEventCall(dragTo,   \"dragover\",  dragStartEvent, {clientX: dragToX, clientY: dragToY});\r\n" +
                "   var dropEvent      = simulateEventCall(dragTo,   \"drop\",      dragStartEvent, {clientX: dragToX, clientY: dragToY});\r\n" +
                "   var dragEndEvent   = simulateEventCall(dragFrom, \"dragend\",   dragStartEvent, {clientX: dragToX, clientY: dragToY});\r\n" +
                "}\r\n" +
                "simulateHTML5DragAndDrop(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);\r\n";

        /**
         * Calls a drag event
         *
         * @param driver
         *            The WebDriver to execute on
         * @param dragFrom
         *            The WebElement to simulate on
         * @param eventName
         *            The event name to call
         * @param clientX
         *            The mouse click X position on the screen
         * @param clientY
         *            The mouse click Y position on the screen
         * @param data
         *            The data transfer data
         * @return The updated data transfer data
         */
        public static Object html5_simulateEvent(IWebDriver driver, IWebElement dragFrom, String eventName, int clientX, int clientY, Object data)
        {
            return ((IJavaScriptExecutor)driver).ExecuteScript(simulateEvent, dragFrom, eventName, clientX, clientY, data);
        }

        /**
         * Calls a drag event
         *
         * @param driver
         *            The WebDriver to execute on
         * @param dragFrom
         *            The WebElement to simulate on
         * @param eventName
         *            The event name to call
         * @param mousePosition
         *            The mouse click area in the element
         * @param data
         *            The data transfer data
         * @return The updated data transfer data
         */
        public static Object html5_simulateEvent(IWebDriver driver, IWebElement dragFrom, String eventName, Position mousePosition, Object data)
        {
            Point fromLocation = dragFrom.Location;
            Size fromSize = dragFrom.Size;

            // Get Client X and Client Y locations
            int clientX = fromLocation.X + (fromSize == null ? 0 : getX(mousePosition, fromSize.Width));
            int clientY = fromLocation.Y + (fromSize == null ? 0 : getY(mousePosition, fromSize.Height));

            return html5_simulateEvent(driver, dragFrom, eventName, clientX, clientY, data);
        }

        /**
         * Drags and drops a web element from source to target
         *
         * @param driver
         *            The WebDriver to execute on
         * @param dragFrom
         *            The WebElement to drag from
         * @param dragTo
         *            The WebElement to drag to
         * @param dragFromX
         *            The position to click relative to the top-left-corner of the
         *            client
         * @param dragFromY
         *            The position to click relative to the top-left-corner of the
         *            client
         * @param dragToX
         *            The position to release relative to the top-left-corner of the
         *            client
         * @param dragToY
         *            The position to release relative to the top-left-corner of the
         *            client
         */
        public static void html5_DragAndDrop(IWebDriver driver, IWebElement dragFrom, IWebElement dragTo, int dragFromX, int dragFromY, int dragToX, int dragToY)
        {
            ((IJavaScriptExecutor)driver).ExecuteScript(simulateHTML5DragAndDrop, dragFrom, dragTo, dragFromX, dragFromY, dragToX, dragToY);
        }

        /**
         * Drags and drops a web element from source to target
         *
         * @param driver
         *            The WebDriver to execute on
         * @param dragFrom
         *            The WebElement to drag from
         * @param dragTo
         *            The WebElement to drag to
         * @param dragFromPosition
         *            The place to click on the dragFrom
         * @param dragToPosition
         *            The place to release on the dragTo
         */
        public static void html5_DragAndDrop(IWebDriver driver, IWebElement dragFrom, IWebElement dragTo, Position dragFromPosition, Position dragToPosition)
        {
            Point fromLocation = dragFrom.Location;
            Point toLocation = dragTo.Location;
            Size fromSize = dragFrom.Size;
            Size toSize = dragTo.Size;

            // Get Client X and Client Y locations
            int dragFromX = fromLocation.X + (fromSize == null ? 0 : getX(dragFromPosition, fromSize.Width));
            int dragFromY = fromLocation.Y + (fromSize == null ? 0 : getY(dragFromPosition, fromSize.Height));
            int dragToX = toLocation.X + (toSize == null ? 0 : getX(dragToPosition, toSize.Width));
            int dragToY = toLocation.Y + (toSize == null ? 0 : getY(dragToPosition, toSize.Height));

            html5_DragAndDrop(driver, dragFrom, dragTo, dragFromX, dragFromY, dragToX, dragToY);
        }

        //-------------
        // Cross-Window Drag And Drop Example
        //-------------
        public static void dragToWindow(IWebDriver dragFromDriver, IWebElement dragFromElement, IWebDriver dragToDriver)
        {
            // Drag start
            html5_simulateEvent(dragFromDriver, dragFromElement, "mousedown", Position.Center, null);
            Object dragData = html5_simulateEvent(dragFromDriver, dragFromElement, "dragstart", Position.Center, null);
            dragData = html5_simulateEvent(dragFromDriver, dragFromElement, "dragenter", Position.Center, dragData);
            dragData = html5_simulateEvent(dragFromDriver, dragFromElement, "dragleave", Position.Left, dragData);
            dragData = html5_simulateEvent(dragFromDriver, dragFromDriver.FindElement(By.TagName("body")), "dragleave", Position.Left, dragData);

            // Drag to other window
            html5_simulateEvent(dragToDriver, dragToDriver.FindElement(By.TagName("body")), "dragenter", Position.Right, null);
            IWebElement dropOverlay = dragToDriver.FindElement(By.ClassName("DropOverlay"));
            html5_simulateEvent(dragToDriver, dropOverlay, "dragenter", Position.Right, null);
            html5_simulateEvent(dragToDriver, dropOverlay, "dragover", Position.Center, null);
            dragData = html5_simulateEvent(dragToDriver, dropOverlay, "drop", Position.Center, dragData);
            html5_simulateEvent(dragFromDriver, dragFromElement, "dragend", Position.Center, dragData);
        }

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.