2017-01-30 5 views
0

私はC#webbrowserコントロールを使用して、私が扱っている商用Webサイトをナビゲートしています。ログインして特定のリストに移動します。リストは将来の仕事です。それから私はそれらの仕事に入札するためにいくつかのリンクを続けます。その過程で私は問題に遭遇しました。c#webbrowserコントロールを使用して動的に生成されたオプション要素を選択する

フォームの1つに2つの選択要素(ドロップダウンリスト)があります。これらのリストのオプションは、いくつかのjavascriptスクリプトを使用して動的に生成されます。ほとんどのスクリプトはソースで利用できます。

ページソースコードには何も選択できません。オプションはページを手動でナビゲートするときに動的に表示されますが、WebブラウザでC#を使用してナビゲートしようとしています。

ここにフォームがあります。あなたは、2つの選択要素がnoオプションの子供を持っていない見ることができるように

<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 - 最初の「選択」要素にはonchange function-setDeliveryDateがあります。だから、最初は私が考えて、一度そのスクリプト関数を呼び出すです:

webBrowser1.Document.InvokeScript("setDeliveryDate"); 

それから私は、コレクション内の子ノードを収集し、それらの最後を選択:

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

int colCount = colOptions.Count; 

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

私は再実行ザ・は同じスクリプト、また第2の選択のためのオプションを作成し、同じことを行う(コレクションにオプションの要素を取得し、最後のいずれかを選択):

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"); 

これは私のような他の初心者に役立ちます。

関連する問題