前言
这些是过去学习和工作中积累的个人总结,不过可能会存在一些主观臆断,如果有说错的地方,请指出来哦!
回答
在日常测试中,有时会遇到一些元素需要在鼠标悬停后才能显示出来的情况。
例如,百度首页上的设置按钮。当鼠标悬停在该按钮上时,才会显示“搜索设置”、“高级设置”、“关闭预测”、“隐私设置”、“关闭热搜”。如果需要找到“高级搜索”这个元素,需要先将鼠标悬停在“设置”上后再找到“高级搜索”。这种在 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);
}