自动保存上千本技术电子书

背景

最近在逛社区的时候发现了个大佬在博客中分享了上千本电子书资源,尽管我的网盘中已经堆积了很多电子书了。。。

我可以不看,但是我不能没有!

我可以留着给我儿子看啊,哈哈哈~

上千本电子书每一本都是一个分享链接,要一个个保存分享,这很不友好啊,没办法只能自己想办法了,说干就干。

selenium介绍

之前有使用selenium做过一个自动化测试的项目,觉得可以使用selenium搞一个自动保存的程序。

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。你怎么利用这种力量完全取决于你自己。它主要是为了测试目的自动化 Web 应用程序,但当然不仅限于此。

Selenium 通过使用 WebDriver 支持市场上所有主流浏览器的自动化。 Webdriver 是一个 API 和协议,它定义了一个语言中立的接口,用于控制 web 浏览器的行为。 每个浏览器都有一个特定的 WebDriver 实现,称为驱动程序。 驱动程序是负责委派给浏览器的组件,并处理与 Selenium 和浏览器之间的通信。

这种分离是有意识地努力让浏览器供应商为其浏览器的实现负责的一部分。 Selenium 在可能的情况下使用这些第三方驱动程序, 但是在这些驱动程序不存在的情况下,它也提供了由项目自己维护的驱动程序。

selenium实践

安装依赖

在项目pom文件中添加依赖

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.7.1</version>
        </dependency>

安装浏览器驱动

1. 驱动管理软件

引用第三方驱动库,可以自动适配浏览器版本,节省自己去下载驱动的时间

在项目pom文件中添加依赖

        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.3.1</version>
            <scope>test</scope>
        </dependency>

代码示例:

import io.github.bonigarcia.wdm.WebDriverManager;

// 启动
WebDriverManager.chromedriver().setup();
// 初始化浏览器
WebDriver driver = new ChromeDriver();

2. 硬编码位置

System.setProperty("webdriver.chrome.driver","/path/to/chromedriver");
ChromeDriver driver = new ChromeDriver();

3. 其他

Selenium Manager可以帮助你获得一个运行Selenium的开箱即用的环境。 如果在PATH中没有找到Chrome、Firefox和Edge的驱动,Selenium Manager的Beta 1版将为它们配置。 不需要额外的配置。如果有必要,Selenium Manager的未来版本也会在必要时一同下载浏览器。

demo示例

打开浏览器,访问

@Test
@SneakyThrows
public void test() {
    WebDriverManager.chromedriver().setup();
    driver = new ChromeDriver();
    // 访问掘金
    driver.get("https://juejin.cn/");
    // 获取标题
    String title = driver.getTitle();
    System.out.println(title);
    // 停留2s
    Thread.sleep(2000);
    // 退出浏览器
    driver.quit();
}

等待策略

刚使用的时候,经常定位不到元素,大部分原因就是页面还没加载完成,程序执行太快去查找元素的时候就找不到。为了避免这种情况,可以设置等待策略,尝试定位元素之前, 确保该元素位于页面上, 并且在尝试与该元素交互之前, 该元素处于可交互状态。

driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));

这种策略也无法满足所有场景,可以尝试另一种比较暴力的方式

Thread.sleep(3000);

查找定位元素

自动化操作大部分要基于指定元素操作,比如说点击“确定”按钮,就要找到按钮的元素,主要查找方式有以下几种:

WebElement textBox = driver.findElement(By.name("my-text"));
WebElement submitButton = driver.findElement(By.cssSelector("button"));
WebElement element1 = driver.findElement(By.xpath("//span[@class='EOGexf']"));

语法很简单,网上查一下就好了,这边就不多讲了。

自动保存网盘文件

操作步骤:

  1. 加载博客,根据标签获取到所有分享链接并保存到文件
  2. 自动保存文件
    1. 获取所有分享链接
    2. 打开浏览器,登录网盘账号,这步可能涉及手机验证码和图片验证,而且一开始登录一次就可以,所以可以先手动登录账号。
    3. 循环保存分享链接文件
    4. 记录保存成功日志,作为循环重试判断依据
    5. 告诉我儿子他多了1000本书

示例代码(循环保存分享链接文件):

@Test
@SneakyThrows
public void autoSaveBook() {
    WebDriverManager.chromedriver().setup();
    driver = new ChromeDriver();
    driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500));
    // 登录账号时间
    Thread.sleep(15000);
    driver.get("https:XXXX");
    // 查找文件复选框
    val element1 = driver.findElement(By.xpath("//span[@class='EOGexf']"));
    // 点击选中
    element1.click();
    // 查找“保存到网盘”按钮并点击
    val e2 = driver.findElement(By.xpath("//em[@class='icon icon-save-disk']/../span"));
    e2.click();
    // 强制等待1s,应为下一步操作元素要等点击e2后才能显示,不等待的话可能导致下一步失败
    Thread.sleep(1000);
    // 查找“确定”按钮并点击
    val e3 = driver.findElement(By.xpath("//a[@class='g-button  g-button-blue-large']"));
    e3.click();
    Thread.sleep(3000);
    System.out.println("收藏成功");


    driver.quit();
}

效果演示:
在这里插入图片描述

THE END.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值