go-rod / rod

A Chrome DevTools Protocol driver for web automation and scraping.
https://go-rod.github.io
MIT License
5.31k stars 347 forks source link

page.MustElement will hang in a loop after the element disappear #444

Closed zhangguanzhang closed 3 years ago

zhangguanzhang commented 3 years ago

Rod Version: v0.100.0

The code to demonstrate your question

就是a站登录上传视频

package main

import (
    "fmt"
    "github.com/go-rod/rod"
    "github.com/go-rod/rod/lib/launcher"
    "strings"
    "time"
)

var (
    user = `xxxx`
    pass = `xxxx`
    file = `D:\Non-Install\youtube-dl\aql2cz0aNnUU.mp4`

)

func main() {

    u := launcher.New().
        Bin(`C:\Program Files\Google\Chrome\Application\chrome.exe`).
        Set("headless").
        Delete("--headless").
        MustLaunch()

    browser := rod.New().ControlURL(u).MustConnect()

    loginPage := browser.
        MustPage("https://www.acfun.cn/login/?returnUrl=https%3A%2F%2Fwww.acfun.cn%2F")

    loginPage.MustWaitLoad()

    loginPage.MustElement("#login-account-switch").MustClick()

    loginPage.MustElement("#ipt-account-login").MustInput(user)
    loginPage.MustElement("#ipt-pwd-login").MustInput(pass)

    loginPage.MustElement("#form-login > div.area-tool > div").MustClick()
    loginPage.MustWaitLoad()

    <-time.After(time.Second * 2)
    //page.Navigate("https://member.acfun.cn/")

    page := browser.
        MustPage("https://member.acfun.cn/upload-video")
    loginPage.Close()
    page.MustWaitLoad()
    <- time.After(time.Second)
    page.MustElement("body > div.main.admin > div.upload-container > div.upload-content-body.clearfix > div > div > div > div.upload-video-file.fr > div > div:nth-child(4) > div > input").
        SetFiles([]string{file})

    //<span data-v-7ace52fd="" class="video-upload-item-status">72.2 MB/390.2 MB</span>
    //<span data-v-7ace52fd="" class="video-upload-item-speed">3.6MB/s</span>

    <-time.After(time.Second* 4)

    for {
        uploadStatusStr := page.MustElement("span[class=video-upload-item-status]").MustText()
                speedStr := page.MustElement("span[class=video-upload-item-speed]").MustText()
        if !strings.Contains(uploadStatusStr, "/") {
            break
        }

        fmt.Printf("\r%-20s speed: %s\n", uploadStatusStr, speedStr)

        strSli := strings.Split(uploadStatusStr, "/")
        if strSli[0] == strSli[1] {
            break
        }
        <-time.After(time.Second*1)
    }

}

上传完了后span[class=video-upload-item-status]的文本会变成上传完成 speed的span消失,然后代码里则会一直卡住。调试发现一直卡在 speedStr := page.MustElement("span[class=video-upload-item-speed]").MustText()

What have you tried to solve the question

from

        uploadStatusStr := page.MustElement("span[class=video-upload-item-status]").MustText()
                speedStr := page.MustElement("span[class=video-upload-item-speed]").MustText()
        if !strings.Contains(uploadStatusStr, "/") {
            break
        }

change to

        uploadStatusStr := page.MustElement("span[class=video-upload-item-status]").MustText()
        if !strings.Contains(uploadStatusStr, "/") {
            break
        }
               speedStr := page.MustElement("span[class=video-upload-item-speed]").MustText()

@ysmood

rod-robot commented 3 years ago

Please add a valid **Rod Version:** v0.0.0 to your issue. Current version is v0.100.0 generated by check-issue

zhangguanzhang commented 3 years ago

Rod Version: v0.100.0

ysmood commented 3 years ago

能麻烦简化下代码吗?去掉不必要的部分。

MustElement 卡住不是很正常吗?你读读文档,element 不存在它会自动等待它出现。如果永远不出现就永远等待,你可以设置超时。你应该使用 Page.Race: https://go-rod.github.io/#/selectors/README?id=race-selectors

zhangguanzhang commented 3 years ago

明天试试