excel - 在需要身份验证的网站中使用 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 无法连接到远程服务器
解决方案
我对 HTTP 的了解肯定很薄弱,所以我可能并不完全准确,但我认为我已经足够接近让你感动了。
将其移到循环之外:
chrome.get sfSearchURL
我怀疑正在发生的事情,是您请求与Get
. Selenium 具有隐式等待,Get
因此创建了会话,并且该会话的 URL 与用作退出条件的 URL 不匹配。当您的代码循环返回时,它会Get
再次调用,从而丢弃您的新请求会话。
这也会导致分支到 MsgBox,特别是,它会在分支之前删除会话。
我不得不问这个虽然......
“每次我打开 ChromeDriver 时,它都会打开一个新会话并忘记身份验证,所以我无法进行会话,每次执行搜索功能时都必须重新登录”
- “打开 ChromeDriver”到底是什么意思,您究竟是如何打开它的?
这一行:
Set chrome = New Selenium.ChromeDriver
...保证放弃之前举行的任何会话chrome
并打开一个新会话。这是设计使然,这正是它应该做的和您应该期待的。
如果这是一个更大的循环的一部分,那么这就是一个确凿的证据。
可以从一个实例创建新会话,chrome
但我使用具有不同接口的自定义类来初始化单独的同时会话,因为它使我的项目更易于管理和一致。
还。如果您的代码为我们提供最好的帮助,您确实需要包含更多内容。我必须推断和猜测我可能写或可能没有写的内容。
推荐阅读
- wpf - 如何使不适合其父级范围的控件消失
- r - 计算字符串中元素的出现次数
- php - 使用 php 设计报表,如 Asp.net 中的 Crystal Reports
- activiti - activiti中多实例案例的执行树结构
- spring - 如何解决在使用 Spring Boot 和 Spring Security 启用 CSRF 后无法正常工作的登录问题?
- reactjs - 如何从对象数组动态创建 jsx 表?
- javascript - 在 vscode 中实现 Import 语句 linting/show/highlight 警告
- python - 将二维形状绘制成 numpy 数组
- python - Matplotlib - 以对数刻度标出方向
- c# - 如何使用 WebDav 在 C# 中访问 nextcloud 文件?