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

Selenium-Java版(操作元素)

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

前言

选择元素

选择元素的方法

根据 id属性选择元素 

根据class属性选择元素

根据tag名选择元素 

通过WebElement对象选择元素 

示例

等待界面元素出现

原因 

解决 

操控元素 

点击元素

输入框 

获取元素信息

获取元素文本内容 

获取元素属性 

获取整个元素对应的HTML 

获取输入框里面的文字 


前言

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

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

选择元素

选择元素的方法

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

2.点击左上角小箭头

根据 id属性选择元素 

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

运行代码

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,否则只能返回第一个元素的对象 

运行代码

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类型,用空格分开 

<div class="plant big"><span>土豆</span></div> 

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

wd.findElements(By.className("plant"));

wd.findElements(By.className("big"));

而不能

wd.findElements(By.className("animal big"));

根据tag名选择元素 

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

List<WebElement> elements = wd.findElements(By.tagName("span"));

运行结果 

通过WebElement对象选择元素 

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

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

示例

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

运行代码

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();}
}

输出结果

等待界面元素出现

运行代码

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对象后,加入这行代码 ,调用隐式等待方法

wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

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

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

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

运行代码

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();}
}

输出结果

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

Thread.sleep(1000);

操控元素 

点击元素

WebElement element=wd.findElement(By.id("go"));
element.click();

输入框 

网站的初始界面

运行代码

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

 // 查找元素
WebElement element = wd.findElement(By.id("animal"));// 打印元素的文本
System.out.println(element.getText());

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

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

获取元素属性 

getAttribute 

// 查找元素
WebElement element = wd.findElement(By.id("input_name"));// 获取并打印元素的class属性
System.out.println(element.getAttribute("class"));

获取整个元素对应的HTML 

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

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

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

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

获取输入框里面的文字 

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

// 查找元素
WebElement element = wd.findElement(By.id("input1"));// 获取并打印输入框中的文本
String value = element.getAttribute("value");
System.out.println(value);
http://www.xdnf.cn/news/443647.html

相关文章:

  • Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景
  • 智能体制作学习笔记2——情感客服
  • openfeign 拦截器实现微服务上下文打通
  • 【Three.js基础学习】36.particles-morphing-shader
  • React 简介:核心概念、组件化架构与声明式编程
  • De-biased Attention Supervision for Text Classifcation with Causality
  • Beats
  • AI规则引擎:解锁SQL数据分析新姿势
  • rhce 9 考题与解析笔记
  • 16 - VDMA之视频转发实验
  • 用HBuilder运行小程序到微信开发者工具
  • SQL注入 ---04
  • OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——wget
  • 【C/C++】高阶用法_笔记
  • 负进制转换
  • 前端~三维地图(cesium)动态材质扩散圆环
  • 高等数学第七章---微分方程(§7.4-§7.5可降阶的高阶微分方程、二阶线性微分方程)
  • 在window中 js 编写一个全局触发事件并携带参数
  • EC600X 开发板介绍
  • 从入门到精通:阿里云/腾讯云服务器深度优化实践
  • bfs-最小步数问题
  • 基于单片机的车灯智能控制系统设计与实现
  • 技术选型不当,如何避免影响项目进展
  • 【python编程从入门到到实践】第七章用户输入和while循环
  • 黑马k8s(六)
  • 解决SQL Server SQL语句性能问题(9)——合理使用表分区
  • CentOS7原有磁盘扩容实战记录(LVM非LVM)【针对GPT分区】
  • QMK RGB矩阵灯效配置详解:从理论到实践(实操部分)
  • 共享代理IP vs 动态IP:企业级业务场景的选型深度解析
  • 通过Ollama读取模型