【自动化测试】Selenium详解-WebUI自动化测试
🔥个人主页: 中草药
🔥专栏:【Java】登神长阶 史诗般的Java成神之路
Selenium 是用于 Web 自动化测试的常用工具,其核心功能围绕浏览器控制、元素操作和页面交互展开。以下是 Selenium 中最常用的函数(方法),按功能分类说明:
Selenium常用函数
浏览器初始化与控制
用于启动浏览器、控制窗口行为等,核心是通过 webdriver
模块初始化浏览器驱动。
webdriver.Chrome()
driver = webdriver.Chrome()
webdriver.Firefox()
driver = webdriver.Firefox()
get(url)
driver.get(\"https://www.baidu.com\")
driver.navigate.forward()
getTitle()
driver.getTitle()
getCurrentUrl()
driver.getCurrentUrl()
测试demo
//浏览器初始化与控制 public void test02() throws InterruptedException { WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); options.addArguments(\"--remote-allow-origins=*\"); WebDriver driver = new ChromeDriver(options); driver.get(\"https://www.baidu.com/\"); Thread.sleep(1000); driver.navigate().to(\"https://www.csdn.net/\"); Thread.sleep(1000); driver.navigate().back(); Thread.sleep(1000); driver.navigate().forward(); Thread.sleep(1000); driver.navigate().refresh(); Thread.sleep(1000); System.out.println(driver.getTitle()); System.out.println(driver.getCurrentUrl()); driver.quit(); }
元素定位
id
属性定位java// 单个元素WebElement username = driver.findElement(By.id(\"username\"));// 多个元素List tags = driver.findElements(By.id(\"tag\"));
name
属性定位javaWebElement password = driver.findElement(By.name(\"password\"));
class
属性定位(单个 class)javaWebElement submitBtn = driver.findElement(By.className(\"btn-submit\"));
javaWebElement input = driver.findElement(By.tagName(\"input\"));
javaWebElement loginLink = driver.findElement(By.linkText(\"登录\"));
javaWebElement partialLink = driver.findElement(By.partialLinkText(\"登\"));
java// id选择器WebElement username = driver.findElement(By.cssSelector(\"#username\"));// 层级选择器WebElement navItem = driver.findElement(By.cssSelector(\".nav > li\"));
java// 属性匹配WebElement usernameInput = driver.findElement(By.xpath(\"//input[@name=\'username\']\"));// 文本包含WebElement welcomeDiv = driver.findElement(By.xpath(\"//div[contains(text(), \'欢迎\')]\"));
常见的是xpath
更便捷的生成selector/xpath的方式:右键选择复制\"Copyselector/xpath\"
public void test03(){ WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); options.addArguments(\"--remote-allow-origins=*\"); WebDriver driver = new ChromeDriver(options); driver.get(\"https://www.baidu.com/\"); System.out.println(driver.findElement(By.xpath(\"//ul[@class=\'s-hotsearch-content\']\")).getText()); System.out.println(\"--------------------\"); List elements = driver.findElements(By.xpath(\"//li[@class=\'hotsearch-item odd\']\")); for (WebElement element : elements) { System.out.println(element.getText()); } }
元素操作
click()
elem.click();
sendKeys(CharSequence...)
Keys.ENTER
)// 需导入键盘按键类:import org.openqa.selenium.Keys;elem.sendKeys(\"admin\"); // 输入文本elem.sendKeys(Keys.ENTER); // 按回车键
clear()
elem.clear();
getText()
System.out.println(elem.getText()); // 输出类似\"登录按钮\"的文本
getAttribute(String name)
elem.getAttribute(\"value\"); // 获取输入框当前值elem.getAttribute(\"href\"); // 获取链接的href属性
isDisplayed()
if (elem.isDisplayed()) { // 元素可见时执行的操作}
isEnabled()
if (elem.isEnabled()) { // 元素可用时执行的操作}
isSelected()
if (elem.isSelected()) { // 元素被选中时执行的操作}
测试demo
public void test03() throws InterruptedException { WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); options.addArguments(\"--remote-allow-origins=*\"); WebDriver driver = new ChromeDriver(options); driver.get(\"https://www.baidu.com/\"); WebElement element = driver.findElement(By.xpath(\"//*[@id=\\\"chat-textarea\\\"]\")); WebElement search=driver.findElement(By.xpath(\"//*[@id=\\\"chat-submit-button\\\"]\")); Thread.sleep(1000); element.sendKeys(\"python\"); Thread.sleep(1000); element.clear(); Thread.sleep(1000); element.sendKeys(\"java\"); Thread.sleep(1000); search.click(); Thread.sleep(3000); driver.quit(); }
窗口与标签页操作
System.out.println(driver.getWindowHandle());
getWindowHandles()
Set windowHandles = driver.getWindowHandles();
for(String windowHandle : windowHandles) { if(!windowHandle.equals(driver.getWindowHandle())) { driver.switchTo().window(windowHandle); }}
maximize()
driver.manage().window().maximize();
minimize()
driver.manage().window().minimize();
setSize(new Dimension(width, height))
driver.manage().window().setSize(new Dimension(1280, 720));
测试demo
public void test03() throws InterruptedException { WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); options.addArguments(\"--remote-allow-origins=*\"); WebDriver driver = new ChromeDriver(options); driver.get(\"https://www.baidu.com/\"); Thread.sleep(1000); driver.manage().window().maximize(); Thread.sleep(1000); driver.manage().window().minimize(); Thread.sleep(1000); driver.manage().window().fullscreen(); Thread.sleep(1000); driver.manage().window().setSize(new Dimension(1280, 720)); Thread.sleep(1000); WebElement element = driver.findElement(By.xpath(\"//*[@id=\\\"hotsearch-content-wrapper\\\"]/li[1]/a/span[2]\")); element.click(); Thread.sleep(1000); System.out.println(driver.getWindowHandle()); Set windowHandles = driver.getWindowHandles(); for(String windowHandle : windowHandles) { if(!windowHandle.equals(driver.getWindowHandle())) { driver.switchTo().window(windowHandle); } } Thread.sleep(1000); driver.quit(); }
屏幕截图
我们的自动化脚本一般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景
File screenshotAs = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(screenshotAs,new File(fileName));
屏幕截图方法需要额外导入包:
commons-io commons-io 2.16.1
public void test03() throws InterruptedException, IOException { WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); options.addArguments(\"--remote-allow-origins=*\"); WebDriver driver = new ChromeDriver(options); driver.get(\"https://www.baidu.com/\"); getScreenShot(driver); WebElement element = driver.findElement(By.xpath(\"//*[@id=\\\"hotsearch-content-wrapper\\\"]/li[1]/a/span[2]\")); element.click(); System.out.println(driver.getWindowHandle()); Set windowHandles = driver.getWindowHandles(); getScreenShot(driver); Thread.sleep(2000); for(String windowHandle : windowHandles) { if(!windowHandle.equals(driver.getWindowHandle())) { driver.switchTo().window(windowHandle); } } getScreenShot(driver); driver.quit(); } public void getScreenShot(WebDriver driver) throws IOException { SimpleDateFormat sim1 = new SimpleDateFormat(\"yyyy-MM-dd\"); SimpleDateFormat sim2 = new SimpleDateFormat(\"HHmmssSS\"); String dirTime = sim1.format(System.currentTimeMillis()); String fileTime = sim2.format(System.currentTimeMillis()); String fileName = \"./src/test/image/\"+dirTime+\"/test_\"+fileTime+\".png\"; File screenshotAs = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(screenshotAs,new File(fileName)); }
等待机制
这里了解一个常见报错 NosuchElementException 出现这个报错的原因主要有以下几种
1、元素选择错误
2、匹配方式不对,xpath->selector
3、自动化打开的界面与手动打开界面不一致(如登录状态不同)
4、动态生成的元素
5、代码执行的速度比页面渲染速度快
这里为了防止因为第五种情况造成的误判,selenium提供了三种等待方式
强制等待
Thread.sleep();
优点:使用简单,调试的时候比较有效
缺点:影响运行速率,浪费大量时间
隐式等待
隐式等待是一种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错。
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
隐式等待作用在所有元素上,会等待所有元素加载成功,只要driver对象没有释放,隐式等待会一直生效
若是想等待某一固定元素,隐式等待也会有额外的时间消耗,且隐式等待只能等待页面元素,无法等待弹窗
显示等待
显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码
new WebDriverWait(driver, Duration.ofSeconds(3)).until($express);
其中$express-->涉及到了selenium.support.ui.ExpectedConditions包下的ExpectedConditions类
返回值:boolean
ExpectedConditions预定义方法的一些示例
elementToBeclickable(By locator)-用于检查元素的期望是可见的并已启用,以便您可以单击它。
textToBe(Bylocator,string str)-检查元素。(精确匹配)
presence0fElementLocated(Bylocator)-检查页面的DOM上是否存在元素
urlToBe(java.lang.String url)-检査当前页面的 URL是一个特定的 URL。
示例
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions .presenceOfElementLocated(By.xpath(\"//*[@id=\\\"2\\\"]\")));
官方建议:显示等待与隐式等待不建议一起使用,会致使不可预测的等待时间
弹窗
弹窗是在页面上找不到的元素需要做特殊处理,要使用Selenium的alert接口
当页面出现弹窗,必须要进行处理
Alert alert = driver.switchTo().alert();alert.accept();alert.dismiss();alert.getText();alert.sendKeys(\"Test\");
一般建议用显示等待来处理弹窗
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));wait.until(ExpectedConditions.alertIsPresent());
文件上传
点击文件上传的场景会弹窗系统窗口,进行文件的选择
selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别
但是可以使用sendKeys() 来上传指定路径文件
WebElement ele = driver.findElement(By.cssSelector(\"body > div > div > input[type=file]\"));ele.sendKeys(\"D:\\\\upload.html\");
浏览器参数设置
设置无头模式
在 Selenium 中,无头模式(Headless Mode) 是指浏览器在无图形界面(GUI)的情况下运行,仅在后台执行自动化操作。这种模式适合在服务器、CI/CD 环境或不需要可视化界面的场景中使用,能显著减少资源占用(内存、CPU)并提高运行速度。
WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();// 对于 Chrome 112+,推荐使用 \"--headless=new\"(新无头模式,功能更完整)options.addArguments(\"--headless=new\");// 旧版无头模式(不推荐,可能逐步被淘汰)// options.addArguments(\"--headless\");
设置加载策略
在 Selenium 中,页面加载策略(Page Load Strategy) 用于控制 WebDriver 等待页面加载完成的时机。简单来说,它决定了浏览器在什么时候停止等待页面加载,并允许脚本继续执行后续操作。这对于优化自动化脚本的执行速度(尤其是处理加载缓慢的页面)非常重要。
normal
eager
none
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);//最慢options.setPageLoadStrategy(PageLoadStrategy.EAGER);options.setPageLoadStrategy(PageLoadStrategy.NONE);//最快
要为重活而高兴,不要为死去的忧伤。 ——林清玄
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐
制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