Selenium自动化测试学习

Selenium基础

Selenium是一个用于Web应用程序测试的强大工具。它支持多种浏览器和编程语言,可以模拟真实用户的操作。

Selenium组件

WebDriver基础

WebDriver是Selenium的核心组件,用于控制浏览器进行自动化测试。

基本设置

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class BasicTest {
    public static void main(String[] args) {
        // 设置ChromeDriver路径
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        
        // 创建WebDriver实例
        WebDriver driver = new ChromeDriver();
        
        // 打开网页
        driver.get("https://www.example.com");
        
        // 关闭浏览器
        driver.quit();
    }
}

元素定位

Selenium提供了多种方式来定位网页元素:

// 通过ID定位
WebElement element = driver.findElement(By.id("username"));

// 通过类名定位
WebElement element = driver.findElement(By.className("login-button"));

// 通过XPath定位
WebElement element = driver.findElement(By.xpath("//input[@name='username']"));

// 通过CSS选择器定位
WebElement element = driver.findElement(By.cssSelector("#login-form input"));

// 通过链接文本定位
WebElement element = driver.findElement(By.linkText("登录"));

// 通过部分链接文本定位
WebElement element = driver.findElement(By.partialLinkText("登录"));

元素操作

可以对定位到的元素进行各种操作:

// 点击元素
element.click();

// 输入文本
element.sendKeys("test@example.com");

// 清除文本
element.clear();

// 获取文本
String text = element.getText();

// 获取属性值
String value = element.getAttribute("value");

// 检查元素是否可见
boolean isVisible = element.isDisplayed();

// 检查元素是否启用
boolean isEnabled = element.isEnabled();

// 检查元素是否被选中
boolean isSelected = element.isSelected();

等待机制

Selenium提供了多种等待机制来确保元素可用:

import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;

// 显式等待
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("username")));

// 隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

// 等待元素可点击
wait.until(ExpectedConditions.elementToBeClickable(By.id("submit-button")));

// 等待元素可见
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("message")));

// 等待元素消失
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading")));

框架和iframe

处理框架和iframe的方法:

// 切换到iframe
driver.switchTo().frame("frame-name");

// 切换回主文档
driver.switchTo().defaultContent();

// 切换到父框架
driver.switchTo().parentFrame();

// 通过索引切换iframe
driver.switchTo().frame(0);

// 通过WebElement切换iframe
WebElement frame = driver.findElement(By.id("frame-id"));
driver.switchTo().frame(frame);

窗口处理

处理多个浏览器窗口的方法:

// 获取当前窗口句柄
String currentHandle = driver.getWindowHandle();

// 获取所有窗口句柄
Set handles = driver.getWindowHandles();

// 切换到新窗口
for (String handle : handles) {
    if (!handle.equals(currentHandle)) {
        driver.switchTo().window(handle);
        break;
    }
}

// 关闭当前窗口
driver.close();

// 关闭所有窗口
driver.quit();

截图功能

捕获浏览器窗口和元素的截图:

// 捕获整个页面截图
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("screenshot.png"));

// 捕获元素截图
WebElement element = driver.findElement(By.id("logo"));
File elementScreenshot = element.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(elementScreenshot, new File("element-screenshot.png"));