在this question我收到了一些非常需要的帮助,以推动我的VBA / Selenium项目(如果需要的话,它为这个问题提供了一些额外的背景),但我极度缺乏HTML知识正在养育它的丑陋又来了。
我设法让登录工作,我可以导航到下载链接所在的页面,我已经确定了下载链接的位置,但我无法以编程方式单击下载链接。
这是链接本身:
<a id="download_link" class="downloadIcon" href="siam/downloadresponses.asp?sid=<ABunchOfHexDigits>&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>&bc=2&im=0&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>&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>&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>&s=1">Download CSV Data</a></td>
</tr>
<tr>...</tr>
<tr>...</tr>
</tbody></table>
</div>
</body></noframes>
</frameset>
<frame src="oasysframesright.asp?sid=<ABunchOfHexDigits>&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>&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>&s=1">Download CSV Data</a>
Set El = Driver.FindElementByCss(Text)
' Set El = Driver.FindElementByClass("whitebg")
El.Click
有人请指出我正确的方向,以便能够从此页面选择“下载CSV数据”链接。 (注意:我无法提供到该页面的直接链接 - 它是一个受HIPAA保护的数据的安全页面。)
答案 0 :(得分:1)
感谢3年前的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
有效!