Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何登录网页和截图

如何登录网页和截图
EN

Stack Overflow用户
提问于 2018-08-19 21:41:23
回答 1查看 2.5K关注 0票数 2

如何使用chromedp登录网页并截图。

https://github.com/chromedp/chromedp

EN

回答 1

Stack Overflow用户

发布于 2018-08-19 23:30:34

将文本发送到网站输入的示例

代码语言:javascript
运行
AI代码解释
复制
func main() {
    var err error

    // create context
    ctxt, cancel := context.WithCancel(context.Background())
    defer cancel()

    // create chrome instance
    c, err := chromedp.New(ctxt, chromedp.WithLog(log.Printf))
    if err != nil {
        log.Fatal(err)
    }

    // run task list
    var val1, val2, val3, val4 string
    err = c.Run(ctxt, sendkeys(&val1, &val2, &val3, &val4))
    if err != nil {
        log.Fatal(err)
    }

    // shutdown chrome
    err = c.Shutdown(ctxt)
    if err != nil {
        log.Fatal(err)
    }

    // wait for chrome to finish
    err = c.Wait()
    if err != nil {
        log.Fatal(err)
    }

    log.Printf("#input1 value: %s", val1)
    log.Printf("#textarea1 value: %s", val2)
    log.Printf("#input2 value: %s", val3)
    log.Printf("#select1 value: %s", val4)
}

func sendkeys(val1, val2, val3, val4 *string) chromedp.Tasks {
    return chromedp.Tasks{
        chromedp.Navigate("file:" + os.Getenv("GOPATH") + 
      "/src/github.com/chromedp/chromedp/testdata/visible.html"),
        chromedp.WaitVisible(`#input1`, chromedp.ByID),
        chromedp.WaitVisible(`#textarea1`, chromedp.ByID),
        chromedp.SendKeys(`#textarea1`,
      kb.End+"\b\b\n\naoeu\n\ntest1\n\nblah2\n\n\t\t\t\b\bother
      box!\t\ntest4", chromedp.ByID),
        chromedp.Value(`#input1`, val1, chromedp.ByID),
        chromedp.Value(`#textarea1`, val2, chromedp.ByID),
        chromedp.SetValue(`#input2`, "test3", chromedp.ByID),
        chromedp.Value(`#input2`, val3, chromedp.ByID),
        chromedp.SendKeys(`#select1`, kb.ArrowDown+kb.ArrowDown,
      chromedp.ByID),
        chromedp.Value(`#select1`, val4, chromedp.ByID),
        chromedp.Sleep(30 * time.Second),
    }
}

然后您可以单击登录按钮,这是另一个示例

代码语言:javascript
运行
AI代码解释
复制
// Command click is a chromedp example demonstrating how to use a selector to
// click on an element.
package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    var err error

    // create context
    ctxt, cancel := context.WithCancel(context.Background())
    defer cancel()

    // create chrome instance
    c, err := chromedp.New(ctxt, chromedp.WithLog(log.Printf))
    if err != nil {
        log.Fatal(err)
    }

    // run task list
    err = c.Run(ctxt, click())
    if err != nil {
        log.Fatal(err)
    }

    // shutdown chrome
    err = c.Shutdown(ctxt)
    if err != nil {
        log.Fatal(err)
    }

    // wait for chrome to finish
    err = c.Wait()
    if err != nil {
        log.Fatal(err)
    }
}

func click() chromedp.Tasks {
    return chromedp.Tasks{
        chromedp.Navigate(`https://golang.org/pkg/time/`),
        chromedp.WaitVisible(`#footer`),
        chromedp.Click(`#pkg-overview`, chromedp.NodeVisible),
        chromedp.Sleep(150 * time.Second),
    }
}

为拍摄屏幕截图

代码语言:javascript
运行
AI代码解释
复制
// Command screenshot is a chromedp example demonstrating how to take a
// screenshot of a specific element.
package main

import (
    "context"
    "io/ioutil"
    "log"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    var err error

    // create context
    ctxt, cancel := context.WithCancel(context.Background())
    defer cancel()

    // create chrome instance
    c, err := chromedp.New(ctxt, chromedp.WithLog(log.Printf))
    if err != nil {
        log.Fatal(err)
    }

    // run task list
    var buf []byte
    err = c.Run(ctxt, screenshot(`https://brank.as/`, `#contact-form`, &buf))
    if err != nil {
        log.Fatal(err)
    }

    // shutdown chrome
    err = c.Shutdown(ctxt)
    if err != nil {
        log.Fatal(err)
    }

    // wait for chrome to finish
    err = c.Wait()
    if err != nil {
        log.Fatal(err)
    }

    err = ioutil.WriteFile("contact-form.png", buf, 0644)
    if err != nil {
        log.Fatal(err)
    }
}

