2017-01-30 56 views
0

我正在使用c#webbrowser控件瀏覽與我一起工作的商業網站。我登錄並導航到特定列表。該名單是未來的工作。然後我繼續通過一些鏈接競標這些工作。在這個過程中,我遇到了一個問題。使用c#webbrowser控件選擇動態生成的選項元素

在其中一種形式中有2個選擇元素(下拉列表)。這些列表中的選項是通過一些JavaScript腳本動態生成的 - 其中大部分都可以在源代碼中使用。

在頁面源代碼中沒有什麼可選的。這些選項在手動導航頁面時動態顯示 - 但我試圖通過web瀏覽器中的c#瀏覽它。

下面是表格。 (我切出的風格和改變一些文字 - 我知道這是嚴重的形成,但它不是我的)

<form name="frm1" id="frm1" action="/tab/Transport/LoadAssigned2.asp" method="post"> 

    <table class="section"> 
     <tr> 
      <td>Name</td> 
      <td> 
       <input type="text" name="s_name" id="s_name" size="25" maxlength="50"></td> 
     </tr> 
     <tr> 
      <td>Fax</td> 
      <td> 
       <input type="text" name="txtFaxNumber" id="txtFaxNumber" size="25" maxlength="15" value="1234567890"></td> 
     </tr> 
     <tr> 
      <td>Email</td> 
      <td> 
       <input type="text" name="txtEmail" id="txtEmail" size="25" maxlength="225"></td> 
     </tr> 
     <tr> 
      <td>Pickup will occur on or before</td> 
      <td> 
       <select name="stransp_pickup_date" id="stransp_pickup_date" style="width: 173px;" onchange="setDeliveryDate()"> 
       </select> 
      </td> 
     <tr> 
     </tr> 
      <td>Delivery will occur on or before</td> 
      <td> 
       <select name="stransp_delivery_date" id="stransp_delivery_date" style="width: 173px;"> 
       </select> 
      </td> 
     </tr> 
    </table> 
    <input type="hidden" name="nload_id" id="nload_id" value="123456789"> 

</form> 

正如你可以看到兩個選擇元素別無選擇孩子。這些是由腳本創建的,從setDeliveryDate:

function setDeliveryDate(){ 
    var distance = 226; 
    var delivery = $("#stransp_delivery_date"); 
    var pickupDate = $("#stransp_pickup_date option:selected").val(); 
    $("#stransp_delivery_date option").remove(); 
    delivery.append("<option value='-1'>SELECT DATE</option>"); 
    if(distance <=200){ 
     generateDeliveryDates(delivery,pickupDate,2); 
    }else if(distance >=201 && distance <= 400){ 
     generateDeliveryDates(delivery,pickupDate,3); 
    }else if(distance >=401 && distance <= 700){ 
     generateDeliveryDates(delivery,pickupDate,4); 
    }else if(distance >=701 && distance <= 1400){ 
     generateDeliveryDates(delivery,pickupDate,5); 
    }else if(distance >=1401 && distance <= 1800){ 
     generateDeliveryDates(delivery,pickupDate,6); 
    }else if(distance >=1801 && distance <= 2200){ 
     generateDeliveryDates(delivery,pickupDate,7); 
    }else if(distance >=2201 && distance <= 2500){ 
     generateDeliveryDates(delivery,pickupDate,8); 
    }else if(distance >=2501 && distance <= 4000){ 
     generateDeliveryDates(delivery,pickupDate,9); 
    } 
} 

而且generateDeliveryDates功能是:

function generateDeliveryDates(delivery,pickupDate,index){ 
    for (var i = 0; i < index; i++) { 
     if (moment(pickupDate).add('days', i).format('dddd') == 'Sunday') { 
      index++; 
      delivery.append("<option value='" + moment(pickupDate).add('days', i).format('MM/DD/YYYY') + "'>" + moment  (pickupDate).add('days', i).format('dddd')+" - "+ moment(pickupDate).add('days', i).format('MM/DD/YYYY') + "</option>"); 
     } else { 
     delivery.append("<option value='" + moment(pickupDate).add('days', i).format('MM/DD/YYYY') + "'>" + moment  (pickupDate).add('days', i).format('dddd')+" - "+ moment(pickupDate).add('days', i).format('MM/DD/YYYY') + "</option>"); 
     } 
    }; 
} 

IFI能保持顯示多個腳本 - 但我希望這個想法是清楚的。 select元素下的選項是基於第一個select元素中的onchange事件創建的。這是一個日期列表。

我想要做的是在兩種情況下選擇最後的日期選項 - 但我不明白在存在之前如何去做。此外,列表中的選項數量因距離而異,如上所示。

如何在頁面源代碼中看不到它們時訪問這些元素?

非常感謝任何幫助或指導。

回答

0

如果有人在將來閱讀本文,我最終會自己解決這個問題,並希望分享解決方案,這非常簡單。

1請注意,第一個「select」元素有一個onchange函數setDeliveryDate。因此,第一個想到我要做的就是調用該腳本函數一次:

webBrowser1.Document.InvokeScript("setDeliveryDate"); 

然後我收集了集合中的子節點,並選擇他們最後:

HtmlElementCollection colOptions = 
    webBrowser1.Document.GetElementById("stransp_pickup_date").Children; 

int colCount = colOptions.Count; 

colOptions[colCount - 1].SetAttribute("selected", "selected"); 

的我重新運行相同的腳本,這也創造了第二個選擇的選項,做同樣的事情(讓選項元素到一個集合,然後選擇最後一個):

webBrowser1.Document.InvokeScript("setDeliveryDate"); 

HtmlElementCollection colOptions2 = 
    webBrowser1.Document.GetElementById("stransp_delivery_date").Children; 

int colCount2 = colOptions2.Count; 

colOptions2[colCount2 - 1].SetAttribute("selected", "selected"); 

最後一步當然是提交表單的:

webBrowser1.Document.GetElementById("frm1").InvokeMember("submit"); 

希望這可以幫助像我這樣的其他新手。

相關問題