当前位置: 首页 > 面试题库 >

使用VBA和Selenium来驱动网站

蒋寒
2023-03-14
问题内容

我必须登录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需要使用哪些html" target="_blank">函数在代码中进行搜索?

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

一些注意事项:

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

问题答案:

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

您可以尝试以下方法:

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

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

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

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

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



 类似资料:
  • 我正在抓取这个网页的用户名,在滚动后加载用户 指向页面的Url:“http://www.quora.com/Kevin-Rose/followers" 我知道页面上的用户数(本例中的用户数为43812),如何滚动页面直到加载所有用户?我在互联网上搜索过同样的代码,在任何地方我都能找到几乎相同的代码行: driver.execute_script("window.scroll至(0)") 如何确定垂

  • 问题内容: 我正在浏览Selenium WebDriver的文档,例如它可以驱动Chrome。我当时在想,“驱动” PhantomJS效率会更高吗? 有没有办法将Selenium与PhantomJS一起使用? 我的预期用途是进行网页抓取:我抓取的网站上加载了AJAX和许多可爱的JavaScript,并且我认为此设置可以很好地替代我目前使用的Scrapy Python框架。 问题答案: Phanto

  • 问题内容: 我一直在使用Chromedriver测试Selenium,但我注意到,即使根本没有自动化功能,某些页面也可以检测到你正在使用Selenium。即使当我只是通过Selenium和Xephyr使用chrome手动浏览时,我也经常得到一个页面,指出检测到可疑活动。我已经检查了用户代理和浏览器指纹,它们与普通的chrome浏览器完全相同。 当我以普通的chrome浏览到这些站点时,一切正常,但

  • 我需要在一个网页上滚动(例如twitter),并制作一个网站上出现的新元素的网络抓取。我试着用,和来做这个。这是我的密码 问题是我无法滚动到底部。和是相同的。但是如果我将从更改为,同样的代码可以正常工作。为什么?

  • 我正在使用Selenium WebDriver和Java实现网站的自动化,但我陷入了这样一种情况:点击一个按钮,就会打开一个新的网页对话框,在该网页对话框中,我会执行输入值/从下拉列表中选择等操作。 问题是我无法切换到该网页对话框,甚至F12窗口不能在该网页对话框上工作。这个网站只在IE上工作。请帮帮我。 屏幕截图:在此处输入图像描述

  • 我无法从以下网页中读取电子邮件id: 网址:https://targetstudy.com/university/2/acharya-ng-ranga-agricultural-university/ 这是我的代码