和node的差不多,只有写API不一样

  1. 安装依赖
dependencies:
puppeteer: ^1.7.1
  1. 下载 chrome-win 到 <project_root>/.local-chromium/662092/ 下面,不然跑不起,要最新版的chromium,何以用cnpm下载 cnpm i puppeteer -S 然后在依赖里面找到复制出来。
  2. 跑起来 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库的更多相关文章

  1. Dart自定义库、系统库和第三方库

    /* 前面介绍Dart基础知识的时候基本上都是在一个文件里面编写Dart代码的,但实际开发中不可能这么写,模块化很重要,所以这就需要使用到库的概念. 在Dart中,库的使用时通过import关键字引入 ...

  2. Dart http库

    推荐下我写的一个http库ajanuw_http 最基本的获取数据 import 'package:http/http.dart' as http; main(List<String> a ...

  3. Dart: path库

    path库pub地址 安装: dependencies: path: 使用: import 'dart:io'; import 'package:path/path.dart' as path; ma ...

  4. 使用nodejs的puppeteer库爬取瓜子二手车网站

    const puppeteer = require('puppeteer'); (async () => { const fs = require("fs"); const ...

  5. flutter-web利用dart js 库发起http request

    初学flutter,初学前端,尝试在dart中直接使用HttpClient时,直接报出Platform not supported,查资料发现他还不支持浏览器. 通过查阅资料发现可以借助axios 与 ...

  6. Angular JS | Closure | Google Web Toolkit | Dart | Polymer 概要汇集

    AngularJS | Closure | Google Web Toolkit | Dart | Polymer GWT https://code.google.com/p/google-web-t ...

  7. 微信公众号_订阅号_爬虫puppeteer

    puppeteer 借助 puppeteer 库实现爬虫,puppeteer 提供了高级 api 接口来操作 chrome 来 npm install puppeteer --save-dev    ...

  8. [dart学习]第三篇:dart变量介绍 (二)

    本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...

  9. 9.Libraries and visibility 库和可见性

    import和liabrary指令可以帮助你创建模块化,可复用的代码.库不仅仅提供API,也是一个私有化单元:库中已下划线(_)开头的类都是对外不可访问的.每个Dart的应用也是一个包,尽管它没有使用 ...

随机推荐

  1. 圣诞快乐!OIer挂分小技巧

    OIer常犯错误 自己的错误 循环里套return 线段树求和 int 定义,下传 int 定义 cmp<,>号分不清 主观行为举动错误 踢电源线,注意安全(_Destiny) TLE 大 ...

  2. 成功解决Git:fatal: refusing to merge unrelated histories

    Get 报错 如果合并了两个不同的开始提交的仓库,在新的 git 会发现这两个仓库可能不是同一个,为了防止开发者上传错误,于是就给下面的提示 fatal: refusing to merge unre ...

  3. 【十天自制软渲染器】DAY 03:画一个三角形(向量叉乘算法 & 重心坐标算法)

    如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦. 前面两天画了点和线,今天我们来画一个最简单也是最强大的面--三角形. 本文主要讲解三角形绘制算法的推导和思路(只 ...

  4. Grafana+Prometheus通过node_exporter监控Linux服务器信息

    Grafana+Prometheus通过node_exporter监控Linux服务器信息 一.Grafana+Prometheus通过node_exporter监控Linux服务器信息 1.1nod ...

  5. Scala安装后,在IDEA中配置

    IDEA中配置Scala 一.设置Module 二.添加Scala的SDK 三.寻找本地scala安装路径 四.测试是否可以新建有Scala Class 五.踩坑填坑记录 5.1:Error:(4, ...

  6. Maven多模块的2种依赖管理策略

    在Maven多模块的时候,管理依赖关系是非常重要的,各种依赖包冲突,查询问题起来非常复杂,于是就用到了<dependencyManagement>, 示例说明, 在父模块中: <de ...

  7. PTA 乙 1001

    1001 害死人不偿命的(3n+1)猜想 题目描述 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下 ...

  8. Codeforces Round #625 (Div. 2)

    Contest Info Practice Link Solved A B C D E F 4/6 O O Ø  Ø     O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试 Sol ...

  9. POJ1113:Wall (凸包算法学习)

    题意: 给你一个由n个点构成的多边形城堡(看成二维),按顺序给你n个点,相邻两个点相连. 让你围着这个多边形城堡建一个围墙,城堡任意一点到围墙的距离要求大于等于L,让你求这个围墙的最小周长(看成二维平 ...

  10. P1091 合唱队形(LIS)

    题目描述 NNN位同学站成一排,音乐老师要请其中的(N−KN-KN−K)位同学出列,使得剩下的KKK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,-,K1,2, ...