和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. php中两个函数可能导致的sql注入

    sprintf https://www.php.net/manual/zh/function.sprintf.php 漏洞demo: <?php $name = addslashes($_GET ...

  2. Linux 输入输出重定向, &>file, 2>&1, 1>&2

    Linux 输入输出重定向, &>file, 2>&1, 1>&2 一.1和2在Linux中代表什么 1.1 输出重定向 1.2 输入重定向 1.3 绑定重定 ...

  3. Spring cloud-Bus (消息总线)

    <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring ...

  4. TCP/IP__Cisco的3层分层模型

    1. Cisco的层次模型:3个层次和它们的典型功能 核心层:骨干 分配层:路由 接入层:交换 核心层 1. 核心层就是网络的核心.它位于顶层,负责可靠而迅速地传输大量的数据流.网络核心层的唯一意图是 ...

  5. DolphinScheduler1.3.2源码分析(一)看源码前先把疑问列出来

    1.谈谈如何看源码   个人觉得拿到一个开源的项目,首先要先使用一下. 如果是有页面的那种,可以先把测试平台部署起来,然后到处随意点点,然后用一下最基础的功能,走一遍基础的使用流程.不用担心会把系统弄 ...

  6. P3164 [CQOI2014]和谐矩阵(高斯消元 + bitset)

    题意:构造一个$n*m$矩阵 使得每个元素和上下左右的xor值=0 题解:设第一行的每个元素值为未知数 可以依次得到每一行的值 然后把最后一行由题意条件 得到$m$个方程 高斯消元解一下 bitset ...

  7. Codeforces Global Round 8 A. C+=(贪心)

    题目链接:https://codeforces.com/contest/1368/problem/A 题意 给出 $a,b$,只可以使用 '+=' 运算符,问至少要使用多少次使得 $a$ 或 $b$ ...

  8. Codeforces Round #613 (Div. 2) C. Fadi and LCM(LCM & GCD)

    题意: LCM(a, b) = X,求 max(a, b) 的最小值. 思路: a, b 只可能存在于 X 的因子中,枚举即可. #include <bits/stdc++.h> usin ...

  9. map详细的复习

    map 就是一种基于自建红黑树的 一一对应的hash 的容器 通过模板方式实现  map<type,type> mapname: 前边是key 后边是 vale 转载如下作者:sevenc ...

  10. AtCoder Beginner Contest 168

    比赛链接:https://atcoder.jp/contests/abc168/tasks A - ∴ (Therefore) 题意 给出一个由数字组成的字符串 $s$,要求如下: 如果 $s$ 以 ...