一尘不染

使用VBA和Selenium来驱动网站

selenium

我必须登录SnapSurveys并每月下载20多个文件。现在已经是一个繁琐的过程,现在我必须每周执行一次,而手工完成将变得很繁琐,所以我想实现它的自动化并安装了Selenium来做到这一点。我已经使用SeleniumIDE(在FireFox中)跟踪了整个过程,所以我知道我想做的事情以及如何做的基础知识,但是,我遇到了一个难以理解的砖墙,试图理解该网页。实现它的结构。

使用Chrome和FireFox中的开发工具,我已将“用户名”字段标识为:

<p>
    <label for="UserName">Username</label>
    <input data-val="true" data-val-required="The Username field is required." id="UserName" name="UserName" type="text" value="">
    <span class="field-validation-valid" data-valmsg-for="UserName" data-valmsg-replace="true"></span>
</p>

我正在使用以下代码来尝试查找“用户名”文本框,以便在其中键入数据。我Text依次尝试了每种的值和每种Driver.FindElementBy...可能性,它们都给了我这个错误:

Run-time Error '7':
NoSuchElementError
Element not found for <By type> = <text>

这是代码:

Private Sub Login()

  Const SITE_BASE_NAME As String = "https://www.snapsurveys.com/login"
  Dim Driver As IEDriver
  Set Driver = New IEDriver
  Dim IsSiteLoaded As Boolean

  IsSiteLoaded = Driver.Get(SITE_BASE_NAME)

  If IsSiteLoaded Then
    Dim Text As String
    Text = "columns six"
    Text = "UserName"
    Text = "main"
    Text = "//*[@id=""UserName""]"
    Dim El As WebElement
    Set El = Driver.FindElementByClass(Text)
    Set El = Driver.FindElementByCss(Text)
    Set El = Driver.FindElementById(Text)
    Set El = Driver.FindElementByLinkText(Text)
    Set El = Driver.FindElementByName(Text)
    Set El = Driver.FindElementByPartialLinkText(Text)
    Set El = Driver.FindElementByTag(Text)
    Set El = Driver.FindElementByXPath(Text)
  End If

  Driver.Quit

End Sub

我发现 没有 给我一个错误的一个组合是:

Text = "main"
Set El = Driver.FindElementById(Text)

但这仅使我成为屏幕顶部的面包屑,而且我不确定如何从那里获得有用的信息。

显然,我对Web设计的了解不足,无法提供我应该寻找的任何线索,但是我认为我可以通过尝试和错误尝试来解决此问题,而这比这要少得多。

我需要在页面源代码中寻找哪些元素,FindElementBy需要使用哪些函数在代码中进行搜索?

此外,是否填写用户名和密码字段,单击“登录”,然后单击下一页上的相应链接等,是实现此目的的最佳方法吗?我 认为
登录后,应该可以为我需要的每个文件获取一个链接集合,然后直接下载每个链接,但是我不确定是否可以做到这一点。

一些注意事项:

  • 是的,我意识到该代码正在使用IE作为浏览器。我为FF和Chrome安装的驱动程序似乎已经过时(浏览器会打开,但不会加载网页),而且我还没有更新的驱动程序。目前,只要能正常使用,我都不会在乎使用哪种浏览器。
  • 是的,我意识到我要在末尾关闭浏览器Sub。同样,我只是在测试,试图在黑暗中找到自己的路。

阅读 1661

收藏
2020-06-26

共1个答案

一尘不染

登录功能位于中iframe。您必须将硒的焦点切换到该iframe,然后再试一次,它应该可以工作。

您可以尝试以下方法:

Driver.switchtoframe (0)
Driver.FindElementById("UserName")

有关Web设计的一些知识在处理硒自动化方面可以有很长的路要走,但是只要具备一些基本知识,您就可以轻松完成工作。

您应该寻找什么元素取决于您要实现的目标。如果要在文本字段中输入内容,则应查找<input type="text">元素,对于表格,则需要查找<table>元素。

我通常更喜欢通过xpath使用find元素,但是如果该元素具有唯一性idclass在网页上,则可以按类名使用find元素,也可以按id使用find元素。

您似乎在正确的道路上可以自动执行任务。

2020-06-26