Excel 使用Selenium VBA提交ESPN登录凭据(修订版)

Excel 使用Selenium VBA提交ESPN登录凭据(修订版),excel,vba,selenium-webdriver,web-scraping,selenium-chromedriver,Excel,Vba,Selenium Webdriver,Web Scraping,Selenium Chromedriver,我试图在Excel VBA代码中使用Selenium来刮取需要登录才能访问的页面。因为我的代码在登录窗口失败,所以我甚至还没有进入到抓取部分。这是ESPN梦幻体育节目的一部分 根据我的问题的第一个版本的反馈,我修改了我的代码以选择正确的iframe并包含一个定时循环(per),但它仍然不起作用。以下是我到目前为止的情况: Sub TestLoginToESPN2() Dim bot As New WebDriver Dim URL As String Dim t As

我试图在Excel VBA代码中使用Selenium来刮取需要登录才能访问的页面。因为我的代码在登录窗口失败,所以我甚至还没有进入到抓取部分。这是ESPN梦幻体育节目的一部分

根据我的问题的第一个版本的反馈,我修改了我的代码以选择正确的iframe并包含一个定时循环(per),但它仍然不起作用。以下是我到目前为止的情况:

Sub TestLoginToESPN2()

    Dim bot As New WebDriver
    Dim URL As String
    Dim t As Date
    Dim ele As Object
    
    Const WAIT_TIME_SECS As Long = 30
    t = Timer
    URL = "https://fantasy.espn.com/football/team?leagueId=228988&teamId=10"
    
    With bot
        .Start "Chrome"
        .Get URL
        Do
            DoEvents
            If Timer - t > WAIT_TIME_SECS Then Exit Do
            On Error Resume Next
            .SwitchToFrame "disneyid-iframe"
            Set ele = .FindElementByCss("input.ng-valid-pattern")
            On Error GoTo 0
        Loop While ele Is Nothing
        If ele Is Nothing Then Exit Sub
        ele.SendKeys ("asfdasfd")
        
        Do
            DoEvents
            If Timer - t > WAIT_TIME_SECS Then Exit Do
            On Error Resume Next
            .SwitchToFrame "disneyid-iframe"
            Set ele = .FindElementByCss("input.ng-valid-parse")
            On Error GoTo 0
        Loop While ele Is Nothing
        If ele Is Nothing Then Exit Sub
        ele.SendKeys ("password123")
        
        .FindElementByCss("button.btn").Click
        
    End With
    
    Application.Wait Now + TimeValue("00:00:20")

End Sub
用户名框中只输入用户名的前1或2个字符,输入完整密码,但用户名框(而不是密码框)中也输入完整密码,我不知道按钮单击是否有效,因为密码为空


关于如何修复我的代码有什么建议吗?谢谢

下面是一个简单但有效的代码:

Sub TestLoginToESPN()

Dim bot As New WebDriver
Dim URL As String
Dim t As Date
Dim ele As Object

Const WAIT_TIME_SECS As Long = 30
t = Timer
URL = "https://fantasy.espn.com/football/team?leagueId=228988&teamId=10"

'Login to page
With bot
    .Start "Chrome"
    .Get URL
    .SwitchToFrame "disneyid-iframe"
    Do
        DoEvents
        If Timer - t > WAIT_TIME_SECS Then Exit Do
        On Error Resume Next
        Set ele = .FindElementByCss("input.ng-valid-pattern")
        On Error GoTo 0
    Loop While ele Is Nothing
    If ele Is Nothing Then Exit Sub
    With ele
        .SendKeys ("u")
        .SendKeys ("sername")
    End With
    
    Set ele = .FindElementByXPath("/html/body/div[1]/div/div/section/section/form/section/div[2]/div/label/span[2]/input")
    With ele
        .SendKeys ("p")
        .SendKeys ("assword123")
    End With
    
    .FindElementByCss("button.btn").Click 'click enter
End With

Application.Wait Now + TimeValue("00:00:20")

End Sub

抱歉,我没有安装Selenium。我将复制Mathieu的评论并询问,您是否考虑过使用?感谢@Profex的建议,但不幸的是ESPN不再发布开发者密钥,因此API访问被关闭。看,我取得了一些进展,我在这里发布,以防它能帮助其他人。我可以通过对上面的代码做2个更改来实现这一点。首先,我用XPath而不是CSS引用密码字段(XPath是/html/body/div[1]/div/div/section/section/form/section/div[2]/div/label/span[2]/input)。第二出于某种原因,我不得不将每个框中的文本条目分成两行,第一行只包含第一个字符,第二行包含其余字符。例如,如果密码是“password123”,那么我需要使用ele.SendKeys(“p”),然后使用ele.SendKeys(“assword123”),一行接一行。我不知道为什么。我相信有更好/更干净的方法可以做到这一点,但上述方法对我很有效,所以我继续前进!