Selenium是一个用于Web应用程序测试的强大工具。它支持多种浏览器和编程语言,可以模拟真实用户的操作。
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
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"));