Selenium 浏览器操作与使用技巧——详细解析(Java版)

目录

一、浏览器及窗口操作

二、键盘与鼠标操作

三、勾选复选框

四、多层框架/窗口定位

五、操作下拉框

六、上传文件操作

[七、处理弹窗与 alert](#七、处理弹窗与 alert)

八、处理动态元素

[九、使用 Selenium 进行网站监控](#九、使用 Selenium 进行网站监控)


前言

Selenium 是一款非常强大的 Web 自动化测试工具,能够帮助开发者与测试人员进行浏览器的自动化操作。通过 Selenium,您不仅可以进行传统的自动化测试,还可以实现网站监控、动态元素处理、用户交互等高级功能。本文将详细介绍 Selenium 的一些常见操作,包括浏览器控制、元素交互、截图、文件上传、动态元素等待等,以及如何用 Selenium 实现网站监控。

一、浏览器及窗口操作

Selenium 提供了丰富的 API 进行浏览器的控制和操作,下面是一些常见的浏览器窗口操作:

1.1 打开网页与基本浏览器操作

java 复制代码
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com"); // 打开百度首页
webDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴"); // 搜索
webDriver.findElement(By.cssSelector("#su")).click(); // 点击搜索

1.2 前进、后退与刷新

java 复制代码
webDriver.navigate().back(); // 浏览器后退
webDriver.navigate().refresh(); // 刷新
webDriver.navigate().forward(); // 浏览器前进

1.3 浏览器窗口操作

滚动条操作
java 复制代码
((JavascriptExecutor) webDriver).executeScript("document.documentElement.scrollTop=10000"); // 向下滚动页面
最大化与全屏
java 复制代码
webDriver.manage().window().maximize(); // 最大化浏览器
webDriver.manage().window().fullscreen(); // 全屏浏览器
设置窗口大小与位置
java 复制代码
webDriver.manage().window().setSize(new Dimension(800, 600)); // 设置窗口大小
Dimension size = webDriver.manage().window().getSize(); // 获取窗口大小
webDriver.manage().window().setPosition(new Point(100, 100)); // 设置窗口位置
Point position = webDriver.manage().window().getPosition(); // 获取窗口位置

1.2 浏览器截图操作

需要导入依赖包,如Commons IO,进行截图操作

XML 复制代码
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>
java 复制代码
private static void takeScreenshot() throws IOException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
    webDriver.findElement(By.cssSelector("#su")).click();
    sleep(3000);

    // 截图并保存
    File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(file, new File("d://测试.png"));
}

二、键盘与鼠标操作

Selenium 提供了 Actions 类来模拟鼠标操作和 Keys 类来模拟键盘操作。包括文本输入、按键和组合键序列,增强自动化脚本的用户交互能力

2.1键盘操作:

通过sendKeys()调用

单个使用:

  1. sendKeys(Keys.TAB) # TAB
  2. sendKeys(Keys.ENTER) # 回车
  3. sendKeys(Keys.SPACE) #空格键
  4. sendKeys(Keys.ESCAPE) #回退键(Esc)

组合使用:

  1. sendKeys(Keys.CONTROL,'a') #全选(Ctrl+A)
  2. sendKeys(Keys.CONTROL,'c') #复制(Ctrl+C)
  3. sendKeys(Keys.CONTROL,'x') #剪贴(Ctrl+X)
  4. sendKeys(Keys.CONTROL,'v') #粘贴(Ctrl+V)
java 复制代码
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");

// 组合键操作
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "A"); // 全选
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "X"); // 剪切
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "V"); // 粘贴

2.2 鼠标操作

通过ActionChains 类实现鼠标执行的操作:

  1. contextClick() 右击
  2. doubleClick() 双击
  3. dragAndDrop() 拖动
  4. moveToElement() 移动
  5. selenium不能模拟鼠标滚轮操作
java 复制代码
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
WebElement element = webDriver.findElement(By.cssSelector("#kw"));

// 鼠标右击
Actions actions = new Actions(webDriver);
actions.moveToElement(element).contextClick().perform();  // 右键点击

