一、查看你Chrome浏览器的版本
在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本
二、找到对应的chromedriver版本
2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件
2.2 116版本通过点击下载chromedriver,便可直接下载压缩包。
2.3 127/128/128版本通过点击进入到 Chrome for Testing availability ,可以看到129 Stable 稳定版本以及更高版本的测试版。
点击Stable,选择对应的驱动下载即可。
三、导入jar包
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
四、编写测试类
import org.openqa.selenium.*;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
/**
* @author l
* @create 2024-09-30 09:20
*/
public class Test {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\chromedriver.exe");
//打开浏览器
ChromeDriver driver = new ChromeDriver();
// 获取屏幕的大小
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int width = (int) screenSize.getWidth();
int height = (int) screenSize.getHeight();
// 设置浏览器窗口大小为屏幕大小(模拟全屏)(不全屏展开可能获不到html元素)
driver.manage().window().setSize(new Dimension(width, height));
driver.get("https://test.com");
driver.findElement(By.id("username")).sendKeys("");
driver.findElement(By.id("password")).sendKeys("");
JavascriptExecutor js = (JavascriptExecutor) driver;
// js.executeScript("localStorage.setItem('', '');");
driver.findElement(By.className("logindo")).click();
Thread.sleep(1000);//睡眠是等待加载弹窗图片
// 滑动验证码
//第一种方式是canvas读取图片
List<WebElement> canvas = driver.findElements(By.tagName("canvas"));
Object base641 = js.executeScript("return arguments[0].toDataURL('image/png').substring(22);", canvas.get(0));
Object base642 = js.executeScript("return arguments[0].toDataURL('image/png').substring(22);", canvas.get(1));
//第二种方式读取图片地址 有缺口和没有缺口图片比对(如果是文件url方式)
//BufferedImage captcha1 = ImageIO.read(new File(""));
//BufferedImage captcha2 = ImageIO.read(new File(""));
BufferedImage captcha1 = base64ToBufferedImage(base641.toString());
BufferedImage captcha2 = base64ToBufferedImage(base642.toString());
int gap = getGapPosition(captcha1, captcha2);
System.out.println("缺口位置: " + gap);
int[] track = getTrack(gap);
System.out.println("滑动轨迹: " + Arrays.toString(track));
moveSlider(driver, track);
driver.get("https://test.com/html");
// 定位到ul元素(通过ID)
WebElement ul = driver.findElement(By.id("myTab"));
// 从ul中获取所有的li元素
List<WebElement> liElements = ul.findElements(By.tagName("li"));
liElements.get(1).findElement(By.tagName("a")).click();
driver.findElement(By.id("qy_name")).sendKeys("");
driver.findElement(By.id("searchDetail")).click();
Thread.sleep(500);
WebElement bodyListElement = driver.findElement(By.id("bodyList"));
WebElement firstTr = bodyListElement.findElement(By.cssSelector("tr:first-child"));
WebElement thirdTd = firstTr.findElement(By.cssSelector("td:nth-child(3)"));
thirdTd.click();
Thread.sleep(500);
// 截取当前窗口的截图
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
// 指定截图保存的路径和文件名
File targetFile = new File("screenshot.png");
// 将截图保存到文件系统中
org.apache.commons.io.FileUtils.copyFile(screenshot, targetFile);
System.out.println("Screenshot saved as " + targetFile.getAbsolutePath());
// 关闭浏览器
driver.quit();
}
/**
* base64转Image
* @param base64Str
* @return
* @throws IOException
*/
public static BufferedImage base64ToBufferedImage(String base64Str) throws IOException {
// 解码Base64字符串
byte[] imageBytes = Base64.getDecoder().decode(base64Str);
// 创建字节数组输入流
ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
// 通过ImageIO读取图像
BufferedImage image = ImageIO.read(bis);
// 关闭输入流
bis.close();
return image;
}
/**
* 两张图片比对找到缺口位置
* @param image1
* @param image2
* @return
*/
public static int getGapPosition(BufferedImage image1, BufferedImage image2) {
int threshold = 60;
for (int x = 0; x < image1.getWidth(); x++) {
for (int y = 0; y < image1.getHeight(); y++) {
int rgb1 = image1.getRGB(x, y);
int rgb2 = image2.getRGB(x, y);
Color color1 = new Color(rgb1);
Color color2 = new Color(rgb2);
if (Math.abs(color1.getRed() - color2.getRed()) < threshold &&
Math.abs(color1.getGreen() - color2.getGreen()) < threshold &&
Math.abs(color1.getBlue() - color2.getBlue()) < threshold) {
return x;
}
}
}
return 0;
}
/**
* 计算滑动的距离
* @param distance
* @return
*/
public static int[] getTrack(int distance) {
List<Integer> track = new ArrayList<>();
int current = 0;
int mid = distance * 4 / 5;
double t = 0.2;
double v = 0;
while (current < distance) {
int a = current < mid ? 2 : -3;
double v0 = v;
v = v0 + a * t;
int move = (int) (v0 * t + 0.5 * a * t * t);
current += move;
track.add(move);
}
return track.stream().mapToInt(Integer::intValue).toArray();
}
/**
* 开始滑动
* @param driver
* @param track
*/
public static void moveSlider(WebDriver driver, int[] track) {
WebElement slider = driver.findElement(By.className("slider"));
Actions actions = new Actions(driver);
actions.clickAndHold(slider).perform();
for (int x : track) {
actions.moveByOffset(x, 0).perform();
}
actions.release().perform();
}
}
五、八大元素定位
在 Selenium 中,精确地定位页面元素是进行各种交互操作的基础。以下是一些常见的元素定位方法(Java 示例):
By.id():通过元素的 ID 属性进行定位。
WebElement element = driver.findElement(By.id("elementId"));
By.name():通过元素的 name 属性进行定位。
WebElement element = driver.findElement(By.name("elementName"));
By.className():通过元素的 class 属性进行定位。
WebElement element = driver.findElement(By.className("elementClass"));
By.tagName():通过元素的标签名进行定位。
List<WebElement> elements = driver.findElements(By.tagName("div"));
By.linkText():通过链接的完整文本进行定位。
WebElement element = driver.findElement(By.linkText("链接文本"));
By.partialLinkText():通过链接的部分文本进行定位。
WebElement element = driver.findElement(By.partialLinkText("部分链接文本"));
By.xpath():使用 XPath 表达式进行定位,XPath 是一种强大且灵活的定位方式。
WebElement element = driver.findElement(By.xpath("//div[@class='exampleClass']/input[@name='exampleName']"));
By.cssSelector():通过 CSS 选择器进行定位。
WebElement element = driver.findElement(By.cssSelector("#elementId.exampleClass"));