selenium findelement vba阻止了这个例程

问题描述 投票:0回答:2

这是我打开网站和搜索对象的代码。可能发生了未找到对象的情况,因此我必须对其存在与否进行搜索,以便执行或不执行操作。我正在尝试这种方式,但如果我正在寻找的对象,例程崩溃....

  Dim bot As New SeleniumWrapper.WebDriver
  bot.SetProfile "C:\Users\USER\AppData\Local\Google\Chrome\User Data\Default"
  bot.start "chrome", "https://website.com/"
  bot.Open "/"
  bot.wait 10000
  bot.findElementByClassName("_20NlL").Click
  bot.Wait 1000
  bot.findElementByClassName("C28xL").Click
  bot.Wait 1200
  bot.SendKeys text
  bot.Wait 2000
  Dim notext As WebElement
  Set notext = bot.findElementByClassName("_3WZoe", timeoutms:=0)
  If notext Is Nothing Then
  ......[this is the error that is shown to me][1]

![1]:https://i.stack.imgur.com/wWKzW.jpg

我错了什么?

如果我将机器人声明为webdriver或chromedriver,如QHarr所示,我很遗憾地得到了这个错误....

错误运行时33:会话未创建异常ecc。我正在使用chrome 69.0

vba excel-vba selenium selenium-webdriver access-vba
2个回答
2
投票

我能看到的一些错误让我觉得你已经将它翻译成另一种语言,或者使用的语法不是为当前的selenium basic wrapper设计的。

1)对于selenium basic,以下timeoutms不是命名参数。正确的命名参数是timeout,因此您报告的错误有些奇怪,因为您应该收到命名参数错误消息。

2)如果使用Chrome,只需声明为Dim bot As New WebDriverNew ChromeDriver

3)使用硒碱的正确方法是FindElementByClass


您的sendKeys可能应该专注于特定元素,例如

bot.findElementByClass("C28xL").SendKeys Text

您可以检查当前是否存在元素

bot.findElementByClass("_3WZoe", timeout:=0, Raise:=False)

再次,请记住导航父form/frame/iframe标签和等待时间的关键点。


确保您使用的是最新的Chrome浏览器和ChromeDriver。 ChromeDriver应位于environmental path上,即位于环境路径上的文件夹中,路径部分(用于驱动程序)应该是.exe(但不包括.exe)(即包含文件夹级别)。您也可以在代码中指定要查找驱动程序的位置作为语句。


1
投票
Set notext = bot.findElementByClassName("_3WZoe", timeoutms:=0)

你是明确设置timeoutms:=0。你没有时间尝试在页面上找到元素。从呼叫中取出该参数,给它时间在页面上找到元素。它将在默认的超时值上运行(不记得它是什么,但在大多数情况下应该快速返回)。你已经从之前的sendKeys命令等了2秒,所以很可能(虽然不能保证)该元素将被加载。


此外,您正在寻找的元素完全可能位于页面某处的框架中,并且您必须切换到正确的框架才能有机会使findElementBy<anyoftheoptions>工作。

这是我遇到的最大问题之一就是缺乏足够的理解HTML来快速轻松地通过网页源来实现项目的“轻松工作”。我做了,有足够的试验和错误,最终到达那里。


此外,我强烈建议您将整个事情包装在一些错误处理中,以便能够捕获并优雅地从错误中恢复。您正在处理网络服务器和互联网以及局域网以外的一般流量 - 会有超时。如果您的代码不会因为您无法控制的事情而爆炸,那将是一件好事。

© www.soinside.com 2019 - 2024. All rights reserved.