Specflow селен вебдрайвер, перетаскивание не работает - PullRequest
0 голосов
/ 03 мая 2020

Я попытался реализовать функцию перетаскивания элементов html всеми следующими способами. Но никто из них не работает для меня. Это. net каркасный проект с последней версией specflow.

1 way

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

2 way

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

3 пути

  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();

И я сею, что перетаскивание является известной проблемой селена и это можно решить с помощью реализации JavaScript. Не знаю, что это такое.

Может кто-нибудь предложить мне решение.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы можете попробовать эту версию.

Определить источник и пункт назначения.

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; } }
    }
0 голосов
/ 04 мая 2020

Вы можете попробовать использовать 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);
...