1

Selenium WebDriver에서 작동하는 드래그 앤 드롭 기능을 계속 사용하는 데 문제가 있습니다.Selenium WebDriver에서 드래그 앤 드롭 작동 방법

는 드래그/드롭 명령 상자 밖으로 작동해야 WebDriver 문서에 따르면 :

WebElement element = driver.findElement(By.name("source")); 
WebElement target = driver.findElement(By.name("target")); 
(new Actions(driver)).dragAndDrop(element, target).perform(); 

그러나이 파이어 폭스 나 크롬 드라이버 중 하나를 작동하지 않는 것 같다.

다음은 드래그 앤 드롭 기능을 사용하여 2 개의 공개 드래그 가능한 웹 사이트에서 테스트를 시도하는 예입니다. 테스트는 매개 변수화되어 FirefoxDriver와 ChromeDriver에서 실행됩니다.

package test; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 

import org.junit.After; 
import org.junit.Assert; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 
import org.junit.runners.Parameterized.Parameters; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.interactions.Actions; 
import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.WebDriverWait; 

@RunWith(Parameterized.class) 
public class DragAndDropTest { 

    enum Browser {FIREFOX, CHROME}; 

    private Browser browser; 
    private WebDriver driver; 

    @Parameters 
    public static Collection<Object[]> data() throws Exception { 
     List<Object[]> params = new ArrayList<Object[]>(); 
     params.add(new Object[] { Browser.FIREFOX }); 
     params.add(new Object[] { Browser.CHROME }); 
     return params; 
    } 

    public DragAndDropTest(Browser browser) { 
     this.browser = browser; 
    } 

    @Before 
    public void before() { 
     switch (browser) { 
     case FIREFOX: 
      this.driver = new FirefoxDriver(); 
      break; 
     case CHROME: 
      this.driver = new ChromeDriver(); 
     } 
    } 

    @After 
    public void tearDown() { 
     driver.quit(); 
    } 

    @Test 
    public void test1() { 
     By drag = By.id("div1"); 
     By drop = By.id("div2"); 
     By expected = By.cssSelector("#div2 #drag1"); 
     // load page 
     driver.get("http://www.w3schools.com/html/html5_draganddrop.asp"); 
     // wait for draggable element visible 
     new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(drag)); 
     // drag and drop 
     new Actions(driver).dragAndDrop(driver.findElement(drag), driver.findElement(drop)).perform(); 
     // verify results 
     Assert.assertEquals("Drag&Drop failed", 1,driver.findElements(expected).size()); 
    } 

    @Test 
    public void test2() { 
     By drag = By.id("Item1"); 
     By drop = By.id("Item5"); 
     By expected = By.cssSelector("#DragContainer5 #Item1"); 
     // load page 
     driver.get("http://www.webreference.com/programming/javascript/mk/column2/index.html"); 
     // wait for draggable element visible 
     new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(drag)); 
     // drag and drop 
     new Actions(driver).dragAndDrop(driver.findElement(drag), driver.findElement(drop)).perform(); 
     // verify results 
     Assert.assertEquals("Drag&Drop failed", 1, driver.findElements(expected).size()); 
    } 
} 

위의 테스트가 제대로 작동하지 않는 이유에 대한 제안이나 조언이 있으십니까?

답변

1

W3C 사이트에는 현재 Webdriver에서 지원하지 않는 HTML5 끌어 놓기 기능이 있습니다. 이 문제 참조 - https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/3604

하지만 첫 번째 테스트 케이스에서는 드래그 요소에 사용해야합니다. By drag = By.id ("drag1");

드래그하는 이미지의 위치 표시 자입니다.

+0

WebDriver의 미해결 문제에 대해 설명해 주셔서 감사합니다. 또한 첫 번째 예제 테스트에서 유효하지 않은 로케이터 이름을 찾았습니다 (WebDriver의 공개 문제로 인해 테스트가 수정되지 않았습니다). – jperala