Jak wykonać funkcję mouseover w Selenium WebDriver przy użyciu Java?

136

Chcę wykonać funkcję najechania kursorem myszy na menu rozwijane. Kiedy najedziemy kursorem na menu, pokaże się nowe opcje. Próbowałem kliknąć nowe opcje za pomocą xpath. Ale nie można bezpośrednio klikać menu. Tak więc, w sposób ręczny, próbuję najechać kursorem na rozwijane menu, a następnie kliknę nowe opcje.

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).build().perform();
Pradeep SJ
źródło
Sprawdź tę stronę, aby uzyskać szczegółową odpowiedź - testautomationguru.com/…
vins

Odpowiedzi:

118

Naprawdę nie jest możliwe wykonanie akcji „najechania myszą”, zamiast tego musisz połączyć w łańcuch wszystkie działania, które chcesz osiągnąć za jednym razem. Więc przejdź do elementu, który odsłania pozostałe, a następnie w tym samym łańcuchu przejdź do teraz odkrytego elementu i kliknij go.

Korzystając z łańcuchów akcji, musisz pamiętać, aby „robić to tak, jak zrobiłby to użytkownik”.

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();
Mark Rowlands
źródło
5
U mnie to nie działa. Moje menu tylko dostaje unosił gdybym wykonać build () wykonać () po moveToElement ().
GarfieldKlon
8
Powodem, dla którego to nie zadziała, jest to, że wszystkie wywołania webdriver.findElement(By... something)są wykonywane przed czymkolwiek innym (tylko w ten sposób można przekazać ich wynik moveElement). W tym momencie drugi element, który chcesz znaleźć, nie jest jeszcze widoczny, ponieważ pierwszy wciąż trzeba najechać kursorem. Aby to naprawić, jak powiedziałeś, możesz wstawić pośrednie .perform()s, a następnie po drugie findElement, pierwszy najechanie kursorem zostanie performedytowany. Podane rozwiązanie może działać, w zależności od implementacji strony, ale podobno Twój i mój przebieg różnił się.
Sander Verhagen
58

Żadna z tych odpowiedzi nie działa, gdy próbujesz wykonać następujące czynności:

  1. Najedź kursorem na element menu.
  2. Znajdź ukryty element, który jest dostępny TYLKO po najechaniu kursorem.
  3. Kliknij pozycję podmenu.

Jeśli wstawisz polecenie „wykonaj” po elemencie moveToElement, zostanie ono przeniesione do elementu, a pozycja podmenu jest wyświetlana przez krótki czas, ale nie jest to najechanie kursorem. Ukryty element natychmiast znika, zanim można go znaleźć, powodując wyjątek ElementNotFoundException. Próbowałem dwóch rzeczy:

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

To nie zadziałało dla mnie. Pracowały dla mnie:

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

Używając Akcji do najechania kursorem i standardowego kliknięcia WebDriver, mogłem najechać kursorem, a następnie kliknąć.

zmorris
źródło
3
Drugi przykład zadziałał również dla mnie podczas dodawania .perform ()
TheRed__
1
Nie mogę uwierzyć, że to nadal problem ... nawet to nie działa: builder.moveToElement (ustawienia) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); widzę nawet wywołanie css triggerd na elemencie w przedziale limitu czasu. ale żadne kliknięcie nie jest wyzwalane bez względu na to, co próbuję
Sangoku
Jak sobie poradzisz, jeśli klikalny element nie jest zwykłym elementem i jest taki jak wcześniej . To wcześniej jest widoczne po najechaniu kursorem myszy
Ashok kumar Ganesan
25

Na podstawie tego wpisu na blogu udało mi się wywołać najechanie przy użyciu następującego kodu z 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);
Zugwalt
źródło
2
Mniej oczywiste rozwiązanie, ale w 100% solidne do moich testów IE11. Jeśli masz problemy z unoszeniem się moveToElement, użyj tego! Programuję w C #, więc nie jest to tylko sposób na Java.
vt100
Selenium Mouse Actions & Waits , Javascript initMouseEvent () Example
Yash
Co to jest arguments[0]?
Arian
@ArianHosseinzadeh to przekazane w dom odniesienie do drugiego argumentu przekazanego do executeScript(), którym jestwebElement
Zugwalt
Otrzymuję błąd dotyczący wykonawcy Javascript. Jakie skierowanie muszę dodać w C #
mark1234
11

Ten kod działa doskonale:

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

Po najechaniu kursorem myszy możesz przejść do następnej czynności, jaką chcesz, na ujawnionych informacjach


źródło
Po prostu trzeba było dodać doskonałeusing OpenQA.Selenium.Interactions;
SushiGuy,
7

Sprawdź ten przykład, jak moglibyśmy to zaimplementować.

wprowadź opis obrazu tutaj

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

}

Aby uzyskać szczegółową odpowiedź, sprawdź tutaj - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/

winnice
źródło
5

Znalazłem to pytanie, szukając sposobu, aby zrobić to samo dla moich testów Javascript, używając Protractor (nakładka javascript do Selenium).

Moje rozwiązanie z kątomierzem 1.2.0 i webdriverem 2.1:

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

To również akceptuje przesunięcie (używam go do klikania powyżej i po lewej stronie elementu :)

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
  , -20, -20  // pixel offset from top left
)
.click()
.perform();
Platon
źródło
4

Przykładowy program do najechania myszą przy użyciu 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();
    }
}
Pomocne dłonie
źródło
9
Zastanów się nad dołączeniem niektórych informacji o swojej odpowiedzi, zamiast po prostu opublikować kod. Staramy się dostarczać nie tylko „poprawki”, ale pomagamy ludziom się uczyć. Powinieneś wyjaśnić, co było nie tak w oryginalnym kodzie, co zrobiłeś inaczej i dlaczego Twoja zmiana (e) zadziałała.
Andrew Barber,
2
@AndrewBarber - Podany program może naprawdę pomóc użytkownikowi. Ten program działa poprawnie. Użytkownik już to zaakceptował ...
Pomocne dłonie,
4
Nie zaprzeczam, że to zadziała ; Mówię, że powinieneś wyjaśnić, dlaczego to może działać, dlaczego to, co mieli, nie działa i co zmieniłeś.
Andrew Barber,
Ten kod jest odpowiednikiem PO i nie odpowiada na pytanie. Bez żadnych informacji kontekstowych jest to zbędne.
jpaugh
2

Możesz spróbować:

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

Jeśli miałeś przypadek, że sieć ma wiele kategorii, użyj pierwszej metody. W przypadku menu, które chcesz, potrzebujesz tylko drugiej metody.

Prasetyo Budi
źródło