[java] Java를 사용하여 Selenium WebDriver에서 마우스 오버 기능을 수행하는 방법은 무엇입니까?

드롭 다운 메뉴에서 마우스 오버 기능을 수행하고 싶습니다. 메뉴 위로 마우스를 가져 가면 새로운 옵션이 표시됩니다. xpath를 사용하여 새 옵션을 클릭하려고했습니다. 그러나 메뉴를 직접 클릭 할 수는 없습니다. 따라서 수동 방식으로 드롭 다운 메뉴 위로 마우스를 가져간 다음 새 옵션을 클릭합니다.

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).build().perform();



답변

실제로 ‘마우스 호버’작업을 수행하는 것은 불가능합니다. 대신 달성하려는 모든 작업을 한 번에 연결해야합니다. 따라서 다른 체인을 드러내는 요소로 이동 한 다음 동일한 체인에서 이제 밝혀진 요소로 이동하여 클릭하십시오.

액션 체인을 사용할 때는 ‘사용자처럼 행동’하는 것을 기억해야합니다.

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).moveToElement(webdriver.findElement(By.xpath("/expression-here"))).click().build().perform();


답변

다음을 시도 할 때 이러한 답변 중 어느 것도 작동하지 않습니다.

  1. 메뉴 항목 위로 마우스를 가져갑니다.
  2. 호버 후에 만 ​​사용할 수있는 숨겨진 요소를 찾으십시오.
  3. 하위 메뉴 항목을 클릭하십시오.

moveToElement 다음에 ‘perform’명령을 삽입하면 해당 요소로 이동하고 하위 메뉴 항목이 잠시 동안 표시되지만 호버가 아닙니다. 숨겨진 요소는 즉시 사라져 ElementNotFoundException이 발생합니다. 나는 두 가지를 시도했다.

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
builder.moveToElement(clickElement).click().perform();

이것은 나를 위해 작동하지 않았습니다. 다음은 나를 위해 일했습니다.

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
By locator = By.id("clickElementID");
driver.click(locator);

동작을 사용하여 호버링하고 표준 WebDriver를 클릭하면 호버링 한 다음 클릭 할 수 있습니다.


답변

블로그 게시물을 기반으로 Selenium 2 Webdriver에서 다음 코드를 사용하여 호버링을 트리거 할 수있었습니다.

String javaScript = "var evObj = document.createEvent('MouseEvents');" +
                    "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);" +
                    "arguments[0].dispatchEvent(evObj);";


((JavascriptExecutor)driver).executeScript(javaScript, webElement);


답변

이 코드는 완벽하게 작동합니다.

 Actions builder = new Actions(driver);
 WebElement element = driver.findElement(By.linkText("Put your text here"));
 builder.moveToElement(element).build().perform();

마우스를 올린 후 공개 된 정보에 대해 원하는 다음 작업을 수행 할 수 있습니다.


답변

이 예제를 어떻게 구현할 수 있는지 확인하십시오.

여기에 이미지 설명을 입력하십시오

public class HoverableDropdownTest {

    private WebDriver driver;
    private Actions action;

    //Edit: there may have been a typo in the '- >' expression (I don't really want to add this comment but SO insist on ">6 chars edit"...
    Consumer < By > hover = (By by) -> {
        action.moveToElement(driver.findElement(by))
              .perform();
    };

    @Test
    public void hoverTest() {
        driver.get("https://www.bootply.com/render/6FC76YQ4Nh");

        hover.accept(By.linkText("Dropdown"));
        hover.accept(By.linkText("Dropdown Link 5"));
        hover.accept(By.linkText("Dropdown Submenu Link 5.4"));
        hover.accept(By.linkText("Dropdown Submenu Link 5.4.1"));
    }

    @BeforeTest
    public void setupDriver() {
        driver = new FirefoxDriver();
        action = new Actions(driver);
    }

    @AfterTest
    public void teardownDriver() {
        driver.quit();
    }

}

자세한 답변은 여기를 참조 하십시오-http: //www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/


답변

이 질문은 Protractor (Selenium의 자바 스크립트 프론트 엔드)를 사용하여 Javascript 테스트와 동일한 작업을 수행하는 방법을 찾고 있습니다.

각도기 1.2.0 및 웹 드라이버 2.1을 사용하는 솔루션 :

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
)
.click()
.perform();

이것은 또한 오프셋을 허용합니다 (요소의 위와 왼쪽을 클릭하는 데 사용하고 있습니다 🙂

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
  , -20, -20  // pixel offset from top left
)
.click()
.perform();


답변

Selenium java WebDriver를 사용하여 마우스로 가져가는 샘플 프로그램 :

public class Mhover {
    public static void main(String[] args){
       WebDriver driver = new FirefoxDriver();
       driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
       driver.get("http://www.google.com");
       WebElement ele = driver.findElement(By.id("gbqfba"));
       Actions action = new Actions(driver);
       action.moveToElement(ele).build().perform();
    }
}