func screenshot(urlstr, sel string, res *[]byte) chromedp.Tasks {
    return chromedp.Tasks{
        chromedp.Navigate(urlstr),
        chromedp.Sleep(2 * time.Second),
        chromedp.WaitVisible(sel, chromedp.ByID),
        chromedp.WaitNotVisible(`div.v-middle > div.la-ball-clip-rotate`, chromedp.ByQuery),
        chromedp.Screenshot(sel, res, chromedp.NodeVisible, chromedp.ByID),
    }
}

如果你想要一个更详细的答案,你需要在网站上发布,希望它能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51922052

复制
相关文章
Spring @Resource注入报空指针异常
今天在项目中使用@Resource进行依赖注入时给我报了一个空指针异常: 示例代码: @Resource private static DemoService demoService; 解决办法:使用SpringContextHolder获取Bean private static final DemoService DEMO_SERVICE = SpringContextHolder.getBean(DemoService.class);
倾盖
2022/08/16
1.8K0
Spring @Resource注入报空指针异常
Collectors.toMap 当value为空时,报空指针
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors;
botkenni
2022/11/12
3.1K0
Collectors.toMap 当value为空时,报空指针
Java - foreach循环报NPE空指针异常
最近debug时忽然发现,如果一个集合赋值为null,那么对该集合进行foreach循环(也叫增强for循环)时,会报NPE(即空指针异常NullPointerException)。
雨临Lewis
2022/01/11
2K0
【已解决】springboot在使用redisTemplate的测试的时候报空指针
在使用springboot项目中,使用RedisTemplate在Junit测试的时候,报RedisTemplate空指针:
凯哥Java
2022/12/16
1.6K0
【已解决】springboot在使用redisTemplate的测试的时候报空指针
空指针错误导致tomcat报404错误
项目代码的异常类型为500 400 没有404错误 线上却偶尔报404错误,导致成功率低于99% 追查发现是由于一个空指针错误,未被捕获抛出指定项目异常 mark
架构师刀哥
2018/03/20
1.5K0
空指针赋值(指针赋值有几种方法)
上学期刚学C语言的时候很迷,老师说要避免野指针,但是空指针似乎又没办法赋值,就只好尽量减少指针的使用。 今天查了一下发现是这样赋值的: 先把要赋值的变量的地址赋给空指针,然后才能把变量的值赋给该指针。
全栈程序员站长
2022/08/01
1.4K0
拦截器注入Service报空指针的坑
今天写了个拦截器,注入一个Service,结果没注入进去,报空指针 后来发现原来在拦截器配置处需要用@Bean的形式注入 并且在上面addInterceptor里面调用该函数 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(visitInterceptor()) .addPathPatterns("/**");
阿超
2022/08/16
5130
拦截器注入Service报空指针的坑
android组件调用onMeasure时报空指针
android.view.View.measure(int widthMeasureSpec, int heightMeasureSpec) 这个函数时,如果这个View是通过LayoutInflater来构建的,会报: java.lang.NullPointerException at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:529) at android.view.View.measure(View.ja
程思扬
2022/01/10
3350
Android TextView 中 setText 的空指针异常
第一次发现这问题,记录一下,在适配器里面给TextView设置一个int类型的值,然后闪退报错,DeBug模式下查看了布局和id,均没有问题,再次查看日志输出,Caused By: android.content.res.Resources$NotFoundException:String resource ID #0x86,发现有两个词引起了注意String Resources,才知道TextView在内部实现时设置的类型为String,所以用String.valueOf(),这里再啰嗦几句,在String类型的转化问题上,String.valueOf()效率最高,因为虚拟机对它进行了特殊处理,其次是toString,最后是+""的拼接形式,拼接String的形式内部实现其实就是toString,但是要相对复杂一些,拼接过程中产生了常量和一些判断条件,效率低下,详情见源码
萬物並作吾以觀復
2018/09/13
1.8K0
list.add(),向List集合插入对象报空指针异常
开始的时候我没有判断添加的随想是否为空,直接add;后来加了一个判断,判断了对象不等于空, 但是运行程序还是报空指针,这时我发现应该是List出问题了: 查了下资料,发现我初始化List方法不对,如果只是用 List<UserAndTest> list1 = null; 只是在栈中有一个引用但并没有分配内存空间,如果这时我直接向List里添加对象就是直接向这个引用所指的内存放东西,因为没分配内存,所以会报空指针异常,所以需要写作: List<UserAndTest> list1 = new ArrayLis
二十三年蝉
2018/03/01
2.4K0
Android开发笔记(一百零四)消息推送SDK
推送:从服务器把消息实时发到客户端app上,这就是推送,推送可用于发送系统通知、发送推荐信息、发送聊天消息等等。 别名:用于给移动设备取个好记的名字,比如电脑有计算机名,可以把别名理解为开发者给移送设备起的外号。不过,多个移动设备可以起一样的别名,这几个设备就会同时收到发给该别名的消息。 标记:用于给移动设备打标签,可以理解为分类,比如超市里的泰国大米既可以打上“粮食制品”的标签,也可以打上“进口商品”的标签。服务器可以统一给某个种类的移动设备发送消息;如果移动设备打上本设备手机号码的标签,那么服务器就能该号码的手机单独发消息。 自定义消息:推送的消息内容一般由sdk直接展示在系统的通知栏,不过有时候我们希望由自己控制展示通知的时机,比如说要预先处理某项事务,或者说以对话框形式展现消息等等,在这些时候,自定义消息就派上用场了,app可以先接收服务器发来的自定义消息,然后自主选择接下来的处理逻辑。
aqi00
2019/01/18
1.6K0
测试android sdk是否安装成功,配置Android SDK
2、把%ANDROID_SDK_HOME%\platform-tools;%ANDROID_SDK_HOME%\tools添加到Path环境变量中。
全栈程序员站长
2022/09/13
3.8K0
测试android sdk是否安装成功,配置Android SDK
空类型指针
malloc 查看底层源码中发现是空类型的指针,空类型的指针可以接收任意类型的指针,但是不能取出指针里的内容,如果要取出内容必须要强转。
潇洒
2019/07/02
8140
空指针,野指针,万能指针
空指针指向地址编号为0的地址,不可以访问空指针指向的内容,因为内存地址编号0~255之间被系统占用,不可以访问 但是可以printf("%d",p);,输出p指向的地址
大忽悠爱学习
2021/03/02
1.4K0
C/CPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针
普通变量可以不赋初值,但是指针变量的初值必须万分慎重,因为未来的*操纵会以这个初值为目标内存地址,往里面读写数据(可以才C primer plus中看到相应分析)
CtrlX
2023/03/21
1.8K0
C/CPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针
C/CPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针
普通变量可以不赋初值,但是指针变量的初值必须万分慎重,因为未来的*操纵会以这个初值为目标内存地址,往里面读写数据(可以才C primer plus中看到相应分析)
CtrlX
2022/10/04
1.7K0
C/CPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针
空指针的传说
他原本不叫这个名字,空指针原本复姓异常,空指针只不过是他的武器,但他杀戮过多,渐渐地人们只记住了空指针这三个字。
macrozheng
2020/12/21
7880
空指针的传说
空指针的传说
他原本不叫这个名字,空指针原本复姓异常,空指针只不过是他的武器,但他杀戮过多,渐渐地人们只记住了空指针这三个字。
艾小仙
2021/01/11
7400
空指针的传说
java空指针报错_空指针异常是什么意思
Java 中任何对象都有可能为空,当我们调用空对象的方法时就会抛出 NullPointerException 空指针异常,这是一种非常常见的错误类型。我们可以使用若干种方法来避免产生这类异常,使得我们的代码更为健壮。本文将列举这些解决方案,包括传统的空值检测、编程规范、以及使用现代 Java 语言引入的各类工具来作为辅助。
全栈程序员站长
2022/11/17
2.3K0
java空指针报错_空指针异常是什么意思
mysql 8.0 Druid连接时调用getServerCharset报空指针异常解决方法[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 类似错误信息如下: 16:52:01.163 [Druid-ConnectionPool-Create-1641320886] ERROR com.aliba
全栈程序员站长
2022/07/21
1.1K0

相似问题

sdk启动报空指针异常为何?

1254

TIM 报 SDK 报错?

1384

云直播有录制系统音频及推送的SDK吗?

0135

语音合成SDK有Android平台例子吗?

0246

集成sdk后报如下错误 发现demo也是报相应的这个错误?

1270
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档