selenium-java自动化教程

文章目录

Selenium

 Selenium是一个自动化测试工具,可以模拟用户操作web端浏览器的行为,包括点击、输入、选择等。也可以获取交互界面上的指定元素的内的数据,也就是爬虫。

支持语言

  Selenium支持Java、Python、CSharp、Ruby、JavaScript、Kotlin,对于会java语言的,可以直接使用selenium-java

WebDriver

 Selenium 的核心是 WebDriver,这是一个编写指令集的接口,可以在许多浏览器运行。我们要在浏览器中模拟用户点击就需要一个对应的驱动组件来实现这个功能,WebDriver就是以原生的方式驱动浏览器,就像用户在本地操作浏览器一样。

开始使用

chromedriver

 上边说了我们要驱动浏览器做一些行为动作就需要一个对应的驱动,目前支持的浏览器有:Firefox、Chrome、Edge、IE、Apple Safari,下面我们使用Chrome浏览器
chromedriver
chromedriver125.0.6422.141稳定版

我使用的浏览器版本是125.0.6422.142,小版本差别影响不大 可以直接使用,下载的WebDriver如果版本差别太大启动的时候会提示浏览器版本不支持。

模拟用户浏览访问

 以模拟用户浏览页面,不断的滚动页面直到最底部这样一个需求,下面开始编码

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>
</dependencies>
java 复制代码
@Component
public class BlogService {

    private final List<String> UA_LIST = Arrays.asList(
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.0.0 Safari/537.36"
            , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Safari/537.36");

    // 要访问的页面地址
    private final List<String> URL_LIST = Arrays.asList("https://wiki.mbalib.com/wiki/%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91");
    private final AtomicInteger count = new AtomicInteger();

    public static void main(String[] args) {
        // websiteTask();
    }

    private void websiteTask() {
        System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE, "/dev/null");

        // driver驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/
        System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\125\\chromedriver.exe");   //设置chrome驱动程序的路径

        System.out.println(System.getProperty("webdriver.chrome.driver"));

        ChromeOptions opt = new ChromeOptions();
        //opt.addArguments("-headless");     // 开启无界面模式
        opt.addArguments("--disable-gpu");  // 禁用gpu
        opt.addArguments("--user-agent=" + getRandom(UA_LIST));

        WebDriver driver = new ChromeDriver(opt);   //初始化一个chrome驱动实例,保存到driver中

        try {
            // driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); //隐式等待10秒
            //最大化窗口
            driver.manage().window().maximize();  //最大化窗口

            driver.get(getRandom(URL_LIST));

            Thread.sleep(1000);  // 等待页面加载xs

            // 强制转换WebDriver为JavascriptExecutor
            JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
            // 执行JavaScript代码来获取页面的滚动条高度
            int scrollHeight = Integer.parseInt(jsExecutor.executeScript("return document.documentElement.scrollHeight;").toString());
            // 可以根据滚动条高度,每次滚动多少px,计算出总共需要滚动多少次,这样就可以滚动到最底部
            int num = scrollHeight / 400;

            for (int i = 0; i < num; i++) {
                int height = (i + 1) * 400;
                ((JavascriptExecutor) driver).executeScript("window.scrollTo({" + "top: " + height + ",behavior: \"smooth\"" + "})");

                Thread.sleep(1000);  // 每次滚动等待一定时间
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.manage().deleteAllCookies();
            System.out.println("当前第几次:" + count.incrementAndGet() + " , 打开页面的标题是: " + driver.getTitle());
            //关闭并退出浏览器
            driver.quit();
        }
    }

    /**
     * 随机获取一个地址
     */
    private String getRandom(List<String> list) {
        // shuffle 打乱顺序
        Collections.shuffle(list);
        return list.get(0);
    }

    // initialDelay:第一次延迟多长时间后再执行, fixedRate:之后按fixedRate的规则每x秒执行一次
    @Scheduled(initialDelay = 0, fixedRate = 13000)
    public void timingTask() {
        System.out.println("start task........");
        websiteTask();
    }
}

运行效果:

selenium-java模拟浏览页面

模拟点击事件

使用这个网站作为示例:测试页面

由于打开页面有一个提示框,需要先把提示框关闭后才可以对页面元素进行操作,否则会提示元素是不可点击的。

所以我们的步骤是:先打开页面 选中弹窗右上角的关闭图标点击它,然后才能选择页面上要操作的元素。

关闭弹窗,选中元素并点击

