如何在使用 chromedp 运行 webdriver 时访问 db?

Posted

技术标签:

【中文标题】如何在使用 chromedp 运行 webdriver 时访问 db?【英文标题】:How to access db while running a webdriver using chromedp? 【发布时间】:2021-10-02 15:31:10 【问题描述】:

我想在银行页面上自动提交 OTP。只有在 webdriver 单击银行页面上的确认后,我才会在我的数据库中获取 OTP。确认后,我需要从数据库中获取 OTP,然后自动提交 OTP。

  ctx, cancel := chromedp.NewContext(context.Background(),      chromedp.WithDebugf(log.Printf))
    defer cancel()

    // run chromedp tasks
    err := chromedp.Run(ctx,
        chromedp.Navigate(bankUrl),
        chromedp.WaitVisible(`#username`),
        chromedp.SendKeys(`#username`, `usernameXXX`),
        chromedp.WaitVisible(`#label2`, ),
        chromedp.SendKeys(`#label2`, `passwordxxx` ),
        chromedp.Click(`//input[@title="Login"]`),
        chromedp.WaitVisible(`#Go`),
        chromedp.Click(`#Go`),
        chromedp.WaitVisible(`#confirmButton`),
        chromedp.Click(`#confirmButton`),
        chromedp.WaitVisible(`//input[@type="password"]`),
        // perform  fetch OTP below, this raise error
        otp := fetchOTPFromDb()
        chromedp.SendKeys(`//input[@type="password"]`, otp),
        chromedp.WaitVisible(`#confirmButton`),
        chromedp.Click(`#confirmButton`))
    if err != nil 
        log.Fatal(err)
    

问题是 chromedp.Run 期望所有 args 都是 chromedp.Tasks 类型,所以我不能在那里调用自定义函数,并且在从 db 获取 OTP 时出错。我该如何解决这个问题?

【问题讨论】:

一次性密码的一次性密码?我猜,您想获取该 OTP,然后在提交之前将其注入网页? 是的@mh-cbon。问题是我仅在完成自动化步骤的一半后才收到 OTP。所以我不得不偏离 chromedp.Tasks 并调用一些内部函数来获取 OTP。 我猜不可能在调用 chromedp.Run 之前进行 fetch 操作,因为数据还不存在? 如果您尝试play.golang.org/p/_oNQfWHwTxz 会怎样? 工作,非常感谢@mh-cbon。 【参考方案1】:

解决方案是将 otp fetch 包装在 Action.Do 调用中,然后将调用结果返回给 chromdp.SendKeys 以设置 html 输入值。

必须以这种方式工作,因为在获取页面之前一次性密码不存在,因此,必须在操作资源时读取它。

像这样

package main

import "context"

type OTPAction struct 
    // DB ....


func (a OTPAction) Do(ctx context.Context) error 
    // fetch OTP here
    otp := "otp test"
    return chromedp.SendKeys(`//input[@id="user-message"]`, otp).Do(ctx)

【讨论】:

以上是关于如何在使用 chromedp 运行 webdriver 时访问 db?的主要内容,如果未能解决你的问题,请参考以下文章

go使用chromedp模拟滑动验证登录

用golang chromedp 操作已经打开的chrome浏览器

chromedp入门

chromedp下载文件的方法,备忘一下。

如何同时运行多个webdriver python程序?

如何杀死在后台运行的 IEDriver exe 进程(Selenium webdriver)?