Seleinum面试题:如何实现鼠标悬停操作

前言

这些是过去学习和工作中积累的个人总结,不过可能会存在一些主观臆断,如果有说错的地方,请指出来哦!

回答

在日常测试中,有时会遇到一些元素需要在鼠标悬停后才能显示出来的情况。

例如,百度首页上的设置按钮。当鼠标悬停在该按钮上时,才会显示“搜索设置”、“高级设置”、“关闭预测”、“隐私设置”、“关闭热搜”。如果需要找到“高级搜索”这个元素,需要先将鼠标悬停在“设置”上后再找到“高级搜索”。这种在 Selenium 上如何操作呢?

针对这样的情况,可以用一下两种方式进行处理。

模拟鼠标操作

常见的鼠标操作有:点击、右击、双击、悬停、拖拽等,对于这些鼠标操作Selenium都封装了相应的操作方法。

操作说明 方法
双击元素 doubleClick(clickable)
右键点击元素 contextClick(clickable)
鼠标悬停 moveToElement(hoverable)
鼠标拖拽 dragAndDrop(Aele,Bele)

以百度首页为例,此时可以使用moveToElement()方法来实现。

(注意:在使用鼠标操作之后,一定需要加上.perform()方法,否则不会生效)

实现代码:

@Test
    public void Test1() throws InterruptedException {
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 窗口最大化
        driver.manage().window().maximize();
        // 定位到设置元素
        WebElement element = driver.findElement(By.id("s-usersetting-top"));
        Thread.sleep(2000);
        // 模拟鼠标操作,将鼠标移动到设置元素上
		Actions actions = new Actions(driver);
        actions.moveToElement(element).perform();
        Thread.sleep(2000);
    	// 点击“高级搜索”
        driver.findElement(By.xpath("//*[contains(@href,'gaoji')]")).click();
        Thread.sleep(2000);
}
使用 Js 操作

如果不是使用Selenium 提供的鼠标操作的话,还可以使用万能的 Js 操作来实现

    @Test
    public void Test1() throws InterruptedException {
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 窗口最大化
        driver.manage().window().maximize();
        // 定位到设置元素
        WebElement element = driver.findElement(By.id("s-usersetting-top"));
        Thread.sleep(2000);
        // 使用JS将鼠标悬停到设置上面
        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, element);
        Thread.sleep(2000);
 		// 使用JS点击“高级搜索”
        WebElement elementGaoji = driver.findElement(By.xpath("//*[contains(@href,'gaoji')]"));
        ((JavascriptExecutor) driver).executeScript("arguments[0].click();",elementGaoji);
        Thread.sleep(2000);
    }