Java使用Playwright自动化测试教程——java爬取数据

目录

前言

Playwright github页面
Playwright官网说明文档

一、 maven

xml 复制代码
        <dependency>
            <groupId>com.microsoft.playwright</groupId>
            <artifactId>playwright</artifactId>
            <version>1.58.0</version>
            <scope>compile</scope>
        </dependency>

二、第一个示例

java 复制代码
import com.microsoft.playwright.Browser;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;
import java.nio.file.Paths;

public class MainServer {
    public static void main(String[] args) {
        try (Playwright playwright = Playwright.create()) {
            Browser browser = playwright.webkit().launch();
            Page page = browser.newPage();
            page.navigate("https://blog.csdn.net/qq_33697094");
            page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("example.png")));
        }
    }

}

运行上面的代码,会运行无头浏览器在后台打开 https://blog.csdn.net/qq_33697094 网页,然后截图为example.png 保存到当前项目目录下。

如果是第一次使用 Playwright ,运行代码时 Playwright 会将 Chromium、WebKit 和 Firefox 最新版本的浏览器和截图录频工具 ffmpeg 下载到操作系统特定的缓存文件夹中:

  • Windows 系统:%USERPROFILE%\AppData\Local\ms-playwright
  • macOS 系统:~/Library/Caches/ms-playwright
  • Linux 系统:~/.cache/ms-playwright

三、有头浏览器和无头浏览器

有头浏览器会打开一个浏览器界面进行操作

java 复制代码
        try (Playwright playwright = Playwright.create()) {
			// 使用有头浏览器,并且增加慢动作,方便看清操作
            Browser browser = playwright.chromium().launch(
                    new BrowserType.LaunchOptions().setHeadless(false)
					//如果在开发阶段你可以使用setSlowMo来放慢执行速度,方便在界面上观看
					//.setSlowMo(100) 
            );
		} 

无头浏览器不会打开浏览器界面,只会在后台运行

java 复制代码
 try (Playwright playwright = Playwright.create()) {
			// 使用无头浏览器
            Browser browser = playwright.chromium().launch();
} 

四、单页面与多页面

如果你的页面点击或者其他操作会打开新的页面,并且你需要在新页面进行操作,那么你需要使用创建上下文管理多页面

多页面:

java 复制代码
// 创建上下文(Context),用于管理多个页面
BrowserContext context = browser.newContext();
Page page = context.newPage();

单页面:

java 复制代码
            Page page = browser.newPage();

五、打开指定链接

java 复制代码
page.navigate("https://blog.csdn.net/qq_33697094?type=blog");

六、等待加载完成

等待页面加载完成

java 复制代码
page.waitForLoadState();

等待指定元素标签加载完成

java 复制代码
// 等待id是content_views的标签内容加载完成
rticlePage.locator("#content_views").waitFor();

七、获取所有的 p 标签内容

java 复制代码
Page page = context.newPage();
//获取id是#content_views 的标签下的所有p标签
List<String> allParagraphs = page.locator("#content_views p").allInnerTexts();

八、获取某一指定文本的 p 标签内容

java 复制代码
Page page = context.newPage();
//获取id是#content_views 的标签下的所有p标签,然后二次过滤搜索含有"手写大乐透"的p标签,获取标签中的内容
String specificText = articlePage.locator("#content_views p")
                    .filter(new Locator.FilterOptions().setHasText("手写大乐透"))
                    .innerText();

九、获取某一指定文本的 a 标签然后点击

java 复制代码
Page page = context.newPage();
//获取含有"Java实现彩票大乐透、双色球机选号"的a标签 (使用 getByRole 定位(语义化,推荐))
Locator articleLink = page.getByRole(AriaRole.LINK,
                    new Page.GetByRoleOptions().setName("Java实现彩票大乐透、双色球机选号"));
//点击					
articleLink.click();

或者:

java 复制代码
Page page = context.newPage();
//获取含有"Java实现彩票大乐透、双色球机选号"的a标签 (使用 CSS 选择器结合文本过滤(更灵活))
Locator articleLink = page.locator("a.block-title")
    .filter(new Locator.FilterOptions().setHasText("Java实现彩票大乐透"));
articleLink.click();

