首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用chromedp运行webdriver时访问数据库?

如何在使用chromedp运行webdriver时访问数据库?
EN

Stack Overflow用户
提问于 2021-07-27 01:29:24
回答 1查看 63关注 0票数 0

我想在银行页面上自动提交动态口令。我将得到我的数据库中的动态口令后,只有在webdriver已经点击了银行页面上的确认。确认后,我需要从数据库中获取OTP,然后自动提交OTP。

代码语言:javascript
复制
  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期望所有参数都是chromedp.Tasks类型,所以我不能在那里调用定制函数,并且在从db中获取动态口令时出现错误。我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-27 20:21:56

解决方案是将otp fetch封装在一个Action.Do调用中,然后返回对chromdp.SendKeys的调用结果以设置HTML输入值。

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

像这样

代码语言:javascript
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68534169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档