使用VBA和Selenium推动网站

时间:2017-05-05 15:16:26

标签: html css vba selenium

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

在Chrome和&amp ;;中使用开发工具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)

但这只会给我屏幕顶部的面包屑,我不确定如何从那里获得任何有用的东西。

显然,我对网页设计的理解还不足以找到我应该寻找的任何线索,但我认为我可以通过它来试验和错误,而不是一点点挫折。

我需要在页面源中查找哪些元素,以及我需要使用哪个FindElementBy函数在代码中搜索它?

此外,填写UserName&amp;密码字段,单击“登录”,然后单击下一页上的相应链接等,这是最好的方法吗?我认为一旦我登录,我应该能够获得我需要的每个文件的链接集合并直接下载每个链接,但我不能100%肯定我是否可以这样做与否。

一些注意事项:

  • 是的,我意识到代码使用IE作为浏览器。 FF和我的驱动程序Chrome似乎已过时(浏览器打开,但不会加载网页),我还没有更新的。目前,只要我开始工作,我就不在乎使用什么浏览器。
  • 是的,我意识到我在Sub结束时关闭了浏览器。再一次,我只是在测试,试图在黑暗中找到自己的方式。

1 个答案:

答案 0 :(得分:1)

登录功能位于iframe内。你必须将selenium的焦点切换到那个iframe,然后再试一次,它应该可以工作。

你可以试试这个:

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

有关网页设计的一些知识在处理硒自动化方面可以帮助很长时间,但只需一些基本知识,您就可以轻松完成工作。

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

我通常更喜欢使用xpath的find元素,但如果元素在网页上有唯一的idclass,则可以按类名使用find元素或按ID查找元素。

您似乎正在走上正确的道路,以实现自动化任务。