Path: blob/trunk/dotnet/test/common/Interactions/DragAndDropTest.cs
2868 views
// <copyright file="DragAndDropTest.cs" company="Selenium Committers"> // Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The SFC licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. // </copyright> using NUnit.Framework; using OpenQA.Selenium.Environment; using System; using System.Drawing; using System.Text.RegularExpressions; namespace OpenQA.Selenium.Interactions; [TestFixture] public class DragAndDropTest : DriverTestFixture { [SetUp] public void SetupTest() { IActionExecutor actionExecutor = driver as IActionExecutor; if (actionExecutor != null) { actionExecutor.ResetInputState(); } } [Test] public void DragAndDropRelative() { driver.Url = dragAndDropPage; IWebElement img = driver.FindElement(By.Id("test1")); Point expectedLocation = Drag(img, img.Location, 150, 200); Assert.That(img.Location, Is.EqualTo(expectedLocation)); expectedLocation = Drag(img, img.Location, -50, -25); Assert.That(img.Location, Is.EqualTo(expectedLocation)); expectedLocation = Drag(img, img.Location, 0, 0); Assert.That(img.Location, Is.EqualTo(expectedLocation)); expectedLocation = Drag(img, img.Location, 1, -1); Assert.That(img.Location, Is.EqualTo(expectedLocation)); } [Test] public void DragAndDropToElement() { driver.Url = dragAndDropPage; IWebElement img1 = driver.FindElement(By.Id("test1")); IWebElement img2 = driver.FindElement(By.Id("test2")); Actions actionProvider = new Actions(driver); actionProvider.DragAndDrop(img2, img1).Perform(); Assert.That(img2.Location, Is.EqualTo(img1.Location)); } [Test] public void DragAndDropToElementInIframe() { driver.Url = iframePage; IWebElement iframe = driver.FindElement(By.TagName("iframe")); ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].src = arguments[1]", iframe, dragAndDropPage); driver.SwitchTo().Frame(0); IWebElement img1 = WaitFor<IWebElement>(() => { try { IWebElement element1 = driver.FindElement(By.Id("test1")); return element1; } catch (NoSuchElementException) { return null; } }, "Element with ID 'test1' not found"); IWebElement img2 = driver.FindElement(By.Id("test2")); new Actions(driver).DragAndDrop(img2, img1).Perform(); Assert.That(img2.Location, Is.EqualTo(img1.Location)); } [Test] public void DragAndDropElementWithOffsetInIframeAtBottom() { driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("iframeAtBottom.html"); IWebElement iframe = driver.FindElement(By.TagName("iframe")); driver.SwitchTo().Frame(iframe); IWebElement img1 = driver.FindElement(By.Id("test1")); Point initial = img1.Location; new Actions(driver).DragAndDropToOffset(img1, 20, 20).Perform(); initial.Offset(20, 20); Assert.That(img1.Location, Is.EqualTo(initial)); } [Test] [IgnoreBrowser(Browser.Chrome, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.Edge, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.Firefox, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.IE, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.Safari, "Moving outside of view port throws exception in spec-compliant driver")] public void DragAndDropElementWithOffsetInScrolledDiv() { if (TestUtilities.IsFirefox(driver) && TestUtilities.IsNativeEventsEnabled(driver)) { return; } driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("dragAndDropInsideScrolledDiv.html"); IWebElement el = driver.FindElement(By.Id("test1")); Point initial = el.Location; new Actions(driver).DragAndDropToOffset(el, 3700, 3700).Perform(); initial.Offset(3700, 3700); Assert.That(el.Location, Is.EqualTo(initial)); } [Test] public void ElementInDiv() { driver.Url = dragAndDropPage; IWebElement img = driver.FindElement(By.Id("test3")); Point startLocation = img.Location; Point expectedLocation = Drag(img, startLocation, 100, 100); Point endLocation = img.Location; Assert.That(endLocation, Is.EqualTo(expectedLocation)); } [Test] public void DragTooFar() { driver.Url = dragAndDropPage; IWebElement img = driver.FindElement(By.Id("test1")); // Dragging too far left and up does not move the element. It will be at // its original location after the drag. Point originalLocation = new Point(0, 0); Actions actionProvider = new Actions(driver); Assert.That(() => actionProvider.DragAndDropToOffset(img, 2147480000, 2147400000).Perform(), Throws.InstanceOf<WebDriverException>()); new Actions(driver).Release().Perform(); } [Test] [IgnoreBrowser(Browser.Chrome, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.Edge, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.Firefox, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.IE, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.Safari, "Moving outside of view port throws exception in spec-compliant driver")] public void ShouldAllowUsersToDragAndDropToElementsOffTheCurrentViewPort() { Size originalSize = driver.Manage().Window.Size; Size testSize = new Size(300, 300); driver.Url = dragAndDropPage; driver.Manage().Window.Size = testSize; try { driver.Url = dragAndDropPage; IWebElement img = driver.FindElement(By.Id("test3")); Point expectedLocation = Drag(img, img.Location, 100, 100); Assert.That(img.Location, Is.EqualTo(expectedLocation)); } finally { driver.Manage().Window.Size = originalSize; } } [Test] public void DragAndDropOnJQueryItems() { driver.Url = droppableItems; IWebElement toDrag = driver.FindElement(By.Id("draggable")); IWebElement dropInto = driver.FindElement(By.Id("droppable")); // Wait until all event handlers are installed. System.Threading.Thread.Sleep(500); Actions actionProvider = new Actions(driver); actionProvider.DragAndDrop(toDrag, dropInto).Perform(); string text = dropInto.FindElement(By.TagName("p")).Text; DateTime endTime = DateTime.Now.Add(TimeSpan.FromSeconds(15)); while (text != "Dropped!" && (DateTime.Now < endTime)) { System.Threading.Thread.Sleep(200); text = dropInto.FindElement(By.TagName("p")).Text; } Assert.That(text, Is.EqualTo("Dropped!")); IWebElement reporter = driver.FindElement(By.Id("drop_reports")); // Assert that only one mouse click took place and the mouse was moved // during it. string reporterText = reporter.Text; Assert.That(reporterText, Does.Match("start( move)* down( move)+ up")); Assert.That(Regex.Matches(reporterText, "down"), Has.Count.EqualTo(1), "Reporter text:" + reporterText); Assert.That(Regex.Matches(reporterText, "up"), Has.Count.EqualTo(1), "Reporter text:" + reporterText); Assert.That(reporterText, Does.Contain("move")); } [Test] [IgnoreBrowser(Browser.Firefox, "Moving outside of view port throws exception in spec-compliant driver")] [IgnoreBrowser(Browser.IE, "Moving outside of view port throws exception in spec-compliant driver")] public void CanDragAnElementNotVisibleInTheCurrentViewportDueToAParentOverflow() { driver.Url = dragDropOverflowPage; IWebElement toDrag = driver.FindElement(By.Id("time-marker")); IWebElement dragTo = driver.FindElement(By.Id("11am")); Point srcLocation = toDrag.Location; Point targetLocation = dragTo.Location; int yOffset = targetLocation.Y - srcLocation.Y; Assert.That(yOffset, Is.Not.Zero); new Actions(driver).DragAndDropToOffset(toDrag, 0, yOffset).Perform(); Assert.That(toDrag.Location, Is.EqualTo(dragTo.Location)); } //------------------------------------------------------------------ // Tests below here are not included in the Java test suite //------------------------------------------------------------------ [Test] public void DragAndDropRelativeAndToElement() { driver.Url = dragAndDropPage; IWebElement img1 = driver.FindElement(By.Id("test1")); IWebElement img2 = driver.FindElement(By.Id("test2")); Actions actionProvider = new Actions(driver); actionProvider.DragAndDropToOffset(img1, 100, 100).Perform(); actionProvider.Reset(); actionProvider.DragAndDrop(img2, img1).Perform(); Assert.That(img2.Location, Is.EqualTo(img1.Location)); } private Point Drag(IWebElement elem, Point initialLocation, int moveRightBy, int moveDownBy) { Point expectedLocation = new Point(initialLocation.X, initialLocation.Y); expectedLocation.Offset(moveRightBy, moveDownBy); Actions actionProvider = new Actions(driver); actionProvider.DragAndDropToOffset(elem, moveRightBy, moveDownBy).Perform(); return expectedLocation; } }