一、元素定位核心方法

1.1 单元素与多元素查找

​​findElement​​:返回匹配的第一个WebElement对象,若无元素则抛出异常
​​findElements​​:返回所有匹配元素的集合,若无匹配则返回空列表

// 获取百度搜索框(单元素)
WebElement searchBox = driver.findElement(By.id("kw"));

// 获取所有热搜条目(多元素)
List<WebElement> hotItems = driver.findElements(By.cssSelector(".hotsearch-item"));

二、定位器详解

2.1 CSS选择器实战

选择器类型示例应用场景
ID选择器#search-btn定位唯一元素
类选择器.news-title样式相同的元素组
属性选择器input[type='password']表单元素精准定位
后代选择器div.container > form层级结构明确的元素

​​开发者工具使用技巧​​:

  1. 按F12或右键"检查"打开开发者工具
  2. 使用Ctrl+Shift+C快速定位页面元素
  3. 在元素面板右键获取XPath/CSS路径

2.2 XPath高级定位

// 通过文本内容定位
By.xpath("//button[text()='登录']")

// 通过部分属性匹配
By.xpath("//a[contains(@href,'download')]")

// 多层嵌套定位
By.xpath("//div[@id='main']//li[3]/span")

三、元素操作全流程


3.1 findElement  

获取页面中的一个文本元素并打印出来,假如我想取的是这个元素

代码

public class Test01 {
    // 封装打开标签页方法
    public WebDriver openWeb() {
        // 下载驱动程序
        // 这里选择的是 edgeDriver,下载速度较快
        WebDriverManager.edgedriver().setup();
        // 配置驱动程序
        EdgeOptions options = new EdgeOptions();
        // 允许访问所有链接
        options.addArguments("--remote-allow-origins=*");
        // 打开浏览器标签页
        WebDriver driver = new EdgeDriver(options);
        return driver;
    }

    public void test1() {
        WebDriver driver = openWeb();

        driver.get("https://www.baidu.com");
        WebElement element = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[3]/a/span[2]"));
        System.out.println(element.getText());

        quitWed(driver);
    }

    // 封装关闭浏览器方法
    public void quitWed(WebDriver driver) {
        driver.quit();
    }
}

3.2 findElements 

获取所有热搜并打印出来

代码

public class Test01 {
    // 封装打开标签页方法
    public WebDriver openWeb() {
        // 下载驱动程序
        // 这里选择的是 edgeDriver,下载速度较快
        WebDriverManager.edgedriver().setup();
        // 配置驱动程序
        EdgeOptions options = new EdgeOptions();
        // 允许访问所有链接
        options.addArguments("--remote-allow-origins=*");
        // 打开浏览器标签页
        WebDriver driver = new EdgeDriver(options);
        return driver;
    }

    public void test1() {
        WebDriver driver = openWeb();

        driver.get("https://www.baidu.com");
        List<WebElement> element = driver.findElements(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li/a/span[2]"));
        for(WebElement e:element){
            System.out.println(e.getText());
        }

        quitWed(driver);
    }

    // 封装关闭浏览器方法
    public void quitWed(WebDriver driver) {
        driver.quit();
    }
}


3.3 点击提交对象

driver.findElements(By.xpath("....")).click();

3.4 模拟按键输入

driver.findElements(By.xpath("....")).sendKeys("...");

3.5 清除文本内容

        在找到搜索框并写入内容后,如果再执行本次操作,再次写入的内容就会追加到后面。所以此时就需要先清空上次写入的内容,再写入

driver.findElements(By.xpath("....")).clear();

3.6 获取当前页标题

System.out.println(driver.getTitle());

3.7 获取当前页 url

System.out.println(driver.getCurrentUrl());

四、窗口管理实战

4.1 多窗口操作流程

 不同的窗口又不同的句柄,如果想要操作对于窗口的句柄,就必须切换到相应的句柄。

举个例子:

如果我想在网页中打开图片网页,然后点击头像

public void test3() {
        WebDriver driver = openWeb();
        driver.get("https://www.baidu.com");
        driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[6]")).click();
        driver.findElement(By.xpath("//*[@id=\"app\"]/div/div[1]/div/div[3]/div[3]/ul/li[2]/a")).click();
        quitWed(driver);
    }

执行这个代码,会出现这样的报错

意味着没有找到这个元素,这就是在打开了一个新网页之后,句柄没有切换到对应当前网页的句柄,还是在原来的网页中寻找元素,所以当然找不到,所以就需要获取到所有的窗口和当前窗口,进行判定后,转换到当前窗口。

查询窗口

查询当前窗口:

driver.getWindowHandle();

查询所有窗口:

driver.getWindowHandles();

切换窗口

driver.switchTo().window(handle);

于是就可以根据这些窗口操作解决一开始提出来的问题,在代码中增加窗口操作。

public void test3() {
        WebDriver driver = openWeb();
        driver.get("https://www.baidu.com");
        driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[6]")).click();
        driver.getWindowHandles();
        String currentWindow = driver.getWindowHandle();
        for (String handle : driver.getWindowHandles()) {
            if (!handle.equals(currentWindow)) {
                driver.switchTo().window(handle);
            }
        }
        driver.findElement(By.xpath("//*[@id=\"app\"]/div/div[1]/div/div[3]/div[3]/ul/li[2]/a")).click();
        quitWed(driver);
    }

关闭窗口

driver.quit()

这意味着关闭浏览器,释放 driver 对象,如果想要再次使用 driver 对象,需要再次创建

driver.close()

关闭当前标签页,如果想要操作其他页面,就需要转换窗口的句柄

获取当前页的屏幕截图


​​五、等待机制详解​​

​​5.1 等待策略对比与基础用法​​

​​什么是等待机制?​​

在自动化测试中,由于页面加载速度或动态内容的影响,直接操作元素可能失败。等待机制通过设置合理的等待时间,确保元素加载完成后再进行操作。


​​(1) 强制等待(简单但低效)​​

​​定义​​:通过代码强制暂停固定时间,无论页面是否已加载完成。
​​适用场景​​:临时调试时手动观察页面变化。
​​代码示例​​:

// 暂停3秒(单位:毫秒)
Thread.sleep(3000);

​​缺点​​:

