我正在使用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>");
}
};
}
如果我能继续展示更多的剧本 - 但我希望这个想法很明确。 select元素下的选项是基于第一个select元素中的onchange事件创建的。这是一个日期列表。
我想要做的是在两种情况下选择最后一个日期选项 - 但我不知道在存在之前如何做到这一点。此外,列表中的选项数量因距离而异,如上所示。
当我在页面源代码中看不到它们时,如何访问这些元素?
非常感谢任何帮助或指导。
答案 0 :(得分: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");
希望这有助于像我这样的其他新手。