目录
- 前言
- [一、 maven](#一、 maven)
- 二、第一个示例
- 三、有头浏览器和无头浏览器
- 四、单页面与多页面
- 五、打开指定链接
- 六、等待加载完成
- [七、获取所有的 p 标签内容](#七、获取所有的 p 标签内容)
- [八、获取某一指定文本的 p 标签内容](#八、获取某一指定文本的 p 标签内容)
- [九、获取某一指定文本的 a 标签然后点击](#九、获取某一指定文本的 a 标签然后点击)
- [十、跳转到新页签后 Page 上下文的切换](#十、跳转到新页签后 Page 上下文的切换)
- 十一、如果按钮可见则点击按钮
- 十二、模拟按下键盘回车
- 十三、示例
前言
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();
}
}
}