  • 无论页面是否加载完成都必须等待
  • 时间设置过长会浪费测试时间,过短可能导致失败

​​(2) 隐式等待(全局设置)​​

​​定义​​:为整个测试会话设置统一的等待时间,当查找元素时会自动轮询直到超时。
​​适用场景​​:所有元素加载时间相对稳定的项目。
​​代码示例​​:

// 设置全局隐式等待10秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

​​特性​​:

  • 只需设置一次即可全局生效
  • 找不到元素时才会触发等待,找到则立即继续

​​(3) 显式等待(精准控制)​​

​​定义​​:针对特定元素设置等待条件,只有满足条件(如元素可见、可点击)才会继续执行。
​​适用场景​​:处理动态加载内容或需要精确控制的场景。

// 等待搜索按钮可点击(最多等15秒)
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement searchBtn = wait.until(
    ExpectedConditions.elementToBeClickable(By.id("search-button"))
);

​​常用等待条件​​:

条件方法说明
elementToBeClickable元素可点击
visibilityOfElementLocated元素可见且已显示
textToBePresentInElement元素包含指定文本

​​5.2 推荐方案​

// 步骤1:设置隐式等待(兜底策略)
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

// 步骤2:对关键操作添加显式等待
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement input = wait.until(
    ExpectedConditions.visibilityOfElementLocated(By.id("username"))
);
input.sendKeys("test_user");

​​为什么这样用?​​

  • 隐式等待确保常规元素加载
  • 显式等待处理重要或动态元素

​​六、弹窗处理技巧​​

​​6.1 弹窗类型与基础操作​​

​​什么是浏览器弹窗?​​

由JavaScript触发的原生对话框,无法通过普通元素定位方式操作,必须使用Selenium的Alert接口处理。


​​(1) 警告弹窗(Alert)​​

​特征​​:仅有“确定”按钮。

// 获取弹窗对象
Alert alert = driver.switchTo().alert();

// 获取提示文本并确认
System.out.println("警告内容:" + alert.getText());
alert.accept();  // 点击确定

​典型场景​​:表单提交后的成功/失败提示。


​​(2) 确认弹窗(Confirm)​​

​​特征​​:有“确定”和“取消”按钮。

Alert confirm = driver.switchTo().alert();
if(confirm.getText().contains("确认删除")) {
    confirm.accept();  // 点击确定
} else {
    confirm.dismiss(); // 点击取消
}

​​典型场景​​:删除操作前的二次确认。


​​(3) 输入弹窗(Prompt)​​

​​特征​​:可输入文本的输入框。

Alert prompt = driver.switchTo().alert();
prompt.sendKeys("北京");  // 输入内容
prompt.accept();         // 提交

​​典型场景​​:需要用户输入地理位置或验证码。


​​6.2 统一处理模板​​

try {
    // 等待弹窗出现(最多等5秒)
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
    Alert alert = wait.until(ExpectedConditions.alertIsPresent());

    // 处理弹窗
    if (alert.getText().contains("确认")) {
        alert.accept();
    } else {
        alert.dismiss();
    }
} catch (TimeoutException e) {
    System.out.println("未出现弹窗");
}

​​七、浏览器优化配置​​

​​7.1 无头模式(Headless)​​

​​定义​​:不显示浏览器界面,直接在后台运行测试。
​​优点​​:节省资源、提高执行速度。

EdgeOptions options = new EdgeOptions();
options.addArguments("--headless=new");      // 启用无头模式
options.addArguments("--window-size=1920,1080"); // 设置虚拟窗口大小
WebDriver driver = new EdgeDriver(options);

​​适用场景​​:服务器环境或不需要观察界面的测试。


​​7.2 加载策略​​

​​定义​​:控制浏览器何时认为页面加载完成。

策略说明适用场景
​​NORMAL​​等待所有资源加载完成(默认)传统网页
​​EAGER​​仅等待HTML加载完成单页应用(SPA)
​​NONE​​不等待加载完成手动控制等待
options.setPageLoadStrategy(PageLoadStrategy.EAGER);

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