【问题标题】:Checking if element exists VBA Selenium检查元素是否存在 VBA Selenium
【发布时间】:2021-07-08 17:29:55
【问题描述】:

寻求有关如何实现 VBA 代码以检查元素是否存在或在 VBA 中显式等待它的帮助。这是我正在测试的一个小示例代码。下面的代码在运行时出错,因为它说“需要对象”


Dim Driver As New ChromeDriver 

Driver.get "Test website"

If Driver.IsElementPresent(By.XPath("/html/body/div[2]/div/div[5]/h3"))) Then
   Debug.Print("Yes")
Else
   Debug.Print("No")

我什至尝试将 .IsElementPresent 更改为这行代码,这样我就可以测试元素的大小(如果存在)但收到“NoSuchElementError”错误

Debug.Print (browser.FindElementByXPath("/html/body/div[2]/div/div[5]/h3").Size())

【问题讨论】:

  • 试试If driver.FindElementsByPath("/html/body/div[2]/div/div[5]/h3").Count = 0 然后.....网址是什么?添加延迟后是否找到元素?
  • 我们如何添加延迟?隐含的?像 browser.Wait(5000) 那样会等待浏览器等待 5 秒再执行下一行代码?

标签: vba selenium google-chrome


【解决方案1】:

似乎对我有用。我在您的代码中看到的唯一问题是您没有在任何地方声明 By

e.Start 不是必需的,但我还是这样做了。

所以我会尝试声明By 看看那里会发生什么。而且你需要将它设置为一个新的实例,简单的类型声明是行不通的,这意味着:

仅使用 Dim By As Selenium.By 是不够的,但以下任一行:

Dim By As New Selenium.By

Dim By As Selenium.By
Set By = New Selenium.By

您收到的Object Required 错误可能是由于我上面提到的缺少声明。

【讨论】:

  • 谢谢,我认为做到了!使用这种方法 .IsElementPresent 更适合让我们说等待页面完全加载,如果布尔值为 true,则元素存在,那么我们可以继续,或者有更好的方法吗?
  • 网页的一般问题在于,对于数据必须如何加载没有真正的标准。当然,IE 有.ReadyState()(它本身已经坏了)。然后你会得到自己加载的 iframe(把它想象成网页中的网页)。我知道没有使用 Selenium 的万无一失的方法可以让您确保网页上的每个元素都已加载。
  • 现在,Selenium 比使用 HTML 库更宽容一些,因为每次您尝试使用元素时,都会有一个内置的宽限超时时间,代码将在抛出错误之前等待.您可以覆盖所有元素的整个超时期限,或逐个覆盖元素。采用方法.FindElementById() 或任何其他findelements...第二个参数是超时,默认情况下设置为-1(这意味着它使用全局设置)。您可以在此处设置自己的超时时间。您可以使用 .Timeouts 属性进行全局设置。
  • 您还说在某些情况下它确实会引发错误,这对我来说是说在那些情况下它确实需要超过 5 秒。我认为您的互联网、服务器或 CPU 速度太慢了,以至于您不得不等待接近 5 秒的时间,这就是为什么有时它可以工作,有时却不能 - 仅仅是因为它确实需要整整 5 秒。您是否尝试将其增加到 20 秒左右,看看是否仍然只需要 5 秒左右?因为如果它需要这 5 秒来加载页面,那么您无法通过优化代码来解决这个问题。
  • 即使是少量的 RAM 也会导致此问题。如果您的计算机必须将数据从 RAM 移动到页面文件以运行宏、打开浏览器并加载页面,它也会减慢页面的加载/呈现速度。打开任务管理器并查看您的 RAM 使用情况。如果它大约是 85% 或更高,那么我确信它正在将数据移动到您的页面文件(这意味着它正在将它移动到您的硬盘驱动器 - 这比 RAM 慢得多)。
猜你喜欢
  • 2018-01-23
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2022-10-20
  • 2016-08-05
相关资源
最近更新 更多