java中使用selenium自动化测试

一、查看你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"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值