三、勾选复选框

  • 选中一组type为checkbox的数据
java 复制代码
private static void selectCheckboxes() {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("http://localhost:63342/Test/src/main/page/teste01.html");
    List<WebElement> elements = webDriver.findElements(By.cssSelector("input"));
    for (WebElement element : elements) {
        if ("checkbox".equals(element.getAttribute("type"))) {
            element.click();  // 勾选复选框
        }
    }
}

四、多层框架/窗口定位

对于一个web 应用,经常会出现框架(iframe) 或窗口(window)的应用,对于这种应用我们在定位元素时就不能直接右击copy他的xpath或者是cssselector来定位;而是要通过switchTo()方法定位到frame下或者window下,然后再通过元素css选择器或者xpath定位。

例如:

java 复制代码
 private static void page02() {
        // 创建浏览器驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("http://localhost:63342/Test/src/main/page/test02.html?_ijt=ukda3p0a62ntrthar4gi039p32&_ij_reload=RELOAD_ON_SAVE");
        // 若是iframe应用,需要先定位到frame下再定位到click
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body > div > div > a")).click();
        // 若目标元素不在iframe,可以直接获取
//        String h3_text = webDriver.findElement(By.cssSelector("body > div > div > h3")).getText();
//        System.out.println(h3_text);
    }

4.1 iframe

java 复制代码
private static void switchToIframe() {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("http://localhost:63342/Test/src/main/page/test02.html");
    webDriver.switchTo().frame("f1");
    webDriver.findElement(By.cssSelector("body > div > div > a")).click();
}

4.2 窗口

java 复制代码
private static void switchWindow() {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
    
    // 获取所有窗口句柄并切换
    Set<String> handles = webDriver.getWindowHandles();
    String targetHandle = handles.iterator().next();
    webDriver.switchTo().window(targetHandle);

    webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
    webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
}

五、操作下拉框

下拉框里的内容需要进行两次定位:

  1. 定位到下拉框本身,进行操作;
  2. 定位到下拉框内的选项。
java 复制代码
private static void page03() {
    // 创建浏览器驱动
    WebDriver webDriver = new ChromeDriver();
    // 打开网页
    webDriver.get("http://url地址");
    // 操作下拉框
    Select select = new Select(webDriver.findElement(By.cssSelector("#ShippingMethod")));
    // select.selectByValue("12.51"); // 可按值选择
    select.selectByIndex(2); // 按索引选择
}

六、上传文件操作

在 Selenium WebDriver 中,只需定位上传按钮,通过 sendKeys 方法添加本地文件路径即可。

可以使用绝对路径或相对路径,前提是上传的文件存在。

java 复制代码
private static void page05() {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("http://url地址");
    // 找到上传按钮(input元素),并输入本地文件路径
    webDriver.findElement(By.cssSelector("input")).sendKeys("C:\\Users\\34085\\Desktop\\hello.txt");
}

七、处理弹窗与 alert

使用 Alert 类处理浏览器弹窗。

java 复制代码
private static void handleAlert() {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("http://url地址");
    webDriver.findElement(By.cssSelector("button")).click();

    // 处理 alert 弹窗
    webDriver.switchTo().alert().accept(); // 点击确认
    webDriver.switchTo().alert().dismiss(); // 点击取消
    webDriver.switchTo().alert().sendKeys("你好"); // 输入文本
    webDriver.switchTo().alert().accept(); // 确认
}

八、处理动态元素

动态元素通常在页面加载后通过 JavaScript 动态生成。可以通过显式等待和隐式等待来处理动态元素。

1. 使用 WebDriverWait 和 ExpectedConditions

动态元素可以使用 WebDriverWaitExpectedConditions 来等待元素在页面上可见或可点击。

java 复制代码
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("dynamicElement")));
2. 根据部分属性值定位

如果元素的 ID 或 class 是动态生成的,可以使用 XPath 中的 contains()starts-with()ends-with() 函数来定位。

java 复制代码
// 匹配包含 "auto-id" 的 ID 元素
driver.findElement(By.xpath("//div[contains(@id, 'auto-id')]"));
3. 根据相对关系定位

