一、摘要
本片博文主要展示在使用Selenium with java做web自动化时,一些不得不模拟鼠标操作、模拟键盘操作和控制滚动条的java代码
二、模拟鼠标操作
package util; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.WebDriver; public class MouseUtil { /** * 模拟鼠标左键单击 * @param driver * @param xpathExpression */ public void lefClick(WebDriver driver, String xpathExpression) { Actions actions = new Actions(driver); // 鼠标左键在当前停留的位置做单击操作 actions.click(); // 鼠标左键点击指定的元素 actions.click(driver.findElement(By.xpath(xpathExpression))); } /** * 模拟鼠标右键单击 * @param driver * @param xpathExpression */ public void rightClick(WebDriver driver, String xpathExpression) { Actions actions = new Actions(driver); // 鼠标右键在当前停留的位置做单击操作 actions.contextClick(); // 鼠标右键点击指定的元素 actions.contextClick(driver.findElement(By.xpath(xpathExpression))); } /** * 模拟鼠标左键双击 * @param driver * @param xpathExpression */ public void doubleClick(WebDriver driver, String xpathExpression) { Actions actions = new Actions(driver); // 鼠标在当前停留的位置做双击操作 actions.doubleClick(); // 鼠标双击指定的元素 actions.doubleClick(driver.findElement(By.xpath(xpathExpression))); } /** * 模拟鼠标拖拽 * @param driver * @param source * @param target */ public void dragAction(WebDriver driver, WebElement source, WebElement target) { Actions actions = new Actions(driver); // 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置 actions.dragAndDrop(source, target); } /** * 模拟鼠标拖拽到某坐标 * @param driver * @param source * @param xOffset * @param yOffset */ public void dragtoXY(WebDriver driver, WebElement source, int xOffset, int yOffset) { Actions actions = new Actions(driver); // 鼠标拖拽动作,将 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 为横坐标,yOffset 为纵坐标 actions.dragAndDropBy(source, xOffset, yOffset); } /** * 模拟鼠标拖拽从元素A到元素B * @param driver * @param source * @param target */ public void dragActionReleaseMouse(WebDriver driver, WebElement source, WebElement target) { Actions actions = new Actions(driver); // 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置 actions.clickAndHold(source).moveToElement(target).perform(); actions.release(); } /** * 模拟鼠标单击并不释放 * @param driver * @param element */ public void clickAndHole(WebDriver driver, WebElement element) { Actions actions = new Actions(driver); //action.clickAndHold();鼠标悬停在当前位置,既点击并且不释放 // 鼠标悬停在 onElement 元素的位置 actions.clickAndHold(element); } /** * 模拟鼠标拖拽 * @param driver * @param xOffset * @param yOffset */ public void moveToXY(WebDriver driver, int xOffset, int yOffset){ Actions actions = new Actions(driver); /**将鼠标移到元素 toElement 的 (xOffset, yOffset) 位置,这里的 (xOffset, yOffset) 是以元素 toElement 的左上角为 (0,0) 开始的 (x, y) 坐标轴 *action.moveToElement(toElement,xOffset,yOffset) *以鼠标当前位置或者 (0,0) 为中心开始移动到 (xOffset, yOffset) 坐标轴*/ actions.moveByOffset(xOffset, yOffset); actions.release();// 释放鼠标 } }
三、模拟键盘操作
package util; import java.awt.AWTException; import java.awt.Robot; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; import java.awt.event.KeyEvent; public class KeyBoardUtil { /**Tab键封装*/ public static void pressTabKey(){ Robot robot = null; try{ robot = new Robot(); }catch (AWTException e){ e.printStackTrace(); } //调用keypress方法来实现按下Tab键 assert robot != null; robot.keyPress(KeyEvent.VK_TAB); //调用keyrelease方法来实现释放Tab键 robot.keyRelease(KeyEvent.VK_TAB); } /**Enter键封装*/ public static void pressEnterKey(){ Robot robot = null; try{ robot = new Robot(); }catch (AWTException e){ e.printStackTrace(); } //调用keypress方法来实现按下Enter键 assert robot != null; robot.keyPress(KeyEvent.VK_ENTER); //调用keyrelease方法来实现释放Enter键 robot.keyRelease(KeyEvent.VK_ENTER); } /**将指定字符串设为剪切板内容,执行黏贴操作 *将页面焦点切换到输入框后,调用此函数,将指定字符串黏贴到输入框 */ public static void setAndctrlVClipboardData(String string){ StringSelection stringSelection = new StringSelection(string); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null); Robot robot = null; try{ robot = new Robot(); }catch (AWTException e){ e.printStackTrace(); } assert robot != null; robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_CONTROL); } /** * 键盘向下键封装 */ public static void pressDownKey(){ Robot robot = null; try{ robot = new Robot(); }catch (AWTException e){ e.printStackTrace(); } assert robot != null; robot.keyPress(KeyEvent.VK_DOWN); robot.keyRelease(KeyEvent.VK_DOWN); } }
四、控制滚动条
package util; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; public class ScrollBarUtil { /** * 控制滚动条向下拉到底 * @param driver 浏览器驱动 */ public static void toBottom(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; //向下拉到底// js.executeScript("document.documentElement.scrollTop=10000"); } /** * 控制滚动条向上拉到顶 * @param driver 浏览器驱动 */ public static void toTop(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; //向上拉到顶 js.executeScript("document.documentElement.scrollTop=0"); } /** * 控制滚动条向下拉到底 * @param driver 浏览器驱动 */ public static void scrolltoBottom(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; //向下拉到底 js.executeScript("window.scrollTo(0,100000)"); } /** * 控制滚动条向上拉到顶 * @param driver 浏览器驱动 */ public static void scrolltoTop(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; //向上拉到顶 js.executeScript("window.scrollTo(0,1)"); } /** * 控制滚动条拉到中间 * @param driver 浏览器驱动 */ public static void verticaltoMiddle(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; //上下拉到中间 js.executeScript("window.scrollBy(0, 0-document.body.scrollHeight *1/2)"); } /** * 控制水平滚动条左右拉到中间 * @param driver 浏览器驱动 */ public static void horizontaltoMiddle(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; //左右拉到中间 js.executeScript("window.scrollBy(0, 0-document.body.scrollWidht *1/2)"); } /** * 控制滚动条拉到元素可见 * @param driver 浏览器驱动 * @param element 页面元素定位 */ public static void scrolltoPresence(WebDriver driver, WebElement element) { JavascriptExecutor js = (JavascriptExecutor) driver; //移动到元素element对象的“顶端”与当前窗口的“顶部”对齐 //js.executeScript("arguments[0].scrollIntoView();", element); js.executeScript("arguments[0].scrollIntoView(true);", element); //移动到元素element对象的“底端”与当前窗口的“底部”对齐 //js.executeScript("arguments[0].scrollIntoView(false);", element); } /** * 使用JavaScript的ScrollTo函数和document.body.scrollHeight参数 * 将页面滚动到最下方 * @param driver 浏览器驱动 */ public static void scrollingToBottomofPage(WebDriver driver){ ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight)"); try{ Thread.sleep(3000); }catch (InterruptedException e){ e.printStackTrace(); } } /** * 使用JavaScript的ScrollTo函数,使用0和800的横纵坐标参数 * 将页面的滚动条纵向下滑800个像素 * @param driver 浏览器驱动 */ public static void scrollingByCoordinateofPage(WebDriver driver){ ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,200)"); try{ Thread.sleep(3000); }catch (InterruptedException e){ e.printStackTrace(); } } }