VBA - 处理Javascript弹出IE自动化 [英] VBA - Handle Javascript pop up with IE automation

查看:123
本文介绍了VBA - 处理Javascript弹出IE自动化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经自动化了Internet Explorer,以便在整个网络表单中填写大量信息。当我的VBA脚本点击传输htmlelement它运行Javascript打开一个新的msgbox,我需要点击确定或取消。我想让我的脚本点击ok这个。这将停止代码,直到javascript创建的弹出窗口进行任何进一步操作,因此Sendkeys将无法正常工作。以下元素来自我正在尝试与之互动的网页的HTML:

 < input type =image 
class =kantele-small-iconsrc =../../_ layouts /图像/ Empty.gif
alt =传输
onclick =return confirmOnTransfer(); WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions(& quot; ctl00 $ PlaceHolderMain $ TestControl1
$ CertificateSearchControl $ cmdTransfer& quot;& quot;& quot; true,
& quot; Transfer& quot;& quot;& quot; false,false))
风格= BORDER-宽度:0像素; />

我使用以下命令调用传输按钮:

 设置HTMLDoc = ie.document 
HTMLDoc.all.Item(ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_cmdTransfer)。点击

任何人都可以帮助我找到解决这个问题的解决方案?



另一篇文章中已经回答了一个类似的问题,但我似乎无法让我的脚本中的解决方案工作。





所有帮助将被格外好评。