如果动态元素与其父节点、子节点或兄弟节点有固定的相对关系,可以通过这些关系来定位动态元素。

4. 根据 DOM 顺序索引定位

可以通过元素在 DOM 中的顺序索引来定位该元素。但这种方法可能不够稳定,建议尽量使用其他方法。

5. 使用 CSS 选择器

CSS 选择器提供了一种灵活的方式来定位元素,特别是当元素的 ID 或 class 是动态生成时。例如,可以通过 CSS 属性选择器定位元素。

java 复制代码
driver.findElement(By.cssSelector("input[type='text']"));
6. 结合使用多种定位方法

在某些情况下,结合使用多种定位方法可以提高准确性和成功率。例如,可以先通过 CSS 选择器定位父元素,再通过相对路径定位子元素。

7. 优化等待时间

动态元素的加载可能需要一些时间,因此合理设置等待时间对于提高脚本稳定性至关重要。避免使用硬编码的等待时间(如 Thread.sleep),而应使用 WebDriverWait 来动态等待元素加载完成。

九、使用 Selenium 进行网站监控

9.1 监听网页内容变化

java 复制代码
public class PriceWatcher {
    public static void main(String[] args) throws InterruptedException {
        System.setProperty("webdriver.chrome.driver", "chromedriver的地址");
        WebDriver driver = new ChromeDriver();
        driver.get("http://url地址");
        String previousPrice = "";
        
        while (true) {
            WebElement priceElement = driver.findElement(By.id("price"));
            String currentPrice = priceElement.getText();
            if (!currentPrice.equals(previousPrice)) {
                System.out.println("价格变动: " + currentPrice);
                previousPrice = currentPrice;
            }
            Thread.sleep(5000); // 每5秒检查一次
        }
    }
}

9.2 监控网络请求

java 复制代码
public class MonitorHttpRequests {
    public static void main(String[] args) {
        BrowserMobProxy proxy = new BrowserMobProxyServer();
        proxy.start(0);
        Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

        ChromeOptions options = new ChromeOptions();
        options.setProxy(seleniumProxy);
        WebDriver driver = new ChromeDriver(options);
        proxy.newHar("myHar");
        
        driver.get("http://url地址");
        
        List<HarEntry> entries = proxy.getHar().getLog().getEntries();
        for (HarEntry entry : entries) {
            System.out.println("请求网址: " + entry.getRequest().getUrl());
            System.out.println("响应状态: " + entry.getResponse().getStatus());
        }
        
        driver.quit();
        proxy.stop();
    }
}

总结

Selenium 是一个非常强大的自动化测试工具,除了传统的自动化测试应用,它还可以用于浏览器操作、动态元素处理、表单交互等多个场景。结合合理的等待机制、弹窗处理和网站监控等功能,Selenium 不仅可以帮助开发人员进行高效的测试,还能在实际应用中解决更多问题。

希望本文的分享能帮助您更好地理解和应用 Selenium!

相关推荐
晚晚不晚2 分钟前
后端token校验流程
java
南宫生43 分钟前
力扣动态规划-15【算法学习day.109】
java·学习·算法·leetcode·动态规划
xiaoshiguang31 小时前
LeetCode:96.不同的二叉搜索树
java·算法·leetcode·动态规划
hamster20211 小时前
力扣【416. 分割等和子集】详细Java题解(背包问题)
java·算法·leetcode
weixin_422778891 小时前
springboot 简化 spring开发
java·spring boot·spring
feathered-feathered1 小时前
详细解释java当中的所有知识点(前言及数据类型及变量)(第一部分)
java·开发语言·笔记·idea
苹果酱05672 小时前
【MySQL】MySQL客户端连接用 localhost和127.0.0.1的区别
java·spring boot·毕业设计·layui·课程设计
NicolasCage2 小时前
简易好用的加密算法 - BCrypt加密算法
java
亓才孓2 小时前
[JavaWeb]搜索表单区域
java·前端·css·css3·web
{⌐■_■}2 小时前
【gRPC-gateway】option定义规则及HttpBody响应
java·服务器·开发语言·golang·gateway