【问题标题】:Driving a website using VBA and Selenium, pt2使用 VBA 和 Selenium 驱动网站,pt2
【发布时间】:2017-05-09 14:50:29
【问题描述】:

this question 中,我在推进我的 VBA/Selenium 项目方面获得了一些急需的帮助(如果需要,它还为这个问题提供了一些额外的背景知识),但是我极度缺乏 HTML 知识正在再次抬头.

我已经成功登录,我可以导航到下载链接所在的页面,并且我已经确定了下载链接的位置,但我无法以编程方式单击下载链接。

这是链接本身:

<a id="download_link" class="downloadIcon" href="siam/downloadresponses.asp?sid=<ABunchOfHexDigits>&amp;s=1">Download CSV Data</a> 

这是指向该行的页面中的 HTML:

<frameset rows="43,30,*" framespacing="0" frameborder="0" border="0">
  <frame title="Top banner" src="topbannerframe.asp?sid=<ABunchOfHexDigits>&amp;bc=2&amp;im=0&amp;nm=1" id="banner" name="banner" scrolling="no" noresize="">
  <frame title="Survey title" src="titlebannerframe.asp?sid=<ABunchOfHexDigits>" id="title" name="title" scrolling="no" noresize="">
  <frameset rows="*" cols="35%,*" frameborder="1" framespacing="10" border="10" bordercolor="#53a9db">
    <frame src="oasysframesleft.asp?sid=<ABunchOfHexDigits>&amp;t=summ" scrolling="no" id="leftframe" name="leftframe">
      #document
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Untitled Document</title>
      </head>
      <frameset rows="22,*" framespacing="0" frameborder="0" border="0">
      <frame src="left_tab.asp?sid=<ABunchOfHexDigits>&amp;t=summ" scrolling="no" noresize="">
      <frame src="summary.asp?sid=<ABunchOfHexDigits>" id="contentframe" name="contentframe" scrolling="yes" noresize="">
      #document
      <html mxmlns="http://www.w3.org/19999/xhtml">
      <body class="whitebg" onload="checkview();">
      <div id="allitems">
        <div class="errortext"></div>
        <table class="bars" cellspacing="0" cellpadding="0">
          <tbody><tr class="alt">
            <th class="alt">Title:</th>
            <td class="alt">Title text</td>
          </tr>
        <tr>
          <th>Start date:</th>
          <td>Tue Jan 10 2017 10:26 EST</td>
        </tr>
        <tr class="alt">
          <th class="alt">Status:</th>
          <td class="alt">Questionnaire live</td>
        </tr>
        <tr>
          <th>Uploaded respondents:</th>
          <td>0</td>
        </tr>
        <tr class="alt">
          <th>Cases:</th>
          <td>139<a id="download_link" class="downloadIcon" href="siam/downloadresponses.asp?sid=<ABunchOfHexDigits>&amp;s=1">Download CSV Data</a></td>
        </tr>
        <tr>...</tr>
        <tr>...</tr>
      </tbody></table>
    </div>
  </body></noframes>
</frameset>
<frame src="oasysframesright.asp?sid=<ABunchOfHexDigits>&amp;t=results" scrolling="no" id="rightframe" name="rightframe">
</frameset>
<noframes><body></body></noframes>
</frameset>

在我看来,下载链接位于几层框架内,但不是 iframe,就像我之前的问题一样。我尝试使用

Driver.SwitchToFrame(0)
Driver.SwitchToFrame(2)
Driver.SwitchToFrame(1)

根据这张图片:

它将切换到(0),但随后的调用失败并出现“没有该名称的帧”(释义)错误。我试过Driver.SwitchToFrame(5)直接去contentframe,它也不喜欢那个。

我试过了

Text = "html > frameset > frameset > frame#leftframe > html > frameset > frame#contentframe > html > body.whitebg > div#allitems > table.bars > tbody > tr.alt > td > a#download_link.downloadicon"
Set El = Driver.FindElementByCss(Text)

我在这里从 Chrome 的开发工具获得 CSS 路径:

但这也没用。

