如何使用Java在Selenium WebDriver中执行鼠标悬停功能?


131

我想在下拉菜单上执行鼠标悬停功能。当我们将鼠标悬停在菜单上时,它将显示新选项。我试图使用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

Answers:


115

实际上不可能执行“鼠标悬停”动作,而是需要一次性链接所有想要实现的动作。因此,移至显示其他元素的元素,然后在同一链中,移至现在显示的元素,然后单击它。

使用动作链时,必须记住要“像用户那样做”。

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()s,然后在第二个中插入第findElement一个悬停perform。给定的解决方案可能会起作用,具体取决于页面的实现方式,但是显然您和我的行程有所不同。
Sander Verhagen 2014年

57

尝试执行以下操作时,这些答案均无效:

  1. 将鼠标悬停在菜单项上。
  2. 找到仅在悬停后可用的隐藏元素。
  3. 单击子菜单项。

如果在moveToElement之后插入“性能”命令,它将移至该元素,并且子菜单项会显示一小段时间,但这并不是悬停。隐藏的元素会在发现之前立即消失,从而导致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。但没有点击获取triggerd不管我怎么努力
三国

如果clickable不是一个普通元素,而它又像:: before,您将如何处理。这都可见之前当您将鼠标悬停
阿肖克·库马尔·甘尼申

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


这是arguments[0]什么
阿里安

@ArianHosseinzadeh传入的dom引用传递给的第二个参数executeScript(),这是webElement
Zugwalt

我得到了Javascript执行程序的missign ref。我需要在C#中添加什么参照
mark1234 '17

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前端)来对Javascript测试执行相同操作的方法。

我用量角器1.2.0和webdriver 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 2014年

2
@AndrewBarber-给定的程序可以真正帮助用户。该程序运行正常。用户已经接受了..
心手相牵

4
我毫不怀疑它会起作用 ; 我要说的是,您应该解释一下为什么它可能会起作用,为什么他们以前的不起作用以及您所做的更改。
Andrew Barber 2014年

此代码与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();

如果您的网络有很多类别,请使用第一种方法。对于您想要的菜单,您只需要第二种方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.