Come eseguire la funzione mouseover in Selenium WebDriver utilizzando Java?


132

Voglio fare la funzione mouseover su un menu a discesa. Passando il mouse sopra il menu, verranno visualizzate le nuove opzioni. Ho provato a fare clic sulle nuove opzioni usando xpath. Ma non è possibile fare clic direttamente sui menu. Quindi, come il modo manuale sto cercando di passare il mouse sopra il menu a discesa e quindi fare clic sulle nuove opzioni.

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

Controlla questo sito per una risposta dettagliata - testautomationguru.com/…
vins

Risposte:


116

Non è davvero possibile eseguire un'azione di "passaggio del mouse", invece è necessario concatenare tutte le azioni che si desidera eseguire in una volta sola. Quindi spostati sull'elemento che rivela gli altri, quindi durante la stessa catena, spostati sull'elemento ora rivelato e fai clic su di esso.

Quando usi Catene di azione devi ricordare di 'farlo come farebbe un utente'.

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
Per me questo non funziona. Il mio menu viene sospeso solo se eseguo un build (). Perform () dopo una mossaToElement ()
GarfieldKlon

8
Il motivo per cui ciò non funzionerebbe è che tutte le chiamate a webdriver.findElement(By... something)vengono eseguite prima di ogni altra cosa (è l'unico modo in cui il loro risultato può essere trasmesso moveElement). In quel momento il secondo elemento che vuoi trovare non è ancora visibile perché il primo deve ancora essere sospeso. Per risolvere questo problema, come hai detto, puoi inserire intermedi .perform()s, quindi per il secondo findElement, il primo hover sarà stato modificato perform. La soluzione fornita potrebbe funzionare, a seconda dell'implementazione della pagina, ma a quanto pare il tuo e il mio chilometraggio variavano.
Sander Verhagen,

57

Nessuna di queste risposte funziona quando si tenta di eseguire le seguenti operazioni:

  1. Passa il mouse sopra una voce di menu.
  2. Trova l'elemento nascosto disponibile SOLO dopo il passaggio del mouse.
  3. Fai clic sulla voce del sottomenu.

Se si inserisce un comando 'perform' dopo lo moveToElement, si sposta sull'elemento e la voce del sottomenu viene visualizzata per un breve periodo, ma non è un passaggio del mouse. L'elemento nascosto scompare immediatamente prima di poter essere trovato con conseguente ElementNotFoundException. Ho provato due cose:

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

Questo non ha funzionato per me. Per me ha funzionato:

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

Utilizzando le azioni per il passaggio del mouse e il clic WebDriver standard, ho potuto passare il mouse e fare clic.


3
Il secondo esempio ha funzionato anche per me quando ho aggiunto .perform ()
TheRed__

1
Non posso credere che questo sia ancora un problema ... nemmeno questo funziona: builder.moveToElement (impostazioni) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); vedo anche il passaggio del mouse css triggerd sull'elemento nell'intervallo di timeout. ma nessun clic viene attivato, qualunque cosa io provi
Sangoku,

Come gestiresti se il clic non è un elemento normale e viene come :: prima . Questo prima diventa visibile quando passi il mouse
Ashok kumar Ganesan il

25

Sulla base di questo post del blog sono stato in grado di attivare l'hovering utilizzando il seguente codice con 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
Soluzione meno ovvia, ma solida al 100% per i miei test IE11. Se hai problemi con il passaggio del mouse moveToElement, usa questo! Codifico in C #, quindi non è solo un modo Java per farlo.
vt100,


Che cos'è questo arguments[0]?
Arian,

@ArianHosseinzadeh è passato in dom riferimento al secondo argomento passato executeScript(), che è unwebElement
Zugwalt

Ricevo ref di Missign per l'esecutore di Javascript. Quale riferimento devo aggiungere in C #
mark1234

11

Questo codice funziona perfettamente:

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

Dopo il passaggio del mouse, è possibile continuare a eseguire l'azione successiva desiderata sulle informazioni rivelate


Eccellente appena aggiuntousing OpenQA.Selenium.Interactions;
SushiGuy

7

Controlla questo esempio come possiamo implementarlo.

inserisci qui la descrizione dell'immagine

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

}

Per una risposta dettagliata, consultare qui - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/


5

Ho trovato questa domanda cercando un modo per fare la stessa cosa per i miei test Javascript, usando Protractor (un frontend javascript per Selenium.)

La mia soluzione con goniometro 1.2.0 e webdriver 2.1:

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

Questo accetta anche un offset (lo sto usando per fare clic sopra e a sinistra di un elemento :)

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

4

Programma di esempio per passare il mouse con 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
Ti preghiamo di considerare di includere alcune informazioni sulla tua risposta, anziché semplicemente pubblicare il codice. Cerchiamo di fornire non solo "correzioni", ma aiutare le persone a imparare. Dovresti spiegare cosa c'era di sbagliato nel codice originale, cosa hai fatto diversamente e perché le tue modifiche hanno funzionato.
Andrew Barber,

2
@AndrewBarber - Il programma dato può davvero aiutare l'utente. Quel programma funziona correttamente. L'utente ha già accettato che ..
Helping Hands

4
Non contestare che funzionerà ; Sto dicendo che dovresti spiegare perché potrebbe funzionare, perché ciò che avevano non funzionava e cosa hai cambiato.
Andrew Barber,

Questo codice è equivalente ai PO e non risponde alla domanda. Senza alcuna informazione contestuale, è superfluo.
jpaugh,

2

Puoi provare:

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

Se hai avuto caso il web ha molte categorie, usa il primo metodo. Per il menu desiderato, è sufficiente il secondo metodo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.