我可以使用 Selenium IEDriver 加载页面,一旦我这样做了,从打开的 IE11 窗口中选择 View Source 会产生以下结果:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Variables</title>
<link href="css/unified-stylesheet-min.css?x=21" rel="stylesheet" type="text/css" media="all" />
<script language="JavaScript1.2" src="draganddrop3-min.js?x=35" type="text/javascript"></script>
<script language="JavaScript" type="text/javascript">
//<![CDATA[
document.onmousedown=selectmouse;
function checkview(){
  var content_iframe = parent.document.getElementById('content_iframe');
  if(content_iframe)
    content_iframe.height=document.getElementById('allitems').offsetHeight+300;

}
//]]>
</script>
</head>
<body class="whitebg" onload="checkview();">
  <div id="allitems">
    <div class="errortext"></div>
    <table class="bars" cellspacing="0" cellpadding="0">
      <tr class="alt">
        <th class="alt">Title:</th>
        <td class="alt">Title text</td>
      </tr>
      <tr>
        <th>Start date:</th>
        <td>Tue Jan 10 2017 10:26 EST</td>
      </tr>
      <tr class="alt">
        <th class="alt">Status:</th>
        <td class="alt">Questionnaire live</td>
      </tr>
      <tr>
        <th>Uploaded respondents:</th>
        <td>0</td>
      </tr>
      <tr class="alt">
        <th>Cases:</th>
        <td>139<a id="download_link" class="downloadIcon" href="siam/downloadresponses.asp?sid=<ABunchOfHexDigits>&amp;s=1">Download CSV Data</a></td>
      </tr>
      <tr>
        <th class="alt">Partials:</th>
        <td class="alt">0</td>
      </tr>
      <tr class="alt"><th>URL:</th><td>https://www.snapsurveys.com/wh/s.asp?k=<numeric code></td></tr>
    </table>
  </div>
</body>
</html>

这看起来与 Chrome 或 FF 向我展示的完全不同。

这些是我尝试过的各种方法(一旦我加载了下载链接页面):

'declarations made & "Driver" set earlier in the code
Dim Driver As IEDriver
Set Driver = New IEDriver
Dim El As WebElement

'click on the "Download" link
'    Set El = Driver.FindElementByName("contentframe")
'    Driver.SwitchToFrame ("contentframe")
    Driver.SwitchToFrame (0)
'    Driver.SwitchToFrame (1)
'    Driver.SwitchToFrame (1)

'    Text = "Download CSV Data"
'    Text = "//*[@id=""download_link""]"  'result of "copy XPath"
'    Set El = Driver.FindElementByLinkText(Text)
'    Set El = Driver.FindElementByXPath(Text)
'    Text = "html > frameset > frameset > frame#leftframe > html > frameset > frame#contentframe > html > body.whitebg > div#allitems > table.bars > tbody > tr.alt > td > a#download_link.downloadicon"
    Text = "#download_link"
'    <a id="download_link" class="downloadIcon" href="siam/downloadresponses.asp?sid=<ABunchOfHexDigits>&amp;s=1">Download CSV Data</a>
    Set El = Driver.FindElementByCss(Text)
'    Set El = Driver.FindElementByClass("whitebg")
    El.Click

请有人指出正确的方向,以便能够从此页面中选择“下载 CSV 数据”链接。 (注意:我无法提供指向该页面的直接链接 - 这是一个安全页面,上面包含受 HIPAA 保护的数据。)

【问题讨论】:

  • 你试过"Set El = Driver.FindElementById("download_link")" 吗?
  • 我确定我有,所以我刚才试了一下。不幸的是,同样的“未找到元素...”错误。我也刚刚尝试了Driver.FindElementByClass("downloadIcon"),结果相同。 :( 感谢您的意见!

标签: vba excel selenium


【解决方案1】:

感谢三年前的this comment,我终于弄明白了!

在计算(从 0 开始的)帧时,帧包含在计数中,所以我的号码在我的Display.SwitchToFrames() 调用中是关闭的。

根据我最初对控制台中框架的看法:
我正在使用此代码:

Driver.SwitchToFrame(0)
Driver.SwitchToFrame(2)
Driver.SwitchToFrame(1)

基于计算框架集的新知识,我叙述了:
并想出了这段代码:

Driver.SwitchToFrame (2)
Driver.SwitchToFrame (1)

从那里,

Text = "download_link"
Set El = Driver.FindElementById(Text)
El.Click

工作愉快!

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多