Selenium-Java版(操作元素)_java selenium
选择和操控元素的基本方法
前言
选择元素
选择元素的方法
根据 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 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 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类型,用空格分开
土豆
只能指定任意一个class 属性值来选择元素
wd.findElements(By.className(\"plant\"));
或
wd.findElements(By.className(\"big\"));
而不能
wd.findElements(By.className(\"animal big\"));
根据tag名选择元素
通过指定参数为By.tagName,选择所有的tag名为span的元素
List 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 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);