2013-04-11 63 views
0

我很努力設置網頁上一些非常尷尬的字段的值(我不控制它),請重視boffin的輸入。我做了一個模擬網頁,展示了這個問題。這裏有:VBS:div和tabIndex來自外部.vbs的目標字段

<html> 
<body> 

<div id="mydiv1" style="position: none; display: block; z-index: 1; width: 800px;"> 
<p>First div (mydiv1) starts here.</p> 
<br /> 
<div id="mydiv2" style="position: none; display: block; z-index: 6; width: 800px;"> 
<p>Second div (mydiv2) starts here. The following field in blue is arranged thusly: <i>div>div>table>form>table</i>; and its tabIndex is 1.</p> 

<table border="0" cellspacing="1" cellpadding="0" width="410"> 
<tbody> 
<tr> 
<td colspan="3" style="width: 410px; background-color: #5698eb;"> 

<form id="entryform" name="entryform"> 

<table border="0" cellspacing="1" cellpadding="0"> 
<tbody> 
<tr> 
<td width="100" valign="center" class=text1"> 
<br /><b>Project: </b> 
</td> 
<td width="5"></td> 
<td valign="centre"> 
<input class="formclass_input1" type="text" tabIndex="1" name="entryform_field"> 
</td> 
</tr> 
</tbody> 
</table> 
</form> 
</td> 
</tr> 
</tbody> 
</table> 

<br /> 
<div id="mydiv3" style="position: none; display: block; z-index: 16; width: 850px;"> 
<p>Third div (mydiv3) starts here. The following fields are arranged thusly: <i>div>div>div>form>table</i> and the tabIndexes go 1,2,3,4.<br />The field names change randomly from record to record, but their tabIndexes are always the same.</p> 

<form id="myform" name="myform"> 

<table border="0" cellspacing="1" cellpadding="0"> 
<tbody> 
<tr> 
<td width="100" valign="center" class=text1"> 
<b>Name: </b> 
</td> 
<td width="5"></td> 
<td valign="centre"> 
<input class="formclass_input1" type="text" tabIndex="1" name="changeable_field_name1"> 
</td> 
</tr> 
</tbody> 
</table> 

<table border="0" cellspacing="1" cellpadding="0"> 
<tbody> 
<tr> 
<td width="100" valign="center" class=text1"> 
<b>Date: </b> 
</td> 
<td width="5"></td> 
<td valign="centre"> 
<input class="formclass_input1" type="text" tabIndex="2" name="changeable_field_name2"> 
</td> 
</tr> 
</tbody> 
</table> 

<table border="0" cellspacing="1" cellpadding="0"> 
<tbody> 
<tr> 
<td width="100" valign="center" class=text1"> 
<b>Company: </b> 
</td> 
<td width="5"></td> 
<td valign="centre"> 
<input class="formclass_input1" type="text" tabIndex="3" name="changeable_field_name3"> 
</td> 
</tr> 
</tbody> 
</table> 

<table border="0" cellspacing="1" cellpadding="0"> 
<tbody> 
<tr> 
<td width="100" valign="center" class=text1"> 
<b>Address: </b> 
</td> 
<td width="5"></td> 
<td valign="centre"> 
<input class="formclass_input1" type="text" tabIndex="4" name="changeable_field_name4"> 
</td> 
</tr> 
</tbody> 
</table> 
</form> 
</div></div></div> 

</body> 
</html> 

這裏關鍵的是字段名稱隨機變化。我先前在堆棧中提出了我的問題,但我簡化了這個問題!一個名叫Panayot的人幫助我完美地解決了這個問題,但是當我將我的修訂腳本介紹到現場時,它失敗了。因此,使這個更準確的模擬。這比我第一次提出的要複雜得多。使用Panayot的代碼,我的劇本目前看起來是這樣的:

surl ="http://[website.com]" 
set ie = nothing 
set shapp=createobject("shell.application") 
on error resume next 
For Each owin In shapp.Windows 
    if left(owin.document.location.href,len(surl))=surl then 
     if err.number = 0 then 
     set ie = owin 
      end if 
     end if 
err.clear 
Next 
on error goto 0 
if ie is nothing then 
    wscript.echo "Window Not Open" 
else 

Set myDiv = IE.Document.All.mydiv3 

If Not myDiv Is Nothing Then 
    Set nodes = myDiv.childNodes 
    For i = 0 To nodes.Length-1 Step 2 
     If nodes(i).tabIndex = "1" Then 
      nodes(i).Value = "ta-da!" 
      'nodes(i).Value = nodes(i).tabIndex 
      Exit For 
     End If 
    Next 
End If 

End If 

我已經嘗試了很多與它,但我不能用我有限的瞭解看着辦吧。基本上最終的IF語句不會讓我進入tabIndex「1」。如果這是可以解決的,我會成爲一個非常快樂的人。任何輸入讚賞。謝謝。

回答

2

很高興看到我的代碼很有幫助。需要注意的是.childNodes屬性返回元素的直接子元素。您尋找的元素嵌套更深。我將用空格格式複製示例代碼,以更清楚地看到您的實際層次結構。

<div id="mydiv1"> 
    <div id="mydiv2"> 
    <table> 
     <tbody> 
     <tr> 
      <td> 
      <form id="entryform" name="entryform"> 
       <table> 
       <tbody> 
        <tr> 
        <td></td> 
        <td></td> 
        <td valign="centre"> 
         <input tabIndex="1" name="entryform_field"> 
        </td> 
        </tr> 
       </tbody> 
       </table> 
      </form> 
      </td> 
     </tr> 
     </tbody> 
    </table> 
    </div> <!-- end of mydiv2 --> 
</div> <!-- end of mydiv1 --> 

我沒有看到一個DIVID 「爲mydiv3」,也許這是一個錯字?無論如何,你可以結合.childNodes.firstChild屬性來瀏覽層次結構樹,但那將是令人痛苦的編碼。您可以使用getElementsByTagName函數來簡化該過程。

Set elm1 = IE.Document.All.mydiv1 
MsgBox "Tables " & elm1.getElementsByTagName("table").Length '2 
MsgBox "Forms " & elm1.getElementsByTagName("form").Length '1 
MsgBox "Inputs " & elm1.getElementsByTagName("input").Length '1 

這樣您就可以從更接近實際元素的級別開始搜索。

Set myInput = Nothing 
For Each elm In IE.Document.All.mydiv1.getElementsByTagName("input") 
    If elm.tabIndex = "1" Then 
     Set myInput = elm 
     Exit For 
    End If 
Next 

If Not myInput Is Nothing Then 
    myInput.Value = "ta-da!" 
End If 
+0

Panayot,非常感謝你。爲了解決我的問題,並一路教我,我感謝你。我希望我能做點什麼來表達我的讚賞......這對我來說是一個巨大的發展。它的作品,它很漂亮......我想我理解它。我快到那裏了。 – David 2013-04-11 20:39:27

+0

@大衛不客氣。別擔心,有一天你可以幫我解決我的問題。 – 2013-04-11 20:59:02

+0

我不知道,但我希望如此。再次謝謝你。 – David 2013-04-11 20:59:37

0

註釋掉'on error resume next'並查看錯誤是否存在。

+0

如果我註釋掉,第6行創建一個錯誤(Object不支持此屬性或方法:'owin.document.location')。如果我然後註釋掉第6行(if)和第10行(end if),則腳本到達第23行,這是它開始檢查是否有節點tabIndexes =「1」的地方 - 此行*如果節點).tabIndex =「1」然後* – David 2013-04-11 17:01:12