当前位置: 首页 > news >正文

八、自动化函数

1.元素的定位

web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。

常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector

常用的主要由cssSelector和xpath

1.1 cssSelector选择器

选择器的功能:选中页面中指定的标签元素

选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位。

selector选择器

xpath

XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点。

xpath使用路径表达式来选择xml文档中的节点

xpath语法中:

xpath://*[@id=“kw”]

1.2.1 获取HTML页面所有的节点

//*

1.2.2 获取HTML页面指定的节点

//[指定节点]

//ul:获取HTML页面所有的ul节点

//input:获取HTML页面所有的input节点

1.2.3 获取一个节点中的直接子节点

/

//span/input

1.2.4 获取一个节点的父节点

//input/…获取input节点的父节点

1.2.5实现节点属性的匹配

[@…]

//*[@id=‘kw’]匹配HTML页面中id属性为kw的节点

1.2.6 使用指定索引的方式获取对应的节点内容

注意:xpath的索引是从1开始的。

百度热搜xpath定位://*[@id=“s-hotsearch-wrapper”]/div

更便捷的生成selector/xpath的方式:右键选择复制"Copy selector/xpath"

没有这样的元素

注意:登录状态下和非登录状态下自动化打开的页面不一定相同,因为在做自动化测试一定要注意页面状态的一致性NoSuchElementException找不到元素异常

findElement(By) 在页面查找元素,返回值Element

findElements(By) 在页面查找元素,返回值为List

2.操作测试对象

获取到了页面的元素之后,接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清除、获取文本。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class SeleniumChromeTest {

    public static void main(String[] args) throws InterruptedException {
        // 设置 ChromeDriver 的路径
        String chromeDriverPath = "D:\\网页下载\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"; // 替换为你的 chromedriver 路径
        System.setProperty("webdriver.chrome.driver", chromeDriverPath);

        // 配置 Chrome 浏览器选项
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*"); // 解决某些版本的兼容性问题

        // 初始化 ChromeDriver
        WebDriver driver = new ChromeDriver(options);

        try {
            // 打开目标网页
            driver.get("https://www.baidu.com");

            // 等待页面加载完成
            Thread.sleep(2000);

            // 定位搜索框元素
            WebElement searchBox = driver.findElement(By.id("kw"));

            // 在搜索框中输入内容
            searchBox.sendKeys("Selenium Java 自动化测试");

            // 定位“百度一下”按钮
            WebElement searchButton = driver.findElement(By.id("su"));

            // 点击按钮提交搜索
            searchButton.click();

            // 等待搜索结果加载完成
            Thread.sleep(3000);

            // 输出当前页面的标题
            System.out.println("当前页面标题: " + driver.getTitle());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭浏览器
            driver.quit();
        }
    }
}
2.1点击/提交对象

click()

// 找到百度一下按钮并点击

