Selenium-Java版(操作元素)

选择和操控元素的基本方法

前言

选择元素

选择元素的方法

[根据 id属性选择元素](#根据 id属性选择元素)

根据class属性选择元素

根据tag名选择元素

通过WebElement对象选择元素

示例

等待界面元素出现

原因

解决

操控元素

点击元素

输入框

获取元素信息

获取元素文本内容

获取元素属性

获取整个元素对应的HTML

获取输入框里面的文字


前言

参考教程:Python + Selenium Web自动化 2024版 - 自动化测试 爬虫_哔哩哔哩_bilibili

上期文章:Selenium-Java版(环境安装)-CSDN博客

选择元素

选择元素的方法

1.打开开发者工具,选择元素标签

2.点击左上角小箭头

根据 id属性选择元素

根据id选择元素是最简单高效的方式

运行代码

java 复制代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建WebDriver对象
        WebDriver wd = new EdgeDriver();

        // 调用get方法打开指定网址
        wd.get("https://www.byhy.net/cdn2/files/selenium/stock1.html");

        // 根据id选择元素,返回的就是该元素对应的WebElement对象
        WebElement element = wd.findElement(By.id("kw"));

        // 通过该 WebElement对象,就可以对页面元素进行操作了
        // 比如输入字符串到这个输入框里
        element.sendKeys("通讯\n");

        // 创建Scanner对象等待用户输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("等待回车键结束程序");
        scanner.next();

        // 关闭浏览器
        wd.quit();
    }
}

根据class属性选择元素

获取所有class属性值为animal的元素对应的WebElement对象,放在一个列表里

复制代码
        List<WebElement> elements = wd.findElements(By.className("animal"));

这里的findElements方法不能少了最后一个s,否则只能返回第一个元素的对象

运行代码

java 复制代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;

import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建WebDriver对象
        WebDriver wd = new EdgeDriver();

        // 调用get方法打开指定网址
        wd.get("https://www.byhy.net/cdn2/files/selenium/sample1.html");

        // 根据 class name 选择元素,返回的是一个列表
        // 里面都是class 属性值为 animal的元素对应的 WebElement对象
        List<WebElement> elements = wd.findElements(By.className("animal"));

        // 取出列表中的每个 WebElement对象,打印出其text属性的值
        // text属性就是该 WebElement对象对应的元素在网页中的文本内容
        for (WebElement element : elements) {
            System.out.println(element.getText());
        }

        // 创建Scanner对象等待用户输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("等待回车键结束程序");
        scanner.next();

        // 关闭浏览器
        wd.quit();
    }
}

输出元素

一个元素可以有多个class 类型,用空格分开

html 复制代码
<div class="plant big">

        <span>土豆</span>

</div> 

只能指定任意一个class 属性值来选择元素

java 复制代码
wd.findElements(By.className("plant"));

java 复制代码
wd.findElements(By.className("big"));

而不能

java 复制代码
wd.findElements(By.className("animal big"));

根据tag名选择元素

通过指定参数为By.tagName,选择所有的tag名为span的元素

java 复制代码
List<WebElement> elements = wd.findElements(By.tagName("span"));

运行结果

通过WebElement对象选择元素

WebDriver对象选择元素的范围是整个 web页面

WebElement对象选择元素的范围是该元素的内部

示例

在id为container的元素里面找到tag名为span的元素

运行代码

java 复制代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;

import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建WebDriver对象
        WebDriver wd = new EdgeDriver();

        // 调用get方法打开指定网址
        wd.get("https://www.byhy.net/cdn2/files/selenium/sample1.html");

        // 根据ID选择元素,限制选择范围是id为'container'的元素内部
        WebElement element = wd.findElement(By.id("container"));

        // 查找id为'container'内部的所有span元素
        List<WebElement> spans = element.findElements(By.tagName("span"));

        // 遍历spans列表并打印每个span的文本内容
        for (WebElement span : spans) {
            System.out.println(span.getText());
        }

        // 创建Scanner对象等待用户输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("等待回车键结束程序");
        scanner.next();

        // 关闭浏览器
        wd.quit();
    }
}

输出结果

等待界面元素出现

运行代码

java 复制代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;

import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建WebDriver对象
        WebDriver wd = new EdgeDriver();

        // 调用get方法打开指定网址
        wd.get("https://www.byhy.net/cdn2/files/selenium/stock1.html");

        // 根据ID选择元素
        WebElement element = wd.findElement(By.id("kw"));

        // 向该元素发送文本 '通讯' 并按下回车键
        element.sendKeys("通讯\n");

        // 返回页面ID为'1'的元素
        WebElement elementWithId1 = wd.findElement(By.id("1"));

        // 打印该元素的文字内容
        System.out.println(elementWithId1.getText());

        // 创建Scanner对象等待用户输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("等待回车键结束程序");
        scanner.next();

        // 关闭浏览器
        wd.quit();
    }
}

