Maison > développement back-end > Golang > chromedp click ne fonctionne pas dans mon code golang. Pouvez-vous identifier le problème ?

chromedp click ne fonctionne pas dans mon code golang. Pouvez-vous identifier le problème ?

PHPz
Libérer: 2024-02-10 09:54:10
avant
758 Les gens l'ont consulté

chromedp click 在我的 golang 代码中不起作用。你能找出问题所在吗?

éditeur php fraise, bonjour ! Concernant le problème que vous avez mentionné, si chromedp click ne fonctionne pas dans votre code golang, je peux vous aider à trouver le problème. chromedp est une bibliothèque qui utilise le protocole Chrome DevTools pour l'automatisation. La méthode click est utilisée pour simuler les événements de clic de souris. Les problèmes possibles incluent : 1. L'élément de page est invisible ou bloqué par d'autres éléments, provoquant l'échec du clic ; 2. Les paramètres de la méthode click sont transmis de manière incorrecte 3. La version de chromedp est incompatible avec la version du navigateur Chrome ; .Autres problèmes de logique de code. Veuillez fournir plus de détails et je vous proposerai une solution dans les plus brefs délais.

Contenu de la question

J'utilise chromedp pour développer Scraper.

Pour obtenir le contenu que je souhaite (page html) je dois cliquer sur un bouton spécifique.

J'ai donc utilisé chromedp.click et chromedp.outerhtml, mais je n'ai obtenu que le HTML de la page avant le clic, pas le HTML de la page une fois le clic terminé.

Pouvez-vous voir mon code et me suggérer comment le corriger ?

func runCrawler(URL string, lineNum string, stationNm string) {
    
        // settings for crawling
    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        chromedp.Flag("headless", false))
    
        // create chrome instance
    contextVar, cancelFunc := chromedp.NewExecAllocator(context.Background(), opts...)
    defer cancelFunc()

    contextVar, cancelFunc = chromedp.NewContext(contextVar)
    defer cancelFunc()


    var htmlContent string

    err := chromedp.Run(contextVar,
        chromedp.Navigate(URL),
        chromedp.WaitVisible(".end_footer_area"),
        chromedp.Click(".end_section.station_info_section > div.at_end.sofzqce > div > div.c10jv2ep.wrap_btn_schedule.schedule_time > button"),
        chromedp.OuterHTML("html", &htmlContent, chromedp.ByQuery),
    )
    fmt.Println("html", htmlContent)
    checkErr(err)
Copier après la connexion

Je vous rends la page d'accueil et les boutons sur lesquels je dois cliquer

URL de la page : https://pts.map.naver.com/end-subway/ends/web/11321/home

La zone du bouton sur laquelle je dois cliquer :

Merci beaucoup

Solution de contournement

La page que vous souhaitez obtenir est ouverte dans un nouvel onglet (cible).

Dans ce cas, nous pouvons utiliser chromedp.waitnewtarget pour créer un chan à partir duquel nous pouvons recevoir l'identifiant cible du nouvel onglet. Créez ensuite un nouveau contexte en utilisant l'option chromedp.withtargetid afin que nous puissions nous connecter au nouvel onglet. A partir de là, tout vous est familier.

package main

import (
    "context"
    "fmt"
    "strings"

    "github.com/chromedp/cdproto/target"
    "github.com/chromedp/chromedp"
)

func main() {
    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        chromedp.Flag("headless", false),
    )

    ctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
    defer cancel()

    ctx, cancel = chromedp.NewContext(ctx)
    defer cancel()

    var htmlContent string

    ch := chromedp.WaitNewTarget(ctx, func(i *target.Info) bool {
        return strings.Contains(i.URL, "/timetable/web/")
    })

    err := chromedp.Run(ctx,
        chromedp.Navigate("https://pts.map.naver.com/end-subway/ends/web/11321/home"),
        chromedp.WaitVisible(".end_footer_area"),
        chromedp.Click(".end_section.station_info_section > div.at_end.sofzqce > div > div.c10jv2ep.wrap_btn_schedule.schedule_time > button"),
    )
    if err != nil {
        panic(err)
    }

    newCtx, cancel := chromedp.NewContext(ctx, chromedp.WithTargetID(<-ch))
    defer cancel()

    if err := chromedp.Run(newCtx,
        chromedp.WaitReady(".table_schedule", chromedp.ByQuery),
        chromedp.OuterHTML("html", &htmlContent, chromedp.ByQuery),
    ); err != nil {
        panic(err)
    }
    fmt.Println("html", htmlContent)
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal