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();
        }

    }

}
相关推荐
2601_9491465310 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
0思必得010 小时前
[Web自动化] Selenium无头模式
前端·爬虫·selenium·自动化·web自动化
青云计划10 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿10 小时前
Jsoniter(java版本)使用介绍
java·开发语言
探路者继续奋斗11 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
Gofarlic_OMS11 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
dixiuapp11 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
消失的旧时光-194312 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
A懿轩A12 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
乐观勇敢坚强的老彭12 小时前
c++寒假营day03
java·开发语言·c++