八、自动化函数
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();
}
}
}