此时打开了网站,并和预期结果一致,查询了"通信"

但程序会报错,没有打印id为1的元素的文字内容

原因

代码的执行速度比网站的响应速度快很多,代码在执行如下代码时:

复制代码
WebElement elementWithId1 = wd.findElement(By.id("1"));

网站还没有返回查询结果,所以代码执行时找不到id为1的元素,因此报错

解决

创建WebDriver对象后,加入这行代码 ,调用隐式等待方法

java 复制代码
wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

当找不到元素时,不立马报错。

而是每隔半秒钟重新寻找该元素,直到找到为止,

如果超出指定最大等待时长(这里是10秒),才会报错。

运行代码

java 复制代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;

import java.time.Duration;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建WebDriver对象
        WebDriver wd = new EdgeDriver();
        wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

        // 调用get方法打开指定网址
        wd.get("https://www.byhy.net/cdn2/files/selenium/stock1.html");

        // 根据ID选择元素
        WebElement element = wd.findElement(By.id("kw"));

        // 向该元素发送文本 '通讯' 并按下回车键
        element.sendKeys("通讯\n");

        // 返回页面ID为'1'的元素
        WebElement elementWithId1 = wd.findElement(By.id("1"));

        // 打印该元素的文字内容
        System.out.println(elementWithId1.getText());

        // 创建Scanner对象等待用户输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("等待回车键结束程序");
        scanner.next();

        // 关闭浏览器
        wd.quit();
    }
}

输出结果

也可以在查询后执行如下这条代码,让程序休息一秒等浏览器访问,再找元素。

java 复制代码
Thread.sleep(1000);

操控元素

点击元素

java 复制代码
WebElement element=wd.findElement(By.id("go"));
element.click();

输入框

网站的初始界面

运行代码

java 复制代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;

import java.time.Duration;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建WebDriver对象
        WebDriver wd = new EdgeDriver();
        wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

        // 调用get方法打开指定网址
        wd.get("https://www.byhy.net/cdn2/files/selenium/test3.html");

        // 查找元素
        WebElement element = wd.findElement(By.id("input1"));

        // 清除输入框已有的字符串
        element.clear();

        // 输入新字符串
        element.sendKeys("张三");

        // 创建Scanner对象等待用户输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("等待回车键结束程序");
        scanner.next();

        // 关闭浏览器
        wd.quit();
    }
}

clear方法可以把输入框中已有内容清除

自动打开网站的界面

获取元素信息

获取元素文本内容

getText

java 复制代码
 // 查找元素
WebElement element = wd.findElement(By.id("animal"));

// 打印元素的文本
System.out.println(element.getText());

如果获取文本内容出错,可以试一下这两个方法

java 复制代码
        // 获取并打印元素的innerText属性
        String innerText = element.getAttribute("innerText");
        System.out.println(innerText);
java 复制代码
        // 获取并打印元素的textContent属性
        String textContent = element.getAttribute("textContent");
        System.out.println(textContent);

获取元素属性

getAttribute

java 复制代码
// 查找元素
WebElement element = wd.findElement(By.id("input_name"));

// 获取并打印元素的class属性
System.out.println(element.getAttribute("class"));

获取整个元素对应的HTML

获取整个元素对应的HTML文本内容

java 复制代码
// 获取并打印元素的outerHTML属性
String outerHTML = element.getAttribute("outerHTML");
System.out.println(outerHTML);

获取元素**内部**的HTML文本内容

java 复制代码
// 获取并打印元素的innerHTML属性
String innerHTML = element.getAttribute("innerHTML");
System.out.println(innerHTML);

获取输入框里面的文字

获取输入框里面的文字内容不能用getText,要用getArrtibute("value")

java 复制代码
// 查找元素
WebElement element = wd.findElement(By.id("input1"));

// 获取并打印输入框中的文本
String value = element.getAttribute("value");
System.out.println(value);
相关推荐
海南java第二人1 分钟前
SpringBoot启动流程深度解析:从入口到容器就绪的完整机制
java·开发语言
问今域中3 分钟前
Spring Boot 请求参数绑定注解
java·spring boot·后端
星火开发设计5 分钟前
C++ queue 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识·队列
rgeshfgreh7 分钟前
Java+GeoTools+PostGIS高效求解对跖点
java
鱼跃鹰飞8 分钟前
DDD中的防腐层
java·设计模式·架构
计算机程序设计小李同学11 分钟前
婚纱摄影集成管理系统小程序
java·vue.js·spring boot·后端·微信小程序·小程序
栈与堆1 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦1 小时前
03-01:MQ常见问题梳理
java·开发语言
一 乐1 小时前
绿色农产品销售|基于springboot + vue绿色农产品销售系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·宠物
lhrimperial1 小时前
企业智能知识库助手落地实践:从RAG到Multi-Agent
java·spring cloud·微服务·系统架构·知识图谱