使用VBA和Selenium,pt2驱动一个网站

在这个问题中,我收到了一些帮助,希望能够推动我的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> 

在我看来,下载链接位于几层框架内,而不是像我以前的问题那样。 我曾试图使用

 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开发工具的CSSpath:

在这里输入图像说明

但是那也行不通。

我可以使用Selenium IEDriver加载页面,一旦我这样做了,从打开的IE11窗口中selectView 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 

请有人指出我可以从这个页面select“下载CSV数据”链接正确的方向。 (注意:我无法提供页面的直接链接 – 它是一个安全页面,上面有HIPAA保护的数据。)

我终于明白了这一点,感谢3年前的这个评论 !

计数(基于0)的帧时,帧集合 包含在计数中,所以我的数字在Display.SwitchToFrames()调用中closures。

基于我原来在控制台中的框架: 在这里输入图像说明
我正在使用这个代码:

 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 

作品一种享受!