html - 通过 VBA 使用 QuerySelector 单击 HTML 元素
问题描述
我正在尝试使用 VBA 自动访问网页。我正在通过登录屏幕,但我无法单击其中一个元素进入搜索屏幕。通常这并不太难,但似乎这个元素在 iframe 中?我不确定这是否是我看不到它的原因。我试图循环所有 A 标签并获得 nop 返回。我尝试使用查询选择器来访问它,我过去曾展示过它并工作过。两者都无济于事。我尝试了 4 种不同的方法来获取标签,想法是在匹配某些属性并单击之后执行 ForEach 循环:
Set HTMLAs = HTMLDoc.getElementsByTagName("a")
Set HTMLAs = HTMLDoc.getElementsByTagName("tr")
Set HTMLAs = HTMLDoc.getElementsByTagName("td")
Set HTMLAs = HTMLDoc.getElementsByTagName("div")
我试过了:
HTMLDoc.querySelector("a[title='Policy']").Click
'HTMLDoc.querySelector("a[href='/PolicySearch/policySearch_v30.cfm?module=policy&actionType=lookup']").Click 'no
'HTMLDoc.querySelector("a[href='/PolicySearch/policySearch_v30.cfm?module=policy&actionType=lookup']").Click 'no
'HTMLDoc.querySelector("A[href='/PolicySearch/policySearch_v30.cfm?module=policy&actionType=lookup']").Click 'NO
'HTMLDoc.querySelector("A[title='Policy']").Click 'no
这些都没有抓住元素。
这是我要单击的元素的 html:
<A title=Policy style="FONT-SIZE: 8pt; FONT-FAMILY: arial"
href="/PolicySearch/policySearch_v30.cfm?
module=policy&actionType=lookup" target=main nowrap> Lookup Policy
</A>
当我第一次进入我想要的页面时,这是框架的顶部:
<FRAMESET id=defaultFrame frameSpacing=0 border=0 frameBorder=no
rows=70,21,*,21,1><FRAME noResize src="/systemInfo/ScriptX/titleBar.cfm"
frameBorder=0 name=titleBar scrolling=no application="yes"><FRAME noResize
src="/producerTOC.cfm" frameBorder=0 name=producerTOC scrolling=no
application="yes"><FRAMESET id=BottomRow cols=1,*><FRAME noResize
src="toc.cfm" frameBorder=0 name=toc marginWidth=0 scrolling=no
application="yes"><FRAME noResize src="main.cfm" frameBorder=0 name=main
application="yes"></FRAMESET><FRAME noResize
src="/systemInfo/ScriptX/footerFrame.cfm" frameBorder=0 name=footerFrame
scrolling=no application="yes"><FRAME noResize src="" frameBorder=0
name=utilityFrame scrolling=no application="yes"><NOFRAMES></NOFRAMES>
但从这里我不知道如何进行。非常感谢任何建议或方向。
从 iframe 到查找策略的 html 屏幕截图。 截屏
单击“查找策略”后的搜索表单
<FORM id=SearchForm onsubmit="return _CF_checkSearchForm(this)" method=get
name=SearchForm action=/PolicySearch/policyAdvLookup_v30.cfm
target=searchResultFrame><TABLE class=TableSelection>
<TBODY>
<TR>
<TD class=HeaderCell>Policy Search</TD></TR>
<TR>
<TD class=SelectionCell>
<TABLE class=NoBorder>
<TBODY>
<TR>
<TD class=Right style="WIDTH: 2%" noWrap> </TD>
<TD class="Right Bold" style="WIDTH: 20%" noWrap>Search Criteria</TD>
<TD noWrap><A onclick="ToggleMode();return false;" id=ToggleModeLink
class=FloatR href="">- Advanced Search -</A> <INPUT onfocus=this.select();
id=searchField class=upperCase size=30 name=searchField class="upperCase"
jQuery112406813183503798275="4"><BUTTON id=SearchButton style="WIDTH: 130px"
type=submit name=SearchButton>Search</BUTTON></TD></TR>
<TR>
<TD id=SearchLabel class="Right Bold" colSpan=2 noWrap>Search By</TD>
<TD noWrap><INPUT onclick=LoadParam(1); id=searchOption title="Policy # /
Name" class=Blend CHECKED type=radio value=name name=searchOption>Policy # /
Name <INPUT onclick=LoadParam(2); id=searchOption title="Insured
Address" class=Blend type=radio value=address name=searchOption>Insured
Address <INPUT onclick=LoadParam(3); id=searchOption title="Dwelling
Location" class=Blend type=radio value=location name=searchOption>Dwelling
Address
<DIV id=LineSearchOptions><SPAN id=LineSearchOptions_1
name="LineSearchOptions_1"><INPUT onclick=LoadParam(6,true); id=searchOption
title="Driver Name / Lic Num" class=Blend type=radio value=name
name=searchOption>Driver Name / Lic Num <INPUT
onclick=LoadParam(6,false); id=searchOption title="Vehicle VIN" class=Blend
type=radio value=VIN name=searchOption>Vehicle VIN </SPAN></DIV></TD>
</TR>
<TR id=PolicyTypeRow name="PolicyTypeRow">
<TD class="Right Bold" colSpan=2 noWrap>Policy Type</TD>
<TD noWrap><SELECT onchange=ShowLineOptions(this.value); id=policyType
name=policyType> <OPTION selected value=0>All Policy Types</OPTION> <OPTION
value=4>Homeowner Policies</OPTION> <OPTION value=3>Dwelling Fire
Policies</OPTION> <OPTION value=1>Personal Auto Policies</OPTION></SELECT>
</TD></TR>
<TR id=SearchCriteriaDisplay name="SearchCriteriaDisplay">
<TD class=Right noWrap><A onclick="ClearParam(1);return false;" id=aClear
href="" name=aClear>[ X ]</A></TD>
<TD id=strSearchParamLbl class="Right Bold" noWrap
name="strSearchParamLbl">Policy # / Name</TD>
<TD noWrap><SPAN id=strSearchParamDisplay name="strSearchParamDisplay">
</SPAN><INPUT id=strSearchParam type=hidden name=strSearchParam></TD></TR>
<TR id=SearchCriteriaDisplay name="SearchCriteriaDisplay">
<TD class=Right noWrap><A onclick="ClearParam(2);return false;" id=aClear
href="" name=aClear>[ X ]</A></TD>
<TD id=strSearchParamLbl class="Right Bold" noWrap
name="strSearchParamLbl">Insured Address</TD>
<TD noWrap><SPAN id=strSearchParamDisplay name="strSearchParamDisplay">
</SPAN><INPUT id=strSearchParam type=hidden name=strSearchParam></TD></TR>
<TR id=SearchCriteriaDisplay name="SearchCriteriaDisplay">
<TD class=Right noWrap><A onclick="ClearParam(3);return false;" id=aClear
href="" name=aClear>[ X ]</A></TD>
<TD id=strSearchParamLbl class="Right Bold" noWrap
name="strSearchParamLbl">Dwelling Location</TD>
<TD noWrap><SPAN id=strSearchParamDisplay name="strSearchParamDisplay">
</SPAN><INPUT id=strSearchParam type=hidden name=strSearchParam></TD></TR>
<TR id=SearchCriteriaDisplay name="SearchCriteriaDisplay">
<TD class=Right noWrap><A onclick="ClearParam(4);return false;" id=aClear
href="" name=aClear>[ X ]</A></TD>
<TD id=strSearchParamLbl class="Right Bold" noWrap
name="strSearchParamLbl">Phone </TD>
<TD noWrap><SPAN id=strSearchParamDisplay name="strSearchParamDisplay">
</SPAN><INPUT id=strSearchParam type=hidden name=strSearchParam></TD></TR>
<TR id=TimeframeRow name="TimeframeRow">
<TD class="Right Bold" colSpan=2 noWrap>Recent Policies Only</TD>
<TD noWrap><INPUT id=historyTimeFrame CHECKED type=checkbox value=1200
name=historyTimeFrame> Exclude policies that expired prior to December
1918</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><INPUT
id=strSearchNameNum type=hidden name=strSearchNameNum> <INPUT
id=strSearchAddress type=hidden name=strSearchAddress> <INPUT
id=strSearchLocation type=hidden name=strSearchLocation> <INPUT
id=strSearchPhone type=hidden name=strSearchPhone> <INPUT
id=strSearchEmail type=hidden name=strSearchEmail> <INPUT id=strSearchLine
type=hidden name=strSearchLine> <INPUT id=strSearchLineType type=hidden
name=strSearchLineType> <INPUT id=displayType type=hidden value=0
name=displayType> <INPUT type=hidden value=0 name=isQuoteSearch> <INPUT
type=hidden value=policy name=module> <INPUT type=hidden value=lookup
name=actionType> </FORM>
当我单击包含几个搜索/导航选项的网页时:
<FRAMESET id=defaultFrame frameSpacing=0 border=0 frameBorder=no
rows=70,21,*,21,1><FRAME noResize src="/systemInfo/ScriptX/titleBar.cfm"
frameBorder=0 name=titleBar scrolling=no application="yes"><FRAME noResize
src="/producerTOC.cfm" frameBorder=0 name=producerTOC scrolling=no
application="yes"><FRAMESET id=BottomRow cols=1,*><FRAME noResize
src="toc.cfm" frameBorder=0 name=toc marginWidth=0 scrolling=no
application="yes"><FRAME noResize src="main.cfm" frameBorder=0 name=main
application="yes"></FRAMESET><FRAME noResize
src="/systemInfo/ScriptX/footerFrame.cfm" frameBorder=0 name=footerFrame
scrolling=no application="yes"><FRAME noResize src="" frameBorder=0
name=utilityFrame scrolling=no application="yes"><NOFRAMES></NOFRAMES>
</FRAMESET>
桌子:
<TABLE id=MainTabText style="BORDER-TOP: 0px; HEIGHT: 19px; BORDER-RIGHT:
0px; WIDTH: 100%; BORDER-BOTTOM: 0px; LEFT: 0px; MARGIN: 0px; BORDER-LEFT:
0px; TOP: 0px" cellSpacing=0 cellPadding=0 name="MainTabText"><TBODY>
<TR style="FONT-WEIGHT: bold">
<TD style="FONT-SIZE: 8pt; BORDER-TOP: 0px; FONT-FAMILY: arial; BORDER-
RIGHT: 0px; WIDTH: 1%; VERTICAL-ALIGN: middle; BORDER-BOTTOM: 0px; COLOR:
black; PADDING-BOTTOM: 0px; TEXT-ALIGN: left; PADDING-TOP: 0px; PADDING-
LEFT: 10px; BORDER-LEFT: 0px; LINE-HEIGHT: 8pt; PADDING-RIGHT: 0px" noWrap>|
<A title=Policy style="FONT-SIZE: 8pt; FONT-FAMILY: arial"
href="/PolicySearch/policySearch_v30.cfm?
module=policy&actionType=lookup" target=main nowrap> Lookup Policy
</A> |<A title=Reports style="FONT-SIZE: 8pt; FONT-FAMILY: arial"
href="/Reports/reports.cfm" target=main nowrap> Reports </A> |<A
title=Agencies style="FONT-SIZE: 8pt; FONT-FAMILY: arial"
href="ProducerInfo/producerInfoLayout.cfm?producerID=10003" target=main
nowrap> Agency Info </A> |<A title="Upload Documents"
style="FONT-SIZE: 8pt; FONT-FAMILY: arial"
href="/PolicySearch/policySearch_v30.cfm?
module=Upload&actionType=lookup" target=main nowrap> Upload
Documents </A> |<A title="Batch Viewer" style="FONT-SIZE: 8pt; FONT-
FAMILY: arial" href="/batch/batchViewer/batchViewerlayout.cfm" target=main
nowrap> Batch Viewer </A> |</TD>
<TD style="FONT-SIZE: 8pt; BORDER-TOP: 0px; FONT-FAMILY: arial; BORDER-
RIGHT: 0px; WIDTH: 99%; VERTICAL-ALIGN: middle; BORDER-BOTTOM: 0px; COLOR:
black; PADDING-BOTTOM: 0px; TEXT-ALIGN: right; PADDING-TOP: 0px; PADDING-
LEFT: 0px; BORDER-LEFT: 0px; LINE-HEIGHT: 8pt; PADDING-RIGHT: 10px"
noWrap> | <A style="FONT-SIZE: 8pt; FONT-FAMILY: arial"
href="/main.cfm" target=main nowrap> Home </A> | <A
onclick="LogoutCheck();blur();return false;" style="FONT-SIZE: 8pt; FONT-
FAMILY: arial" href="" nowrap> Logout </A> |</TD></TR></TBODY>
解决方案
选择器是正确的
a[title=Policy]
如果在其属性上使用框架/iframe,则可以访问其 contentDocument。例如,如果框架有一个 id
ie.document.getElementById(frameid").contentDocument.querySelector("a[title=Policy]").click
推荐阅读
- selenium - 陈旧的网页元素
- wordpress - 我如何在木材/树枝的一行中写多个“if”条件?
- scala - Scala中的SnakeYaml问题
- java - 如何在 LibGDX 中为动画设置过滤器?
- java - UDP 套接字:java.net.SocketException:套接字关闭
- python - 根据条件将df转换为嵌套字典
- javascript - 如何在 Firebase Modular SDK V9 中使用 setPersistence?
- asynchronous - 等到第一个钩子完成后再获取数据
- sql - oracle 子查询或联合
- python - Tkinter Python - 如何为列设置命令