首页 > 解决方案 > 在需要身份验证的网站中使用 ChromeDriver 时保持连接

问题描述

我正在使用 VBA 和 Selenium ChromeDriver 在需要身份验证的网站中抓取数据。

问题是,ChromerDriver 似乎会在代码的任何中断中重新启动(即使它不是错误,例如当应用程序要求用户输入时)。

' Loads search page
Set chrome = New Selenium.ChromeDriver

Do
    chrome.get sfSearchURL

    If chrome.URL <> sfSearchURL Then 'If it is not in desired search page, prompts user to log in.
        intCont = MsgBox ("Log in and click OK")

        If intCont = vbCancel Then
            strErrorMsg = "Not logged in"
            Exit Function
        End If

    End If

Loop Until chrome.URL = sfSearchURL

当我在未登录的情况下加载搜索页面时,服务器会加载登录页面。

问题是:

首先,每次我打开 ChromeDriver 时,它都会打开一个新会话并忘记身份验证,所以我无法进行会话,每次执行搜索功能时都必须重新登录。

其次,当 VBA 显示 MsgBox 并且用户单击 OK 时,变量chrome会丢失到对象的链接,并且在下一行 ( Loop Until) 我得到

运行时错误 0:WebRequestError 无法连接到远程服务器

标签: excelvbaseleniumselenium-chromedriver

解决方案


我对 HTTP 的了解肯定很薄弱,所以我可能并不完全准确,但我认为我已经足够接近让你感动了。

将其移到循环之外:

chrome.get sfSearchURL

我怀疑正在发生的事情,是您请求与Get. Selenium 具有隐式等待,Get因此创建了会话,并且该会话的 URL 与用作退出条件的 URL 不匹配。当您的代码循环返回时,它会Get再次调用,从而丢弃您的新请求会话。

这也会导致分支到 MsgBox,特别是,它会在分支之前删除会话。


我不得不问这个虽然......

“每次我打开 ChromeDriver 时,它都会打开一个新会话并忘记身份验证,所以我无法进行会话,每次执行搜索功能时都必须重新登录”

  • “打开 ChromeDriver”到底是什么意思,究竟如何打开它的?

这一行:

Set chrome = New Selenium.ChromeDriver

...保证放弃之前举行的任何会话chrome并打开一个新会话。这是设计使然,这正是它应该做的和您应该期待的。

如果这是一个更大的循环的一部分,那么这就是一个确凿的证据。

可以从一个实例创建新会话,chrome但我使用具有不同接口的自定义类来初始化单独的同时会话,因为它使我的项目更易于管理和一致。

还。如果您的代码为我们提供最好的帮助,您确实需要包含更多内容。我必须推断和猜测我可能写或可能没有写的内容。


推荐阅读