十、跳转到新页签后 Page 上下文的切换

java 复制代码
            // 创建上下文(Context),用于管理多个页面
            BrowserContext context = browser.newContext();
            Page page = context.newPage();
			
            Locator searchInput = page.locator("#mSearchInput");
            searchInput.fill("Java实现彩票大乐透、双色球机选号");

            // 处理新标签页跳转,即点击后会打开新窗口,我们需要告诉 Playwright "等待新页面弹出"
            Page newPage = context.waitForPage(() -> {
                // 点击搜索按钮,这里执行触发跳转的动作,可以是点击按钮,也可以是回车
                page.locator(".m-search-sure").click();
            });

十一、如果按钮可见则点击按钮

java 复制代码
Locator readMoreBtn = page.locator("#btn-readmore");
if (readMoreBtn.isVisible()) {
    readMoreBtn.click();
}

十二、模拟按下键盘回车

java 复制代码
page.keyboard().press("Enter");

十三、示例

执行下面的操作,会打开我的博客主页,然后在输入框里输入 "Java实现彩票大乐透、双色球机选号",然后点击搜索,在跳转后的搜索页面点击 "Java实现彩票大乐透、双色球机选号"

文章标题,跳转到新的博客文章页面,获取博客里的第一行文章内容。

java 复制代码
import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;
import com.microsoft.playwright.options.AriaRole;


public class MainServer {
    public static void main(String[] args) {
        try (Playwright playwright = Playwright.create()) {
            Browser browser = playwright.chromium().launch(
                    new BrowserType.LaunchOptions().setHeadless(false)
            );

            // 创建上下文(Context),用于管理多个页面
            BrowserContext context = browser.newContext();
            Page page = context.newPage();

            // 导航到博客主页
            page.navigate("https://blog.csdn.net/qq_33697094?type=blog");

            // 点击博客内的搜索图标(展开搜索框)
            Locator searchIcon = page.locator(".m-search-btn");
            //增加等待,确保元素已加载
            searchIcon.waitFor();
            //点击搜索按钮(展开搜索框)
            searchIcon.click();

            // 输入搜索关键词
            Locator searchInput = page.locator("#mSearchInput");
            searchInput.fill("Java实现彩票大乐透、双色球机选号");


            System.out.println("--------------------------------------------------------------------------");

            // 处理点击跳转到新标签页跳转,CSDN 点击搜索后会打开新窗口,我们需要告诉 Playwright "等待新页面弹出"
            Page searchPage = context.waitForPage(() -> {
                //  点击搜索按钮
                page.locator(".m-search-sure").click();

            });

            // 等待新页面加载完成
            searchPage.waitForLoadState();
            System.out.println("新页面标题: " + searchPage.title());

            // 等待新页面加载完毕
            searchPage.waitForLoadState();

            // 筛选并点击目标文章标题(使用 getByRole 定位(语义化,推荐))
            Locator articleLink = searchPage.getByRole(AriaRole.LINK,
                    new Page.GetByRoleOptions().setName("Java实现彩票大乐透、双色球机选号"));

            System.out.println("--------------------------------------------------------------------------");

            // 处理点击跳转到新标签页博客文章
            Page articlePage = context.waitForPage(() -> {
                // 点击文章标题的动作
                articleLink.click();

            });

            // 等待新页面加载完成
            articlePage.waitForLoadState();
            // 等待正文内容加载完成
            articlePage.locator("#content_views").waitFor();

            // 获取特定的某一段文字
            String specificText = articlePage.locator("#content_views p")
                    .filter(new Locator.FilterOptions().setHasText("手写大乐透"))
                    .innerText();

            System.out.println("找到的目标文字: " + specificText);
            //关闭浏览器
            browser.close();
        }

    }

}
相关推荐
NE_STOP7 小时前
MyBatis-配置文件解读及MyBatis为何不用编写Mapper接口的实现类
java
后端AI实验室12 小时前
用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
java·ai
程序员清风13 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme14 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
Be_Better14 小时前
学会与虚拟机对话---ASM
java
开源之眼16 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori31617 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户9083246027317 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋17 小时前
DecimalFormat 与 BigDecimal
java·后端
beata18 小时前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端