2014-01-21 51 views
3

我使用下面的拖放代码将图片拖入照片场。这在InternetExplorer中运行正常,但在Firefox或Chrome中不起作用。 我不明白为什么不。Selenium在Chrome或Firefox中拖放不起作用

正如你在下面的代码中看到的,我尝试了很多不同的方式来进行拖放操作,但是它们都不起作用。 主要问题是释放图像后目标未更新。 我看到下降发生,但没有更新。

有没有人有任何想法,为什么这是?我使用C#和最新的Selenium驱动程序2.39,Chrome驱动程序2.8。

public static void DoDragAndDrop(IWebDriver driver, string dragImageId, string dropFieldId) 
    { 
     Console.WriteLine("Drag and drop image '{0}' to the editor {1}..", dragImageId, dropFieldId); 
     IWebElement dragElement = WebDriverExtensions.TryFindElement(By.Id(dragImageId)); 
     IWebElement dropElement = WebDriverExtensions.TryFindElement(By.Id(dropFieldId)); 

     if(dragElement == null) 
      Console.WriteLine("dragElement is null"); 
     if(dropElement == null) 
      Console.WriteLine("dropElement is null"); 

     ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView();", dragElement); 
     Thread.Sleep(500); 

     ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView();", dropElement); 
     Thread.Sleep(200); 

     Console.WriteLine("Drag and drop 1"); 
     var builder1 = new Actions(driver); 
     builder1.MoveToElement(dragElement).ClickAndHold(); 
     builder1.MoveToElement(dropElement).Build().Perform(); 
     Thread.Sleep(2000); 

     Console.WriteLine("Drag and drop 2"); 
     var builder2 = new Actions(driver); 
     builder2.DragAndDrop(dragElement, dropElement); 
     Thread.Sleep(2000); 

     Console.WriteLine("Drag and drop 3"); 
     var builder3 = new Actions(driver); 
     builder3.DragAndDrop(dragElement, dropElement).Build().Perform(); 
     IAction dragAndDrop = builder3.ClickAndHold(dragElement) 
      .MoveToElement(dropElement) 
      .Release(dropElement) 
      .Build(); 
     dragAndDrop.Perform(); 
     Thread.Sleep(2000); 


     Thread.Sleep(1000); 
     Console.WriteLine("Drag and drop succeeded.."); 
    } 

回答

6

这是怎么了,我得到了它在Firefox的工作现在。 Chrome仍然失败。 唯一的区别是我在MoveToElement方法中添加了偏移量,如Rookies评论所示。

var builder = new Actions(driver); 
     builder.ClickAndHold(dragElement); 
     builder.MoveToElement(dropElement, 5, 5); 
     builder.Perform(); 
     Thread.Sleep(250); 
     builder.Release(dropElement); 
     builder.Perform(); 
+0

这个固定为我在Chrome v55.0.2。出于某种原因,元素现在消失,但至少会拖拽元素。 – KthProg

+1

一旦我从builder.release()中删除元素,一切都很完美。 – KthProg

0

对于Firefox,你可以使用下面的却是红宝石

panel = driver.find_element(:id, ' (panel around the picture)') 
    target = panel.find_element(:xpath, ' ') 
    source = panel.find_element(:xpath, ' ') 
    driver.action.click_and_hold(source).move_to(target, 400, 150).release(target).perform 

希望它可以帮助

2

试用下面的示例代码与chromedriver:2.15,铬:V43和正常工作正常。

示例代码:

System.setProperty("webdriver.chrome.driver","drivers/chromedriver.exe"); 
    WebDriver driver = new ChromeDriver(); 
    driver.manage().timeouts().implicitlyWait(1,TimeUnit.MINUTES); 
    driver.get("http://jqueryui.com/droppable"); 

    driver.switchTo().frame(0); 
    WebElement dragElement = driver.findElement(By.id("draggable")); 
    WebElement dropElement = driver.findElement(By.id("droppable")); 
    Actions builder = new Actions(driver); 
    builder.clickAndHold(dragElement).moveToElement(dropElement).release().build().perform(); 
0

ChromeDriver尚不支持的操作命令。 Java 语言绑定将Actions请求转换为对应的 鼠标事件,然后将它们发送给ChromeDriver,但没有 保证翻译后的鼠标事件完全等同于原始Actions请求的 。

来源:Chromium bugtacker

相关问题