在 child window 提交表格

Submitting form on child window

我有一个 vba 脚本,可以自动在 ups.com 中导航。直到出现 child window 和不同的 url 之前,它都很好。其中 child window 是一个简单的表单,但是当脚本提交表单时,它只是刷新屏幕或显示站点不可用的错误。 url到childwindow是

https://wwwapps.ups.com/webClaims/address

而 window 上的相关 HTML

<script language="javascript" type="text/JavaScript">


 function updateReturn()
 {
  "use strict" ;
  opener.document.reportform.raddress.value = "true";
    opener.document.reportform.submit();
    top.close();
    }

 function updateDeliver()
 {
  "use strict" ;
    opener.document.reportform.daddress.value = "true";
    opener.document.reportform.submit();
    top.close();
 }

 function updateContact()
 {
  "use strict" ;
    opener.document.reportform.caddress.value = "true";
    opener.document.reportform.submit();
    top.close();
 }

 function updateOther()
 {
  "use strict" ;
    opener.document.reportform.oaddress.value = "true";
    opener.document.reportform.submit();
    top.close();
 }

 function submitRefresh()
 {
  "use strict" ;
    this.document.address.refresh.value = "true";
    document.address.submit();
 }

</script>


<div id="main">




<form name="address" action="/webClaims/address" method="post">
<input type="hidden" name="loc" value="en&#95;US">

<input type="hidden" name="addrtype" value="f">

<input type="hidden" name="refresh" value="">


<table border="0" cellpadding="0" cellspacing="0" width="566">
<tr>
 <td valign="top" width="422">

 
 <table border="0" cellpadding="0" cellspacing="0" width="100%">
 <tr>
  <td class="pi-mA1-t" valign="top">

  
  <table border="0" cellpadding="0" cellspacing="0" width="422">
  <tr>
   <td class="pi-m-txt-title">
        
          Edit Shipped From Address
        
        
        
        
        

      </td>
  </tr>
  </table>
  

  </td>
 </tr>
 <tr>
  <td class="pi-mA1-c-t-spc"><img alt="" border="0" height="1" src="/img/1.gif" width="1"></td>
 </tr>
 <tr>
  <td class="pi-mA1-c" valign="top">

    
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
     <td>
          <div class="pi-m-pad">
            
            Please edit the address below. Required fields are shown in <span class="pi-h4">bold</span>.<br>
            <br>



            
              <span class="pi-h4">Company Name:</span>
            
            
            <br>
            
              <input class="modTxtMedium" name="companyName" maxlength="50" size="19" type="text" value="">
            
            
            <br><br>
    

            
              <span class="pi-h4">Name:</span>
            
            
            <br>
            
              <input class="modTxtMedium" name="name" maxlength="50" size="19" type="text" value="">
            
            
            <br><br />

    
              <span class="pi-h4">Country:</span>
    
    
            <br>
            <select name="country" class="modSelMedium" onChange="javascript:submitRefresh()" >
              
                <option SELECTED value="US">United States</option>
              
                <option  value="CA">Canada</option>
              

            </select>
            <br><br>

    

            
              <span class="pi-h4">Address Line 1:</span>
            
            
            <br>
            
              <input class="modTxtMedium" name="address1" maxlength="50" size="19" type="text" value="">
            
            
            <br><br>

            Address Line 2:
            <br>
                <input class="modTxtMedium" name="address2" maxlength="50" size="19" type="text" value="">
                <br>
                <span class="reqTxtInst">Apartment, suite, unit, building, floor, etc. </span>
            <br><br>

            Address Line 3:
            <br>
                <input class="modTxtMedium" name="address3" maxlength="50" size="19" type="text" value="">
            <br>
            <span class="reqTxtInst">Department, c/o, etc. </span>
            <br><br>

            
              <span class="pi-h4">City:</span>
            
            
            <br>
            
            
              <input class="modTxtMedium" name="city" maxlength="50" size="19" type="text" value="WALNUT">
            
            <br><br>

            
              
                  <span class="pi-h4">State:</span>
              
              
            

            
            <br>
            <select name="state" class="modSelMedium" size="1">
              
                <option  value="AL">Alabama</option>
              
                <option  value="AK">Alaska</option>
              
                <option  value="AZ">Arizona</option>
              
                <option  value="AR">Arkansas</option>
              
                <option SELECTED value="CA">California</option>
              
                <option  value="CO">Colorado</option>
              
                <option  value="CT">Connecticut</option>
              
                <option  value="DC">District of Columbia</option>
              
                <option  value="DE">Delaware</option>
              
                <option  value="FL">Florida</option>
              
                <option  value="GA">Georgia</option>
              
                <option  value="HI">Hawaii</option>
              
                <option  value="ID">Idaho</option>
              
                <option  value="IL">Illinois</option>
              
                <option  value="IN">Indiana</option>
              
                <option  value="IA">Iowa</option>
              
                <option  value="KS">Kansas</option>
              
                <option  value="KY">Kentucky</option>
              
                <option  value="LA">Louisiana</option>
              
                <option  value="ME">Maine</option>
              
                <option  value="MD">Maryland</option>
              
                <option  value="MA">Massachusetts</option>
              
                <option  value="MI">Michigan</option>
              
                <option  value="MN">Minnesota</option>
              
                <option  value="MS">Mississippi</option>
              
                <option  value="MO">Missouri</option>
              
                <option  value="MT">Montana</option>
              
                <option  value="NE">Nebraska</option>
              
                <option  value="NV">Nevada</option>
              
                <option  value="NH">New Hampshire</option>
              
                <option  value="NJ">New Jersey</option>
              
                <option  value="NM">New Mexico</option>
              
                <option  value="NY">New York</option>
              
                <option  value="NC">North Carolina</option>
              
                <option  value="ND">North Dakota</option>
              
                <option  value="OH">Ohio</option>
              
                <option  value="OK">Oklahoma</option>
              
                <option  value="OR">Oregon</option>
              
                <option  value="PA">Pennsylvania</option>
              
                <option  value="RI">Rhode Island</option>
              
                <option  value="SC">South Carolina</option>
              
                <option  value="SD">South Dakota</option>
              
                <option  value="TN">Tennessee</option>
              
                <option  value="TX">Texas</option>
              
                <option  value="UT">Utah</option>
              
                <option  value="VT">Vermont</option>
              
                <option  value="VA">Virginia</option>
              
                <option  value="WA">Washington</option>
              
                <option  value="WV">West Virginia</option>
              
                <option  value="WI">Wisconsin</option>
              
                <option  value="WY">Wyoming</option>
              
            </select>
            <br><br>

            
              <span class="pi-h4">Postal Code:</span>
            
            
            <br>
            
              <input class="modTxtMedium" name="postal" maxlength="9" size="19" type="text" value="">
            
            
            <br><br>

     

       </div>
     </td>
    </tr>
    </table>
    




      <table border="0" cellpadding="0" cellspacing="0">
    <tr>
     <td>
          <div class="pi-m-pad">
            
              <span class="pi-h4">Telephone:</span>
            
            
            <br>
            
              <span class="pi-h4"><input class="modTxtMedium" name="telephone" maxlength="15" size="19" type="text" value="">
            
            

            <br>
          </div>
        </td>
     <td>
          
            Ext:
          
          
          <br>
          
            <input class="modTxtSmall" name="extension" maxlength="5" size="4" type="text" value="">
          
          
        <br>
     </td>
    </tr>
    </table>
   </td>
 </tr>
 <tr>
  <td class="pi-mA1-c-b-spc"><img alt="" border="0" height="1" src="/img/1.gif" width="1"></td>
 </tr>
 <tr>
  <td class="pi-mA1-line"><img alt="" border="0" height="1" src="/img/1.gif" width="1"></td>
 </tr>
 <tr>
  <td class="pi-mA1-b" valign="top">

  
  <table border="0" cellpadding="0" cellspacing="0" width="422">
  <tr>
   <td class="pi-m-button" nowrap><input type="image" alt="Update" name="update_address" src="/img/en/btn_update.gif" WIDTH="51" HEIGHT="18"></td>
  </tr>
  </table>
  

  </td>
 </tr>
 </table>
 

 </td>
 <td width="10"><img alt="" border="0" height="1" src="/img/1.gif" width="10"></td>
 <td valign="top" width="134"><img alt="" border="0" height="1" src="/img/1.gif" width="134"></td>