更新08032015:

  function confirmOnTransfer(){

if(typeof(Page_ClientValidate)==function&&& Page_ClientValidate()){

var volume = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_txtCertificateCou NT)value.trim();
var oDDL = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_ddlTransferDomain');
var oDDL2 = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_ddlTransferActor');
var oDDL3 = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_ddlTransferAccount');
var checkbox = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_chkAcc');
var selectedVolume = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_hdnFinalVolume')。value.trim();

//问题3982:1496 - 错误:协议日期在交易日期之后
var contractDateDefaultValue = 0;
if(document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_txtContractDate')!= null){

var currentDate = new Date();
var currmonth;
var currDate;

//在java脚本中,数组保存到数组中的数组开始为零,所以如果getmonth()表示我们可以检索当前月份,那么我们应该添加+1
var currmonth = currentDate .getMonth()+ 1;
//在我们的申请中,日期应为2013-06-20,所以这里的月份或者日期长度小于两个意味着我们应该在日期或月之前添加'0'
if( currmonth.toString()。length< 2)
currmonth ='0'+ currmonth;

var currDate = currentDate.getDate();
if(currentDate.getDate()。toString()。length< 2)
currDate ='0'+ currDate;

var currentDateText = currentDate.getFullYear()+' - '+ currmonth +' - '+ currDate;

var currentDateArr = currentDateText.toString()。split(' - ');

var ContactDateArr = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_txtContractDate')。value.toString()。split(' - ');

if(ContactDateArr [0]> currentDateArr [0]
||(ContactDateArr [0] == currentDateArr [0]&& currentDateArr [1] == ContactDateArr [1 ]&&< currentDateArr [2]< ContactDateArr [2])
||(ContactDateArr [0] == currentDateArr [0]& amp;& currentDateArr [1]< ContactDateArr [1])){
alert(document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_hdnContractDateValidation')。value)
//如果收到的警报意味着我们应该根据这个值分配这个值,我们控制下一个条件来确认转移警报
contractDateDefaultValue = 1;
返回false;
}

更新01042015(不是aprils傻瓜笑话)

 < td height =28px>< input name =ctl00 $ PlaceHolderMain $ TestControl1 $ CertificateSearchControl $ CertificateBundleReport $ ctl05 $ ctl03 $ ctl00type =textmaxlength =255size =10id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl03_ctl00disabled =disabledtitle =Find Textstyle =font-family:Verdana; font-size:8pt; />< / td>< td width =4px>< / td>< td height =28px>< a id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl03_ctl01title =Findhref = style =font-family:Verdana; font-size:8pt; color:Gray; text-decoration:none; white-space:nowrap;> Find< / a>< / td>< td width = 4px>< / td>< td height =28px>< span style =font-family:Verdana; font-size:8pt;> |< / span>< / td>< td width =4px>< / td>< td height =28px>< a id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl03_ctl03title =Find Nexthref =#style =font - 家庭:宋体;字体大小:8磅;颜色:灰色;文字修饰:无;空白:NOWRAP;>接着< / A>< / TD> 
< / tr>
< / table>
< / div>< table cellpadding =0cellspacing =0ToolbarSpacer =truestyle =display:inline-block; width:20px;>
< tr>
< td>< / td>
< / tr>
< / table>< div class =style =display:inline-block; font-family:Verdana; font-size:8pt; vertical-align:top;>
< table cellpadding =0cellspacing =0style =display:inline;>
< tr>
< td height =28px>< div id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00style =font-family:Verdana; font-size:8pt; border:1px transparent Solid;>
< table id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_Buttontitle =Exportborder =0>
< tr>
< td>< a id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_ButtonLinktitle =Exportalt =Exporthref =javascript:void(0)style =text-decoration:none;>< img id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_ButtonImgsrc =/ Reserved.ReportViewerWebControl.axd?OpType =资源与版本= 11.0.3010.3& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;风格=边框样式:无;高度:16px的;宽度:16px的;边界宽度:0像素; />< span style =width:5px; text-decoration:none;> < / span>< img id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_ButtonImgDownsrc =/ Reserved.ReportViewerWebControl.axd?OpType =资源与版本= 11.0.3010.3& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; gifalt =Exportstyle =border-style:None; height:6px; width:7px; border-width:0px; margin-bottom:5px; />< / A>< / TD>
< / tr>
< / table>
< / div>< div id =ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_Menustyle =background-color:#ECE9D8; border:1px#336699 Solid; display:none; position:absolute; padding:1px; z-index: 1;>
< div style =border:1px transparent Solid;>
< a title =Excelalt =Excelonclick =$ find('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport')。exportReport('EXCELOPENXML'); href =javascript:void(0)style =color:#3366CC; font-family:Verdana; font-size:8pt; padding:3px 8px 3px 8px; display:block; white-space:nowrap; text-decoration :无;> Excel的< / A>
< / div>< div style =border:1px transparent Solid;>
< a title =PDFalt =PDFonclick =$ find('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport')。exportReport('PDF'); href =javascript:void(0)style =color:#3366CC; font-family:Verdana; font-size:8pt; padding:3px 8px 3px 8px; display:block; white-space:nowrap; text-decoration :无;> PDF< / A>
< / div>< div style =border:1px transparent Solid;>
< a title =Wordalt =Wordonclick =$ find('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport')。exportReport('WORDOPENXML'); href =javascript:void(0)style =color:#3366CC; font-family:Verdana; font-size:8pt; padding:3px 8px 3px 8px; display:block; white-space:nowrap; text-decoration :无;> Word和LT; / A>
< / div>
< / div>< / td>
< / tr>
< / table>

我与ID 交互ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_Button要让菜单下拉,但选择导出到PDF或导出到Excel对我有一点挑战。

解决方案

你可以尝试这样的事情:

  Dim el,f 

设置HTMLDoc = ie.document
设置el = HTMLDoc.getElementById(ctl00_PlaceHolderMain_TestControl1_& _
CertificateSearchControl_cmdTransfer)

f = el.onclick

f =替换(f,return confirmOnTransfer();,)

el.onclick = f

el.click

第2部分(4/1/2015):

  Dim el2 
'获取包含菜单选项的
设置el2 = HTMLDoc.getElementById(_
ctl00_PlaceHolderMain_TestControl1_Certificate& _
SearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_Menu)

'单击该div
el2中包含的链接之一。 getElementsByTagName(a)(1)


I have automated my Internet Explorer to fill out a lot of information throughout the webform. When my VBA script clicks the transfer htmlelement it runs the Javascript which opens a new msgbox where I need to click "ok" or "Cancel". I want my script to click "ok" to this. This stops code untill any further action is made to the popup window created by the javascript, hence Sendkeys will not work. The below element is from the HTML of the webpage which i am trying to interact with:

<input type="image" name="ctl00$PlaceHolderMain$TestControl$
                  CertificateSearchControl$cmdTransfer"
id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_cmdTransfer"
class="kantele-small-icon" src="../../_layouts/Images/Empty.gif" 
alt="Transfer" 
onclick="return confirmOnTransfer();WebForm_DoPostBackWithOptions(new   
 WebForm_PostBackOptions(&quot;ctl00$PlaceHolderMain$TestControl1
 $CertificateSearchControl$cmdTransfer&quot;, &quot;&quot;, true,   
  &quot;Transfer&quot;, &quot;&quot;, false, false))" 
  style="border-width:0px;" />

I use the following command to call the Transfer button:

Set HTMLDoc = ie.document
  HTMLDoc.all.Item("ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_cmdTransfer").Click

Can anyone help me find a solution to this issue?

A similar question has been answered in another post, but I cant seem to get the solution to work in my script.

Handle Pop-Up While Navigating with IE

All help will be greately appriciated.

Update 08032015:

function confirmOnTransfer() {        

if (typeof (Page_ClientValidate) == "function" && Page_ClientValidate()) {

  var volume = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_txtCertificateCount').value.trim();
  var oDDL = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_ddlTransferDomain');
  var oDDL2 = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_ddlTransferActor');
  var oDDL3 = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_ddlTransferAccount');
  var checkbox = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_chkAcc');
  var selectedVolume = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_hdnFinalVolume').value.trim();

//Issue 3982: 1496 - Error: Agreement date is after transaction date
  var contractDateDefaultValue = 0;
       if (document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_txtContractDate') != null) {

       var currentDate = new Date();
       var currmonth;
       var currDate;

// in java script the month is saved to array in array starts to zero so the if getmonth() means we canot retrieve current month so we should add +1
                    var currmonth = currentDate.getMonth() + 1;
                    //In our application the date should be "2013-06-20" so here the month or date length is less than two means we should add '0' to bfore the date or month
                    if (currmonth.toString().length < 2)
                        currmonth = '0' + currmonth;

                    var currDate = currentDate.getDate();
                    if (currentDate.getDate().toString().length < 2)
                        currDate = '0' + currDate;

                    var currentDateText = currentDate.getFullYear() + '-' + currmonth + '-' + currDate;

                    var currentDateArr = currentDateText.toString().split('-');

                    var ContactDateArr = document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_txtContractDate').value.toString().split('-');

                    if (ContactDateArr[0] > currentDateArr[0]
                    || (ContactDateArr[0] == currentDateArr[0] && currentDateArr[1] == ContactDateArr[1] && currentDateArr[2] < ContactDateArr[2])
                    || (ContactDateArr[0] == currentDateArr[0] && currentDateArr[1] < ContactDateArr[1])) {
                        alert(document.getElementById('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_hdnContractDateValidation').value)
//if the alert received means we should assign this value based on this value we control to next condition to confirmation of transfer alert
                        contractDateDefaultValue = 1;
                        return false;
                    }

Update 01042015 (NOT an aprils fools joke)

                        <td height="28px"><input name="ctl00$PlaceHolderMain$TestControl1$CertificateSearchControl$CertificateBundleReport$ctl05$ctl03$ctl00" type="text" maxlength="255" size="10" id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl03_ctl00" disabled="disabled" title="Find Text" style="font-family:Verdana;font-size:8pt;" /></td><td width="4px"></td><td height="28px"><a id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl03_ctl01" title="Find" href="#" style="font-family:Verdana;font-size:8pt;color:Gray;text-decoration:none;white-space:nowrap;">Find</a></td><td width="4px"></td><td height="28px"><span style="font-family:Verdana;font-size:8pt;">|</span></td><td width="4px"></td><td height="28px"><a id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl03_ctl03" title="Find Next" href="#" style="font-family:Verdana;font-size:8pt;color:Gray;text-decoration:none;white-space:nowrap;">Next</a></td>
                                </tr>
                            </table>
                        </div><table cellpadding="0" cellspacing="0" ToolbarSpacer="true" style="display:inline-block;width:20px;">
                            <tr>
                                <td></td>
                            </tr>
                        </table><div class=" " style="display:inline-block;font-family:Verdana;font-size:8pt;vertical-align:top;">
                            <table cellpadding="0" cellspacing="0" style="display:inline;">
                                <tr>
                                    <td height="28px"><div id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00" style="font-family:Verdana;font-size:8pt;border:1px transparent Solid;">
                                        <table id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_Button" title="Export" border="0">
                                            <tr>
                                                <td><a id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_ButtonLink" title="Export" alt="Export" href="javascript:void(0)" style="text-decoration:none;"><img id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_ButtonImg" src="/Reserved.ReportViewerWebControl.axd?OpType=Resource&amp;Version=11.0.3010.3&amp;Name=Microsoft.Reporting.WebForms.Icons.ExportDisabled.gif" alt="Export" style="border-style:None;height:16px;width:16px;border-width:0px;" /><span style="width:5px;text-decoration:none;"> </span><img id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_ButtonImgDown" src="/Reserved.ReportViewerWebControl.axd?OpType=Resource&amp;Version=11.0.3010.3&amp;Name=Microsoft.Reporting.WebForms.Icons.ArrowDownDisabled.gif" alt="Export" style="border-style:None;height:6px;width:7px;border-width:0px;margin-bottom:5px;" /></a></td>
                                            </tr>
                                        </table>
                                    </div><div id="ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_Menu" style="background-color:#ECE9D8;border:1px #336699 Solid;display:none;position:absolute;padding:1px;z-index:1;">
                                        <div style="border:1px transparent Solid;">
                                            <a title="Excel" alt="Excel" onclick="$find('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport').exportReport('EXCELOPENXML');" href="javascript:void(0)" style="color:#3366CC;font-family:Verdana;font-size:8pt;padding:3px 8px 3px 8px;display:block;white-space:nowrap;text-decoration:none;">Excel</a>
                                        </div><div style="border:1px transparent Solid;">
                                            <a title="PDF" alt="PDF" onclick="$find('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport').exportReport('PDF');" href="javascript:void(0)" style="color:#3366CC;font-family:Verdana;font-size:8pt;padding:3px 8px 3px 8px;display:block;white-space:nowrap;text-decoration:none;">PDF</a>
                                        </div><div style="border:1px transparent Solid;">
                                            <a title="Word" alt="Word" onclick="$find('ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport').exportReport('WORDOPENXML');" href="javascript:void(0)" style="color:#3366CC;font-family:Verdana;font-size:8pt;padding:3px 8px 3px 8px;display:block;white-space:nowrap;text-decoration:none;">Word</a>
                                        </div>
                                    </div></td>
                                </tr>
                            </table>

I interact with the ID "ctl00_PlaceHolderMain_TestControl1_CertificateSearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_Button" to get the menu to drop down, but selecting either "Export to PDF" or "Export to Excel" are challenging me a bit. Any suggestion to solves this would be greately appreciated.

解决方案

You can try something like this:

  Dim el, f

  Set HTMLDoc = ie.document
  Set el =HTMLDoc.getElementById("ctl00_PlaceHolderMain_TestControl1_" & _ 
                                 "CertificateSearchControl_cmdTransfer")

  f = el.onclick

  f = Replace(f, "return confirmOnTransfer();", "")

  el.onclick = f

  el.click

Part 2 (4/1/2015):

  Dim el2
  'get the div containing the menu options
  Set el2 = HTMLDoc.getElementById( _
                "ctl00_PlaceHolderMain_TestControl1_Certificate" & _
               "SearchControl_CertificateBundleReport_ctl05_ctl04_ctl00_Menu")

  'click one of the contained links in that div
  el2.getElementsByTagName("a")(1)

这篇关于VBA - 处理Javascript弹出IE自动化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