【问题标题】:Driving a website using VBA and Selenium使用 VBA 和 Selenium 驱动网站
【发布时间】:2017-05-05 23:55:07
【问题描述】:

我必须登录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)

但这只会给我屏幕顶部的面包屑,我不确定如何从那里找到有用的地方。

显然,我对网页设计的了解还不够,无法知道我应该寻找什么,但我认为我可以通过尝试和错误的方式完成它,而不是这样沮丧。

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

此外,填写用户名和密码字段,单击“登录”,然后单击下一页上的相应链接等。最好的方法是什么?我认为一旦我自己登录后,我应该能够为我需要的每个文件获取一组链接并直接下载每个链接,但我不能 100% 确定我是否可以做或不做。

一些注意事项:

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

【问题讨论】:

    标签: html css vba selenium


    【解决方案1】:

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

    你可以试试这个:

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

    一些关于网页设计的知识可以在处理 selenium 以实现自动化时大有帮助,但只需一些基本知识,您就可以轻松完成工作。

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

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

    您似乎走在了自动化任务的正确轨道上。

    【讨论】:

    • 谢谢!那成功了。您知道它在“iframe”中,因为这里有“page-template-load_iframe”部分:&lt;body id="main-site" class="page-template page-template-page-templates page-template-load_iframe page-template-page-templatesload_iframe-php page page-id-11537 single-author singular cookiebanner"&gt;? 我有很多要学!!
    • 您必须使用浏览器中的开发工具才能弄清楚。我的方法是转到控制台(参见:imgur.com/a/5lBEN),参见顶部 img,它列出了页面上的所有 iframe。然后,如果我选择一个 iframe 并查看它,通常它会告诉我我的元素是否在其中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多