</tr>
</table>


</form>

为了填写表格,我只是这样做了,它没问题

IE.Navigate "https://wwwapps.ups.com/webClaims/address?addrtype=f&loc=en_US"
'IE.Document.Focus
Sleep (5000)
 IE.Document.getElementsByName("companyName")(0).Value = "COMPANY"
 IE.Document.getElementsByName("name")(0).Value = "n\a"         
 IE.Document.getElementsByName("address1")(0).Value = "222 address"
 IE.Document.getElementsByName("postal")(0).Value = "99999"
 IE.Document.getElementsByName("telephone")(0).Value = "111-111-1111"

但是在提交表单时,我 运行 遇到了麻烦。如您所见,提交表单会将您带到首先生成表单的 url

  <form name="address" action="/webClaims/address" method="post">

难怪当我这样做时,表格哪儿也去不了

 IE.Document.getElementsByName("address")(0).submit

我在看他们有的 javascript 功能,也试过这个

Call IE.Document.parentWindow.execScript("submitRefresh", "JavaScript")

但结果相同。

当我尝试时

Call IE.Document.parentWindow.execScript("updateContact()", "JavaScript")

我收到这个错误

Could not complete the operation due to error 80020101

我也试过点击出现的按钮提交表单

<input type="image" alt="Update" name="update_address" src="/img/en/btn_update.gif" WIDTH="51" HEIGHT="18">

但是它说 input 标签不可点击。

我是否遗漏了一些关于 HTMLJavaScript 需要不同于通常的方法的内容?难道我不了解 child windows 的某些内容使我的方法行不通吗?

事实证明,您可以像这样与 child window 互动并通过 url

识别它
Dim objShell, IE_count, x, my_url, childPage
'Instead of opening the child window as if it were a web page with a url, treat it as a mere popup window
Set objShell = CreateObject("Shell.Application")
IE_count = objShell.Windows.Count
For x = 0 To (IE_count - 1)
    On Error Resume Next  ' sometimes more web pages are counted than are open
    'We find which window is the popup by looking at its url
    my_url = objShell.Windows(x).Document.Location
    'Debug.Print my_url
    'The url of the popup
    If my_url = "https://wwwapps.ups.com/webClaims/address?addrtype=f&loc=en_US" Then
        'We found it, so make it a shell object for us to work with
        Set childPage = objShell.Windows(x)
        Exit For
    End If
Next

我大量借用了here

我可能试图通过获取标题来获取 child window,但它与 parent window 具有相同的标题,所以 url 因为这个原因更好。之后,我可以填写表单并使用 childPage object 及其方法和属性提交。