2014-07-15 105 views
2

我想使用Robot框架自動拖拽功能。爲了做到這一點,我寫下面的代碼:無法拖拽使用機器人Selenium WebDriver使用機器人

WebDriver driver = new FirefoxDriver(); 
driver.get("http://the-internet.herokuapp.com/drag_and_drop"); 

WebElement source = driver.findElement(By.id("column-a")); 
WebElement target = driver.findElement(By.id("column-b")); 

Robot robot = new Robot(); 
robot.mouseMove(source.getLocation().getX() + (source.getSize().getWidth()/2), source.getLocation().getY() + (source.getSize().getHeight()/2)); 
robot.mousePress(InputEvent.BUTTON1_MASK); 
robot.mouseMove(target.getLocation().getX() + (target.getSize().getWidth()/2), target.getLocation().getY() + (target.getSize().getHeight()/2)); 
robot.mouseRelease(InputEvent.BUTTON1_MASK); 
Thread.sleep(3000); 

上面的代碼執行,我可以看到鼠標移動到源和目標,但拖放沒有發生。你能不能讓我知道我在這裏做錯了什麼?

+0

您添加了「robotframework」的標籤,但是這似乎沒有什麼可以做從robotframework.org機器人框架。 –

回答

0

您可以嘗試使用這種方法 - 以獲得源代碼,請與您的代碼嵌入此:

WebElement source = driver.findElement(By.xpath("//*[@id='column-a']")); 
    Locatable element = (Locatable)source; 
    Point p= element.getCoordinates().inViewPort(); 
    int sourceX=p.getX()+25;(25 can be increased or decreased accordingly) 
    int sourceY=p.getY()+120;(120 can be increased or decreased accordingly) 

對於目標,請與您的代碼嵌入此:

WebElement target = driver.findElement(By.id("column-b"));   
    Locatable elementTarget = (Locatable)target; 
    Point Target= elementTarget.getCoordinates().inViewPort(); 
    int targetX=Target.getX()+55; 
    int targetY=Target.getY()+150; 
+0

你的解決方案可能在這裏工作,但你的代碼使用硬編碼的值,如果我們將該代碼放入方法中,並嘗試將該方法用於不同的測試,這些值將不起作用。 – TDHM

0

我JTable和JList都有類似的問題。

對於表格,我不得不拖動表格足夠遠,否則它永遠不會成爲拖動手勢。

有了一個列表,我不僅需要走得足夠遠,還必須在中間添加一個方法點,並在那裏停下足夠長的時間,以便實現正在發生的事情。否則,它試圖用零長度的DataFlavor數組將它放在那裏。

結束了機器人的代碼,如:

public void dragAndDrop(Point start, Point end) { 
     // Press 
     mouseMove(start.x, start.y); 
     delay(100); 
     mousePress(MouseEvent.BUTTON1_MASK); 
     delay(500); 
     // Drag - through a way point, so this will work on JLists - make sure you linger long enough at the way point too! 
     mouseMove(start.x - (start.x - end.x)/2, start.y - (start.y - end.y)/2); 
     delay(500); 
     mouseMove(end.x, end.y); 
     delay(1000); // So you can see what is happening 
     mouseRelease(MouseEvent.BUTTON1_MASK); 
     // Wait (copied from other code) 
     waitForIdle(); 
     delay(200); 
    }