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


132

드롭 다운 메뉴에서 마우스 오버 기능을 수행하고 싶습니다. 메뉴 위로 마우스를 가져 가면 새로운 옵션이 표시됩니다. 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();

자세한 답변은이 사이트를 확인하십시오 -testautomationguru.com/…
vins

답변:


116

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

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

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

5
나를 위해 이것은 작동하지 않습니다. moveToElement () 후에 build (). perform ()을 수행하면 메뉴가 호버링됩니다.
GarfieldKlon

8
이것이 제대로 작동하지 않는 이유는 모든 호출이 webdriver.findElement(By... something)다른 것보다 먼저 실행되기 때문입니다 (결과가에 전달 될 수있는 유일한 방법입니다 moveElement). 이때 첫 번째 요소를 여전히 가리켜 야하므로 찾으려는 두 번째 요소가 표시되지 않습니다. 이 문제를 해결하기 위해 말했듯이 중간을 삽입 할 수 .perform()있으며 두 번째 findElement에는 첫 번째 호버가 완료 perform됩니다. 주어진 솔루션은 페이지의 구현에 따라 작동 할 수 있지만 분명히 귀하와 나의 마일리지는 다양합니다.
Sander Verhagen

57

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

  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를 클릭하면 호버링 한 다음 클릭 할 수 있습니다.


3
두 번째 예제는 .perform ()을 추가 할 때도 잘 작동했습니다.
TheRed__

1
이것은 여전히 ​​문제입니다 ... 이것조차도 작동하지 않습니다 : builder.moveToElement (settings) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); 시간 초과 범위의 요소에서 호버 CSS가 트리거되는 것을 볼 수도 있습니다. 아무리 시도해도 아무 클릭도 발생하지 않습니다.
Sangoku

클릭 가능 요소가 일반 요소가 아니고 :: before 와 같은 경우 어떻게 처리합니까 ? 마우스로 마우스를 가져 가면 이전에 표시됩니다
Ashok kumar Ganesan

25

블로그 게시물을 기반으로 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);

2
덜 명백한 솔루션이지만 IE11 테스트에는 100 % 견고합니다. 에 마우스를 올리는 데 문제가있는 moveToElement경우이 도구를 사용하십시오! 나는 C #으로 코드를 작성하므로 Java를 수행하는 방법 만이 아닙니다.
vt100

Selenium Mouse Actions & Waits , 자바 스크립트 initMouseEvent () Example
Yash

이게 뭐야 arguments[0]?
Arian

@ArianHosseinzadeh 그것으로 전달 번째 인수 DOM 참조 전달 executeScript()A는,webElement
Zugwalt

Javascript executor에 대한 missign 참조가 표시됩니다. C #에 추가해야 할 참조
mark1234

11

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

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

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


우수 추가했습니다using OpenQA.Selenium.Interactions;
SushiGuy

7

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

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

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/


5

이 질문은 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();

4

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

9
단순히 코드를 게시하는 대신 답변에 대한 정보를 포함시키는 것을 고려하십시오. 우리는 단지 '수정'을 제공하는 것이 아니라 사람들이 배우도록 도와줍니다. 원래 코드에서 무엇이 잘못되었는지, 어떻게 다르게했는지, 왜 변경이 효과가 있었는지 설명해야합니다.
Andrew Barber

2
@AndrewBarber-주어진 프로그램은 실제로 사용자에게 도움이 될 수 있습니다. 그 프로그램은 제대로 작동하고 있습니다. 사용자가 이미이를 수락했습니다.
돕는 손

4
나는 것이다 이의를 제기하지 않는 ; 나는 그것이 작동하는지, 왜 그들이 작동하지 않았는지, 그리고 당신이 무엇을 변경했는지 설명해야한다고 말하고 있습니다.
Andrew Barber

이 코드는 OP와 동일하며 질문에 대답하지 않습니다. 상황에 맞는 정보가 없으면 불필요한 정보입니다.
jpaugh

2

당신은 시도 할 수 있습니다:

WebElement getmenu= driver.findElement(By.xpath("//*[@id='ui-id-2']/span[2]")); //xpath the parent

Actions act = new Actions(driver);
act.moveToElement(getmenu).perform();

Thread.sleep(3000);
WebElement clickElement= driver.findElement(By.linkText("Sofa L"));//xpath the child
act.moveToElement(clickElement).click().perform();

웹에 많은 카테고리가있는 경우 첫 번째 방법을 사용하십시오. 원하는 메뉴의 경우 두 번째 방법 만 있으면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.