【问题标题】:Selecting a dynamically generated option element with a c# webbrowser control使用 c# webbrowser 控件选择动态生成的选项元素
【发布时间】:2017-01-30 22:44:53
【问题描述】:

我正在使用 c# webbrowser 控件来浏览我使用的商业网站。我登录并导航到特定列表。该列表是潜在的工作。然后我继续通过一些链接对这些工作进行投标。在这个过程中我遇到了一个问题。

在其中一个表单上有 2 个选择元素(下拉列表)。这些列表中的选项是通过一些 javascript 脚本动态生成的——其中大部分都在源代码中可用。

在页面源代码中没有可供选择的内容。手动导航页面时选项会动态显示 - 但我正在尝试通过网络浏览器中的 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>");
        }
    };
}

如果我可以继续展示更多的脚本 - 但我希望这个想法是明确的。 select 元素下的选项是基于第一个 select 元素中的 onchange 事件创建的。这是一个日期列表。

我想要做的是在两种情况下都选择最后一个日期选项 - 但在存在之前我看不到如何做。此外,如上所示,列表中的选项数量会因距离而异。

当我在页面源代码中看不到这些元素时,如何访问它们?

非常感谢任何帮助或指导。

【问题讨论】:

    标签: javascript c# ajax webbrowser-control


    【解决方案1】:

    万一以后有人读到这篇文章,我最终自己解决了这个问题,并想分享解决方案,这很简单。

    1 - 请注意第一个“选择”元素有一个 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");
    

    希望这对像我这样的其他新手有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多