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的应用也是一个包,尽管它没有使用 ...
随机推荐
- dp - 斜率优化笔记
(原来的题解没得了,只好重写一份) 斜率优化一般是,\(dp\) 是枚举一个 \(i\),然后前面找一个 \(j\),式子中有些和 \(j\) 有关,有些和 \(i\) 有关,有些和俩都有关. 过程中 ...
- win10自带输入法突然变成了繁体
有可能是在使用Eclipse/MyEclipse的Ctrl + Shift + F进行代码格式化的时候与输入法的热键冲突了
- Excel 常用数据类型、自定义格式、特殊值等等
常用数据类型: 常规: 常规单元榴格式不包含慑拍H靛的数字格式. 数值: 可以设置小数位数,是否使用千位分割符,以及负数样式 货币: 可以设置小数位数,货币符号,以及负数样式 会计专用: 可以设置小数 ...
- (十)整合 JWT 框架,解决Token跨域验证问题
整合 JWT 框架,解决Token跨域验证问题 1.传统Session认证 1.1 认证过程 1.2 存在问题 2.JWT简介 2.1 认证流程 2.2 JWT结构说明 2.3 JWT使用方式 3.S ...
- Spark 应用监控告警-Graphite_exporter
Spark 应用监控告警-Graphite_exporter Spark监控和工具 Web界面 事后查看 REST API 度量 高级工具 一.下载graphite_exporter 1.1 修改gr ...
- Spark调优,性能优化
Spark调优,性能优化 1.使用reduceByKey/aggregateByKey替代groupByKey 2.使用mapPartitions替代普通map 3.使用foreachPartitio ...
- 省市县sql
create table SYS_AREA ( ID NUMBER(18) not null, AREA_CODE VARCHAR2(50) not null, AREA_NAME VARCHAR2( ...
- 2019牛客暑期多校训练营(第五场)E.independent set 1(状压dp)
题意:给你n个点 m条边 问你所有子图的最大独立集的和 思路:我们可以设f state 为当前点集下的最大独立集的大小 所以我们可以把集合分为两个部分 绝对包含了这个一个点 绝对不包含这个点 两种情况 ...
- hoj2430 Counting the algorithms
My Tags (Edit) Source : mostleg Time limit : 1 sec Memory limit : 64 M Submitted : 725, Acce ...
- ssh配置方面小实验①
注意:sshd_config配置文件有些特殊:注释掉的选项,并不是不生效的,而是默认生效选项.使用某选项时,要先取消注释,再修改为yes或no关于效率和安全的说明:安全:telnet < ssh ...