Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Specflow selenium webdriver,拖放不工作_C#_Selenium_Selenium Webdriver_Bdd_Specflow - Fatal编程技术网

C# Specflow selenium webdriver,拖放不工作

C# Specflow selenium webdriver,拖放不工作,c#,selenium,selenium-webdriver,bdd,specflow,C#,Selenium,Selenium Webdriver,Bdd,Specflow,我尝试用以下所有方法实现html元素的拖放功能。但他们都不为我工作。 这是具有最新specflow版本的.net framework项目 1路 var actions = new Actions(Context.WebDriver); actions.DragAndDrop(elementDrag, destination).Release(elementDrag).Build().Perform(); actions.MoveToElement(elementDrag, 10, 10, M

我尝试用以下所有方法实现html元素的拖放功能。但他们都不为我工作。 这是具有最新specflow版本的.net framework项目

1路

var actions = new Actions(Context.WebDriver);
 actions.DragAndDrop(elementDrag, destination).Release(elementDrag).Build().Perform();
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();
2路

var actions = new Actions(Context.WebDriver);
 actions.DragAndDrop(elementDrag, destination).Release(elementDrag).Build().Perform();
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();
3路

var actions = new Actions(Context.WebDriver);
 actions.DragAndDrop(elementDrag, destination).Release(elementDrag).Build().Perform();
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实现来解决。不知道那是什么


谁能给我一个解决方案。

你可以试试这个版本

确定来源和目的地

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

您可以尝试使用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);

这回答了你的问题吗@GregBurghardt我都试过了。JavaScript函数正在执行。但拖放不起作用。您使用的浏览器、浏览器版本、web驱动程序和web驱动程序版本是什么?Chrome浏览器最新版本、Specflow最新版本、Chrome驱动程序最新版本。这是一个.net framework项目。WaitForElementEnabled方法的主体是什么?您只需要标识源和目标,然后传递值。我在C#中研究了几个解决方案。如果目标路径不明显,您可能需要对其进行操作以使其正确。我的源和目标在拖动时已加载。已尝试此代码,但对我不起作用。您的网站是公共的,我们可以访问吗?通常,这不起作用的原因是特定元素必须是源和目标。因为这些例子都不适合你,所以看起来问题可能在于你在使用什么?Janith-我读到HTML5在拖放方面造成了一些麻烦。我发现这可能会有所帮助-您是否使用XPath作为选择器?如果是,请将FindElement(By.Id(selector))替换为FindElement(By.XPath(selector)),然后再试一次。