chromedp click funktioniert in meinem Golang-Code nicht. Können Sie das Problem identifizieren?

PHPz
Freigeben: 2024-02-10 09:54:10
nach vorne
584 Leute haben es durchsucht

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

PHP-Editor Erdbeere, hallo! Was das von Ihnen erwähnte Problem betrifft: Wenn chromedp click in Ihrem Golang-Code nicht funktioniert, kann ich Ihnen helfen, das Problem herauszufinden. chromedp ist eine Bibliothek, die das Chrome DevTools-Protokoll zur Automatisierung verwendet. Die Click-Methode wird zum Simulieren von Mausklickereignissen verwendet. Zu den möglichen Problemen gehören: 1. Das Seitenelement ist unsichtbar oder wird durch andere Elemente blockiert. 2. Die Parameter der Click-Methode werden falsch übergeben. 3. Die Version von chromedp ist nicht mit der Chrome-Browserversion kompatibel . Andere Probleme mit der Codelogik. Bitte geben Sie weitere Details an und ich werde so schnell wie möglich eine Lösung anbieten.

Frageninhalt

Ich verwende chromedp, um Scraper zu entwickeln.

Um den gewünschten Inhalt (Seiten-HTML) zu erhalten, muss ich auf eine bestimmte Schaltfläche klicken.

Also habe ich chromedp.click und chromedp.outerhtml verwendet, aber ich habe nur den HTML-Code der Seite vor dem Klick erhalten, nicht den HTML-Code der Seite, nachdem der Klick abgeschlossen war.

Können Sie meinen Code sehen und mir vorschlagen, wie ich ihn beheben kann?

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)
Nach dem Login kopieren

Ich gebe dir die Homepage und die Schaltflächen zurück, die ich anklicken muss

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

Der Schaltflächenbereich, auf den ich klicken muss:

Vielen Dank

Workaround

Die gewünschte Seite wird in einem neuen Tab (Ziel) geöffnet.

In diesem Fall können wir chromedp.waitnewtarget verwenden, um einen Kanal zu erstellen, von dem wir die Ziel-ID des neuen Tabs erhalten können. Erstellen Sie dann mit der Option chromedp.withtargetid einen neuen Kontext, damit wir eine Verbindung zum neuen Tab herstellen können. Von nun an ist Ihnen alles vertraut.

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)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonchromedp click funktioniert in meinem Golang-Code nicht. Können Sie das Problem identifizieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage