【问题标题】:Specflow selenium webdriver, drag and drop not workingSpecflow selenium webdriver,拖放不起作用
【发布时间】:2020-05-03 16:28:10
【问题描述】:

我尝试通过以下所有方式实现 html 元素的拖放功能。但它们都不适合我。 这是具有最新 specflow 版本的 .net 框架项目。

一种方式

var actions = new Actions(Context.WebDriver);
 actions.DragAndDrop(elementDrag, destination).Release(elementDrag).Build().Perform();

2路

actions.MoveToElement(elementDrag, 10, 10, MoveToElementOffsetOrigin.Center)
.ClickAndHold(elementDrag)
   .MoveByOffset(5, 5)
   .MoveToElement(destination)
   .Release(elementDrag)
   .Build()
   .Perform();

三路

  actions.MoveToElement(elementDrag, 10, 10, MoveToElementOffsetOrigin.Center)
    .ClickAndHold()
    .MoveByOffset(50, -300)
    .Release(elementDrag)
    .Build()
    .Perform();

4路

 actions.ClickAndHold(elementDrag).Build().Perform();
 Thread.Sleep(3000);
 actions.MoveToElement(destination).Build().Perform();
 actions.Release(destination).Build().Perform();

我认为拖放是 selenium 的一个已知问题,它可以通过使用 javasript 实现来解决。不知道那是什么。

谁能给我一个解决方案。

【问题讨论】:

  • @GregBurghardt 我尝试了这两种方式。 JavaScript 函数正在执行。但是拖放不起作用。
  • 您使用的是哪种浏览器、浏览器版本、网络驱动程序和网络驱动程序版本?
  • Chrome浏览器最新版、Specflow最新版、Chrome驱动最新版。这是一个 .net 框架项目。

标签: c# selenium selenium-webdriver bdd specflow


【解决方案1】:

你可以试试这个版本。

确定来源和目的地。

var ele1 = Browser.FindElement(By.Xpath("//div[@class='myDragableItem")); 
var ele2 = Browser.FindElement(By.Xpath("//div[@class='myDestination"));


DragAndDrop(ele1, ele2);



        public static void DragAndDrop(IWebElement element1, IWebElement element2)
    {
        WaitForElementEnabled(element1);
        WaitForElementEnabled(element2);
        var builder = new Actions(driver);
        var dragAndDrop = builder.ClickAndHold(element1).MoveToElement(element2).Release(element1).Build();
        dragAndDrop.Perform();
    }

    public static void WaitForElementEnabled(IWebElement element)
    {
        try { _wait.Until(webDriver => element.Enabled); }
        catch (StaleElementReferenceException) { if (!WaitForNotFoundElement_Enabled(element)) throw; } }
    }

【讨论】:

  • WaitForElementEnabled 方法的主体是什么?
  • 您只需要识别源和目标并传递值即可。我在 C# 中有几个解决方案。如果不明显,您可能需要使用目标路径才能正确处理。
  • 当我进行拖动时,我的源和目标已加载。尝试了此代码,但对我不起作用。
  • 您的网站是否公开,我们可以访问?通常,这不起作用的原因是特定元素必须是源和目标。由于这些示例都不适合您,看来问题可能出在您使用的方面?
  • Janith - 我读到 HTML5 在拖放方面造成了一些麻烦。我发现这可能会有所帮助 - testautomatisierung.org/…
【解决方案2】:

您可以尝试使用 JavaScriptExecutor

IWebElement source= driver.FindElement(By.Id(selector));
IWebElement destination= driver.FindElement(By.Id(selector));
string java_script =
       "var src=arguments[0],tgt=arguments[1];var dataTransfer={dropEffe" +
       "ct:'',effectAllowed:'all',files:[],items:{},types:[],setData:fun" +
       "ction(format,data){this.items[format]=data;this.types.push(for" +
       "mat);},getData:function(format){return this.items[format];},clea" +
       "rData:function(format){}};var emit=function(event,target){var ev" +
       "t=document.createEvent('Event');evt.initEvent(event,true,false);" +
       "evt.dataTransfer=dataTransfer;target.dispatchEvent(evt);};emit('" +
       "dragstart',src);emit('dragenter',tgt);emit('dragover',tgt);emit(" +
       "'drop',tgt);emit('dragend',src);";
        IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
        js.ExecuteScript(java_script, source, destination);

【讨论】:

  • 您是否使用 XPath 作为选择器?如果是,请将 FindElement(By.Id(selector)) 替换为 FindElement(By.Xpath(selector)) 并尝试一下。
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2017-01-19
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多