Como executar a função de mouseover no Selenium WebDriver usando Java?


132

Quero fazer a função de mouseover em um menu suspenso. Quando passamos o mouse sobre o menu, ele mostra as novas opções. Tentei clicar nas novas opções usando o xpath. Mas não pode clicar nos menus diretamente. Então, como manual, estou tentando passar o mouse sobre o menu suspenso e clicar nas novas opções.

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

Verifique este site para resposta detalhada - testautomationguru.com/...
vins

Respostas:


116

Não é realmente possível executar uma ação de "passar o mouse"; você precisa encadear todas as ações que deseja realizar de uma só vez. Então, vá para o elemento que revela os outros e, durante a mesma cadeia, vá para o elemento agora revelado e clique nele.

Ao usar as Cadeias de ação, você deve se lembrar de 'fazê-lo como um usuário faria'.

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
Para mim, isso não funciona. Meu menu só fica pairou se eu executar uma compilação () executar () depois de um moveToElement ().
GarfieldKlon

8
A razão pela qual isso não funcionaria é que todas as chamadas webdriver.findElement(By... something)são executadas antes de qualquer outra coisa (é a única maneira pela qual seus resultados podem ser transmitidos moveElement). Naquele momento, o segundo elemento que você deseja encontrar ainda não está visível porque o primeiro ainda precisa passar o mouse. Para consertar isso, como você disse, você pode inserir .perform()s intermediários . Então, pelo segundo findElement, a primeira focalização será performeditada. A solução fornecida pode funcionar, dependendo da implementação da página, mas aparentemente sua e minha milhagem variaram.
Sander Verhagen

57

Nenhuma dessas respostas funciona ao tentar fazer o seguinte:

  1. Passe o mouse sobre um item de menu.
  2. Encontre o elemento oculto que está disponível APENAS após o hover.
  3. Clique no item do submenu.

Se você inserir um comando 'perform' após o moveToElement, ele será movido para o elemento e o item do submenu será exibido por um breve período, mas isso não é um foco. O elemento oculto desaparece imediatamente antes de ser encontrado, resultando em uma ElementNotFoundException. Eu tentei duas coisas:

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

Isto não funcionou para mim. O seguinte funcionou para mim:

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

Usando as ações para pairar e o clique padrão do WebDriver, eu poderia passar o mouse e clicar.


3
O segundo exemplo também funcionou para mim ao adicionar .perform ()
TheRed__

1
Não é possível acreditar que isso ainda é um problema ... nem isso funciona: builder.moveToElement (configurações) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); Eu até vejo o hover css triggerd no elemento no intervalo de tempo limite. mas nenhum clique recebe triggerd não importa o que eu tento
Sangoku

Como você lidaria se o clicável não é um elemento normal e vem como :: antes . Isso antes fica visível quando você passa o mouse
Ashok kumar Ganesan

25

Com base nesta postagem do blog, fui capaz de acionar o pairar usando o seguinte código com o 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
Solução menos óbvia, mas 100% sólida para o meu teste IE11. Se você tiver problemas moveToElement, use este! Eu codifico em C #, portanto, não é apenas a maneira Java de fazer isso.
precisa saber é o seguinte


O que é isso arguments[0]?
Arian

@ArianHosseinzadeh é a referência passada no dom para o segundo argumento passado para executeScript(), que é um #webElement
Zugwalt

Recebo uma referência em falta para o executor Javascript. O que refercne eu preciso adicionar em c # #
mark1234 17/17/17

11

Este código funciona perfeitamente bem:

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

Depois de passar o mouse, você poderá executar a próxima ação desejada nas informações reveladas


Excelente apenas teve de acrescentarusing OpenQA.Selenium.Interactions;
SushiGuy

7

Veja neste exemplo como podemos implementar isso.

insira a descrição da imagem aqui

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

}

Para obter respostas detalhadas, consulte aqui - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/


5

Encontrei essa pergunta procurando uma maneira de fazer a mesma coisa nos meus testes de Javascript, usando o Transferidor (uma interface de javascript do Selenium.)

Minha solução com o transferidor 1.2.0 e o webdriver 2.1:

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

Isso também aceita um deslocamento (estou usando-o para clicar acima e à esquerda de um elemento :)

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

4

Exemplo de programa para passar o mouse usando o 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
Considere incluir algumas informações sobre sua resposta, em vez de simplesmente postar o código. Tentamos fornecer não apenas 'correções', mas ajudar as pessoas a aprender. Você deve explicar o que estava errado no código original, o que você fez de maneira diferente e por que suas alterações funcionaram.
Andrew Barber

2
@ AndrewBarber - determinado programa pode realmente ajudar o usuário. Esse programa está funcionando corretamente. O usuário já aceitou isso ..
Helping Hands

4
Não discuto que funcionará ; Estou dizendo que você deve explicar por que pode funcionar, por que o que eles tinham não estava funcionando e o que você mudou.
Andrew Barber

Esse código é equivalente ao OP e não responde à pergunta. Sem qualquer informação contextual, é supérflua.
jpaugh

2

Podes tentar:

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 você teve muitas categorias na Web, use o primeiro método. Para o menu desejado, você só precisa do segundo método.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.