 使用xpath语法和浏览器插件可以非常方便的选中要操作的元素,然后在代码中获取到这个元素并调用它的点击事件

java 复制代码
@Component
public class BlogService {

    private final List<String> UA_LIST = Arrays.asList(
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.0.0 Safari/537.36"
            , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Safari/537.36");

    // 要访问的页面地址
    private final List<String> URL_LIST = Arrays.asList("https://wiki.mbalib.com/wiki/%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91");
    private final AtomicInteger count = new AtomicInteger();

    public static void main(String[] args) {
        // websiteTask();
    }

    private void websiteTask() {
        System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE, "/dev/null");

        // driver驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/
        System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\125\\chromedriver.exe");   //设置chrome驱动程序的路径

        System.out.println(System.getProperty("webdriver.chrome.driver"));

        ChromeOptions opt = new ChromeOptions();
        //opt.addArguments("-headless");     // 开启无界面模式
        opt.addArguments("--disable-gpu");  // 禁用gpu
        opt.addArguments("--user-agent=" + getRandom(UA_LIST));

        WebDriver driver = new ChromeDriver(opt);   //初始化一个chrome驱动实例,保存到driver中

        try {
            // driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); //隐式等待10秒
            //最大化窗口
            driver.manage().window().maximize();  //最大化窗口

            driver.get(getRandom(URL_LIST));

            Thread.sleep(1000);  // 等待页面加载xs

            // 先关闭弹窗
            String headExpression = "//div[@class=\"bg hid\" and @id=\"vip_popup_img\"]//*[local-name() = \"svg\" and @class=\"head-icon\"]";
            WebElement headElement = driver.findElement(By.xpath(headExpression));
            headElement.click();
            
            //再操作页面元素
            String xpathExpression = "//div[@id=\"globalWrapper\"]/div[@id=\"column-content\"]/div[3]/div[@id=\"bodyContent\"]/dl[1]//a[3]";
            WebElement element = driver.findElement(By.xpath(xpathExpression));

            // 模拟点击事件
            element.click();

            Thread.sleep(10000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.manage().deleteAllCookies();
            System.out.println("当前第几次:" + count.incrementAndGet() + " , 打开页面的标题是: " + driver.getTitle());
            //关闭并退出浏览器
            driver.quit();
        }
    }

    /**
     * 随机获取一个地址
     */
    private String getRandom(List<String> list) {
        // shuffle 打乱顺序
        Collections.shuffle(list);
        return list.get(0);
    }

    // initialDelay:第一次延迟多长时间后再执行, fixedRate:之后按fixedRate的规则每x秒执行一次
    @Scheduled(initialDelay = 0, fixedRate = 13000)
    public void timingTask() {
        System.out.println("start task........");
        websiteTask();
    }
}

运行效果:

selenium-java模拟点击按钮事件

获取页面文本

 如果页面有很多文本文字,要获取(paqu)页面的文字内容也非常的简单

java 复制代码
String xpathExpression = "//div[@id=\"content\"]/div[@id=\"bodyContent\"]//p[1]";
WebElement element = driver.findElement(By.xpath(xpathExpression));
System.out.println(element.getText());

结语

 xpath语法网络上很多资料这里就不做具体介绍了,主要说一下paqu数据的主要步骤,通过xpath可以获取到指定元素的文本内容、模拟元素的点击事件,这样我们就可以实现paqu网页数据,如果页面有分页的话也可以通过编写代码的方式获取到所有数据

相关推荐
J2虾虾11 小时前
Spring AI Alibaba文档
java·人工智能·spring
YikNjy11 小时前
break和continue
java·开发语言·算法
SomeOtherTime11 小时前
Geojson相关(AI回答)
java·前端·python
日月云棠11 小时前
10 Integer —— 最常用的整数包装类深度解析
java·后端
秋911 小时前
java项目中cpu飙升排查及解决方法
java·开发语言
野生技术架构师11 小时前
牛客网2026最新大厂Java高频面试题精选(附标准答案)
java·开发语言
PH = 712 小时前
JAVA的SPI机制
java·开发语言
一 乐12 小时前
高校实习信息发布网站|基于Spring Boot的高校实习信息发布网站的设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·高校实习信息发布网站
weelinking12 小时前
【产品】11_实现后端接口——数据在背后如何流动
java·人工智能·python·sql·oracle·json·ai编程
摇滚侠12 小时前
东方通替换tomcat,实战经验
java