Dart: puppeteer库
和node的差不多,只有写API不一样
- 安装依赖
dependencies:
puppeteer: ^1.7.1
- 下载 chrome-win 到 <project_root>/.local-chromium/662092/ 下面,不然跑不起,要最新版的chromium,何以用cnpm下载
cnpm i puppeteer -S
然后在依赖里面找到复制出来。 - 跑起来
dart ./bin/main.dart
import 'package:puppeteer/puppeteer.dart';
main(List<String> arguments) async {
var browser = await puppeteer.launch(headless: false);
var myPage = await browser.newPage();
await myPage.goto('https://www.github.com', wait: Until.networkIdle);
}
执行js
import 'package:puppeteer/puppeteer.dart';
main(List<String> arguments) async {
var browser = await puppeteer.launch(
headless: false,
devTools: true,
);
var page = await browser.newPage();
await page.goto(base_url);
// 执行一段js
var title = await page.evaluate('''(newTitle) => {
document.title = newTitle;
return document.title
}''', args: ["hello world"]);
print(title);
// 两秒后关闭浏览器
await Future.delayed(Duration(seconds: 2));
await browser.close();
}
获取页面内的元素
// document.querySelector 没找到返回null
var target = await page.$('#nav-dongman');
await target?.click()
// document.querySelectorAll 没找到返回null
var target = await page.$$('p');
await target?.elementAt(0)?.click()
// document.querySelector然后把匹配到的元素作为第一个参数传给 pageFunction
var target = await page.$eval('#nav-dongman', 'e => e.children[0].href');
print(target);
// Array.from(document.querySelectorAll(selector)) 没找到返回null
// 然后把匹配到的元素数组作为第一个参数传给 pageFunction
// 如果 pageFunction 返回的是 Promise,那么此方法会等 promise 完成后返回其返回值
var target = await page.$$eval('p', '(es, index) => es[index].tagName', args: [0]);
print(target);
// 找到一个匹配 selector 选择器的元素,并点击它
// 如果需要会把此元素滚动到可视,然后通过 page.mouse 点击它。 如果选择器没有匹配任何元素,此方法将会报错
await page.click('#nav-dongman')
// 找到一个匹配selector的元素,并且把焦点给它。 如果没有匹配的元素,此方法将报错
page.focus(selector)
// 加载到页面中的所有iframe标签
// page.frames()
// 要hover的元素的选择器,如果有多个匹配的元素,hover第一个
page.hover(selector)
// page.select(selector, ...values)
// 当提供的选择器完成选中后,触发change和input事件 如果没有元素匹配指定选择器,将报错
await page.select('select#colors', ['blue'])
// 要点击的元素的选择器。如果有多个匹配的元素,点击第一个
// 如果需要会把此元素滚动到可视,然后通过 page.touchscreen 来点击元素的中间位置 如果没有匹配的元素,此方法会报错
await page.tap('#a')
// 返回页面标题
await page.title;
// 返回页面的 url
await page.url;
// 要输入内容的元素选择器。如果有多个匹配的元素,输入到第一个匹配的元素
// 每个字符输入后都会触发 keydown, keypress/input 和 keyup 事件
// 要点击特殊按键,比如 Control 或 ArrowDown,用 keyboard.press
await page.type('form.form-horizontal input.form-control', 'hello world',
delay: Duration(microseconds: 300))
// 等待指定的选择器匹配的元素出现在页面中
// 如果调用此方法时已经有匹配的元素,那么此方法立即返回。 如果指定的选择器在超时时间后扔不出现,此方法会报错
ElementHandle first_img =
await page.waitForSelector('img', timeout: Duration(seconds: 10));
print(await first_img.propertyValue<String>('src'));
页面导航
page.goBack([options]) 导航到页面历史的前一个页面
page.goForward([options]) 导航到页面历史的后一个页面
page.goto(url[, options]) 导航到的地址. 地址应该带有http协议, 比如 https://
向页面注入js
// 添加一个script标签到body的最后
await page.addScriptTag(
content: 'alert(1)',
type: 'text/javascript',
);
向页面注入css
// 添加一个style标签到head的最后面
await page.addStyleTag(content: '''
p {
color: red;
}''')
返回页面的html代码
page.content()
指定启动页面的模拟器
var page = await browser.newPage();
// devices: https://github.com/GoogleChrome/puppeteer/blob/master/lib/DeviceDescriptors.js
await page
.emulate(Device('iPhone 7', userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1", viewport: DeviceViewport(
width: 375,
height: 667,
deviceScaleFactor: 2,
isMobile: true,
hasTouch: true,
isLandscape: false,
)));
await page.goto(base_url);
禁用js
改变这个值不会影响已经执行的js。下一个跳转会完全起作用。
await page.setJavaScriptEnabled(false);
Dart: puppeteer库的更多相关文章
- Dart自定义库、系统库和第三方库
/* 前面介绍Dart基础知识的时候基本上都是在一个文件里面编写Dart代码的,但实际开发中不可能这么写,模块化很重要,所以这就需要使用到库的概念. 在Dart中,库的使用时通过import关键字引入 ...
- Dart http库
推荐下我写的一个http库ajanuw_http 最基本的获取数据 import 'package:http/http.dart' as http; main(List<String> a ...
- Dart: path库
path库pub地址 安装: dependencies: path: 使用: import 'dart:io'; import 'package:path/path.dart' as path; ma ...
- 使用nodejs的puppeteer库爬取瓜子二手车网站
const puppeteer = require('puppeteer'); (async () => { const fs = require("fs"); const ...
- flutter-web利用dart js 库发起http request
初学flutter,初学前端,尝试在dart中直接使用HttpClient时,直接报出Platform not supported,查资料发现他还不支持浏览器. 通过查阅资料发现可以借助axios 与 ...
- Angular JS | Closure | Google Web Toolkit | Dart | Polymer 概要汇集
AngularJS | Closure | Google Web Toolkit | Dart | Polymer GWT https://code.google.com/p/google-web-t ...
- 微信公众号_订阅号_爬虫puppeteer
puppeteer 借助 puppeteer 库实现爬虫,puppeteer 提供了高级 api 接口来操作 chrome 来 npm install puppeteer --save-dev ...
- [dart学习]第三篇:dart变量介绍 (二)
本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...
- 9.Libraries and visibility 库和可见性
import和liabrary指令可以帮助你创建模块化,可复用的代码.库不仅仅提供API,也是一个私有化单元:库中已下划线(_)开头的类都是对外不可访问的.每个Dart的应用也是一个包,尽管它没有使用 ...
随机推荐
- PHP-数组相关知识总结
PHP-数组相关知识总结 (一)数组创建 //创建数组(php5.4 起可以使用短数组定义语法,用 [] 替代 array()) <?php$array = array( "fo ...
- jvm系列三垃圾回收
三.垃圾回收 1.如何判断对象可以回收 引用计数法 弊端:循环引用时,两个对象的计数都为1,导致两个对象都无法被释放 可达性分析算法 JVM中的垃圾回收器通过可达性分析来探索所有存活的对象 扫描堆中的 ...
- Flink-v1.12官方网站翻译-P001-Local Installation
本地安装 按照以下几个步骤下载最新的稳定版本并开始使用. 第一步:下载 为了能够运行Flink,唯一的要求是安装了一个有效的Java 8或11.你可以通过以下命令检查Java的正确安装. java - ...
- MySQL数据库迁移与MySQL数据库批量恢复
目录 一.MySQL数据库迁移或备份 1. 了解使用InnoDB引擎创建数据库所产生的文件 2. 迁移数据库步骤 1. 从A服务器迁移至B服务器 2. MySQL重装并导入之前数据库 二.MySQL数 ...
- NCD 2019 C. Hasan and his lazy students
题意:给你一组数,求最长的严格上升子序列及个数(mod 1e9+7) 题解:用动态规划来求LIS,记\(dp[i]\)是数组中第i个位置上的数的LIS最优解,我们遍历一遍原数组,然后找i位置前的LIS ...
- Codeforces Educational Rounds 85 A~C
A:Level Statistics 题意:统计n个游戏数据,p代表游玩次数,c代表通关次数,每次游玩都不一定通关,求这些数据是否合法 题解:1.游玩次数不能小于通关次数 2.游玩次数和通关次数必 ...
- PowerShell随笔3 ---别名
上一篇提到了别名,这个有必要说一下,因为我们常常会遇到以下两种情况: 自己写脚本,想快速一些,使用命名 看别人的脚本,发现别人和你想的一样,用了别名,但是你忘记了这个别名是什么意思. 我们可以通过Ge ...
- Linux命令之find命令中的-mtime参数
有关find -mtime的参数解释 mtime参数的理解应该如下: -mtime n 按照文件的更改时间来找文件,n为整数. n表示文件更改时间距离为n天, -n表示文件更改时间距离在n天以内,+n ...
- leetcode32 最长游戏括号 dp
有一说一,我觉得这题没有到困难级 要保存之前的状态,感觉是很明显的dp 思路和题解一样 class Solution { public: int longestValidParentheses(str ...
- leetcode 4 寻找两个有序数组的中位数 二分法&INT_MAX
小知识 INT_MIN在标准头文件limits.h中定义. #define INT_MAX 2147483647#define INT_MIN (-INT_MAX - 1) 题解思路 其实是类似的二分 ...