driver.findElement(By.cssSelector(“#su”)).click();

除了按钮之外,页面的绝大多数元素都可以点击

页面隐藏的标签、不可见的标签就不能点击。

第一步筛选:看标签的属性是否有hidden关键字

第二步:看每个标签对应的样式

2.2模拟按键输入

sendKeys(“”)

driver.findElement(By.cssSelector(“#kw”)).sendKeys(“输入文字”);

输入框可以接收的内容都可以通过sendKeys发送过去

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.time.Duration;
import java.util.List;

public class FirstTest {
    WebDriver driver = null;

    void createDriver() {
        String chromeDriverPath = "D:\\网页下载\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"; // 替换为你的 chromedriver 路径
        System.setProperty("webdriver.chrome.driver", chromeDriverPath);
        // 增加浏览器配置:创建驱动对象要强制指定允许访问所有的链接

        // 配置 Chrome 浏览器选项
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*"); // 解决某些版本的兼容性问题

        // 初始化 ChromeDriver
        driver = new ChromeDriver(options);

    }

    // 测试百度搜索关键字:迪丽热巴
    void test01() throws InterruptedException {

        createDriver();

        try {
            // 2.输入完整的网址: https://www.baidu.com
            driver.get("https://www.baidu.com");
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
            // 3.找到输入框,并输入关键词:迪丽热巴
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#kw"))).sendKeys("迪丽热巴");
            // 4.找到百度一下按钮,并点击
            wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#su"))).click();
        } catch (Exception e) {
            e.printStackTrace();
            takeScreenshot();
        } finally {
            if (driver != null) {
                Thread.sleep(8000);
                // 5.关闭浏览器
                driver.quit();
            }
        }
    }

    private void takeScreenshot() {
        if (driver != null) {
            try {
                File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
                FileUtils.copyFile(screenshot, new File("screenshot.png"));
                System.out.println("截图已保存到 screenshot.png");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    // 元素的定位
    void test02() throws InterruptedException {
        createDriver();
        // 选择器
        driver.findElement(By.cssSelector("#s-hotsearch-wrapper > div"));
        driver.findElement(By.xpath("//*[@id=\"s-hotsearch-wrapper\"]/div"));
        List<WebElement> ll = driver.findElements(By.cssSelector("#hotsearch-content-wrapper > li > a >span.title-content-title"));
        for (int i = 0; i < 10; i++) {
            // 获取元素Ele对应的文本
            System.out.println(ll.get(i).getText());
        }
        driver.quit();
    }


    // 操作元素
    void test03() throws InterruptedException {
        createDriver();

//        WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//        ele.click();

        try {
            // 打开目标网页
            driver.get("https://www.baidu.com");

            // 等待页面加载完成
            Thread.sleep(2000);
            // 这两行代码是上面的测试代码
//            WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//            ele.click();

            // 定位搜索框元素
            WebElement searchBox = driver.findElement(By.id("kw"));

            // 在搜索框中输入内容
            searchBox.sendKeys("Java语言");

            // 定位“百度一下”按钮
            WebElement searchButton = driver.findElement(By.id("su"));

            // 点击按钮提交搜索
            searchButton.click();

            // 等待搜索结果加载完成
            Thread.sleep(3000);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭浏览器
            driver.quit();
        }
    }
}
2.3清除文本内容

输入文本后又想换一个新的关键词,这里就需要用到clear()

若想要在一个场景下更换多个关键词,需要将前一个关键词清除掉,若不清除,每次sendKeys将完成拼接的操作

void test03() throws InterruptedException {
        createDriver();

//        WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//        ele.click();

        try {
            // 打开目标网页
            driver.get("https://www.baidu.com");

            // 等待页面加载完成
            Thread.sleep(2000);
            // 这两行代码是上面的测试代码
//            WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//            ele.click();

            // 定位搜索框元素
            WebElement searchBox = driver.findElement(By.id("kw"));

            // 在搜索框中输入内容
            searchBox.sendKeys("Java语言");
            Thread.sleep(2000);
            searchBox.clear();
            Thread.sleep(2000);
            searchBox.sendKeys("赏心悦目的图片");

            // 定位“百度一下”按钮
            WebElement searchButton = driver.findElement(By.id("su"));

            // 点击按钮提交搜索
            searchButton.click();

            // 等待搜索结果加载完成
            Thread.sleep(3000);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭浏览器
            driver.quit();
        }
    }
2.4获取文本信息

如果判断获取到的元素对应的文本是否符合预期呢?获取元素对应的文本并打印一下

获取文本信息:getText()

为什么打印的txt为空?

因为"百度一下"是input标签里的属性值 getAttribute(String)

2.5获取当前页面标题和URL

getTitle()

getCurrentUrl()

3.窗口设置大小

1)窗口的大小设置

// 窗口最小化
driver.manage().window().minimize();
// 窗口最大化
driver.manage().window().maximize();
// 窗口全屏
driver.manage().window().fullscreen();
// 手动设置窗口大小
driver.manage().window().setSize(new Dimension(800, 600));

打开百度新闻(窗口的切换)

是两个新闻标签页

1)获取当前页面句柄

driver.getWindowHandle();

2)获取所有页面句柄:

driver.getWindowHandles();

void test04() {
    createDriver();
    try {
        // 打开百度首页
        driver.get("https://www.baidu.com");
        System.out.println("已打开百度首页:" + driver.getTitle());

        // 显式等待页面加载完成
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

        // 点击“新闻”链接
        WebElement newsLink = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s-top-left > a:nth-child(1)")));
        newsLink.click();
        System.out.println("已点击新闻链接");

        // 获取当前窗口句柄
        String curHandle = driver.getWindowHandle();
        System.out.println("当前窗口句柄为:" + curHandle);
        System.out.println("===============================================");

        // 获取所有窗口句柄并切换到新窗口
        Set<String> allHandles = driver.getWindowHandles();
        for (String handle : allHandles) {
            if (!handle.equals(curHandle)) { // 使用 equals() 比较字符串
                driver.switchTo().window(handle);
                System.out.println("跳转之后:" + driver.getTitle());

                // 显式等待目标元素加载完成
                WebElement headlineTabs = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#headline-tabs > ul")));
                System.out.println("找到目标元素:" + headlineTabs.getText());
                break; // 切换到新窗口后退出循环
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // 关闭浏览器
        if (driver != null) {
            driver.quit();
        }
    }
}

相关文章:

  • 单基因高低分组和相关基因的GSEA等富集分析教程,代做分析
  • dev中使用auto的方法
  • AETTA: Label-Free Accuracy Estimation for Test-Time Adaptation
  • python编程-实现非确定性有限自动机
  • 正弦波有效值和平均值(学习笔记)
  • 探秘Transformer系列之(27)--- MQA GQA
  • 【一篇关于自我刷题的思考】
  • 使用Python进行AI图像生成:从GAN到风格迁移的完整指南
  • 如何安装git?
  • 智能Todo协作系统开发日志(二):架构优化与安全增强
  • 算法题(125):子集
  • AJAX与Axios基础
  • 网页爬虫--赶集网租房信息爬取(Python)
  • 开源模型应用落地-模型上下文协议(MCP)-第三方MCP Server实战指南(五)
  • 机器学习 从入门到精通 day_05
  • 生成式引擎优化(GEO)发展史与行业标准演变
  • (三) 傅里叶变换:把信号拆成音符的秘密
  • 【LLM】解锁Agent协作:深入了解谷歌 A2A 协议与 Python 实现
  • 邮件发送频率如何根据用户行为动态调整?
  • # 更换手机热点后secureCRT无法连接centOS7系统
  • 2025全球智慧城市指数排名揭晓,阿布扎比跃升至第五位
  • 中国田协通报苏州马拉松“方便门”处理情况:涉事10人禁赛3年
  • 陕西全省公开征集涉企行政执法问题线索,切实减轻企业负担
  • 詹妮弗·劳伦斯、罗伯特·帕丁森新片入围戛纳主竞赛单元
  • 潘功胜在美谈关税:吁全球经济勿滑向“高摩擦、低信任”轨道
  • 从“龙队”到“龙副”,国乒这批退役球员为何不爱当教练了