我正在开发一个项目,通过编程从windows表单输入网站数据。我将面临与combobox物理鼠标/键盘点击事件相关的问题。
从3天开始谷歌搜索解决方案并测试多种组合,但没有成功。
项目:我的Windows窗体项目有一个webbrowser控制器,它会在其中加载一个远程网站。该网站上有2个组合框。首先在其中有默认选项值,但最初没有选择任何值。第二组合框数据取决于第一组合框选择值。初始第二个组合框中没有数据,一旦用户点击鼠标/键盘上的第一个组合框,然后第二个组合框加载数据(来自server / xml / java)。
问题:我已成功使用代码设置First combobox的值。但是我需要一个物理鼠标/键盘类型点击First combobox来获得第二个组合框的值。第二个组合框值可靠第一个组合框,最初第二个组合框没有任何价值。
我的工作: 这是网站代码(我为本地测试而创建的演示)。
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge" >-->
<meta http-equiv="X-UA-Compatible" content="IE=9" >
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="jquery.min.js" type="text/javascript"></script>
<script>
$(document).ready(function () {
////////////////////////////////
$("#myselectbox").change(function () {
if ($("#myselectbox option:selected").attr("value") == "saab") {
var numbers = [1, 2, 3, 4, 5];
var option = '';
for (var i = 0; i < numbers.length; i++) {
option += '<option value="' + numbers[i] + '">' + numbers[i] + '</option>';
}
$('#myselectbox2').append(option);`enter code here`
}
});
///////////////////////////////////
});
</script>
<style type="text/css">
body {
margin-top: 0;
margin-left: 0;
}
</style>
<body>
<select id="myselectbox">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</select>
<br />
<select id="myselectbox2">
</select>
</body>
C#代码
webBrowser1.ScriptErrorsSuppressed = true;
string curDir = Directory.GetCurrentDirectory();
webBrowser1.Url = new Uri(String.Format("file:///{0}/myHTML/mainPage.html", curDir));
TEST1:此代码用于设置第一个组合框的值,并且更改在网站中可见,但不会触发鼠标/键盘上的单击。结果:第二个组合框没有价值。
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Document.GetElementById("myselectbox").SetAttribute("value", "saab");
}
TEST2:与TEST1相同的结果
private void button1_Click(object sender, EventArgs e)
{
var elements = webBrowser1.Document.GetElementsByTagName("select");
foreach (HtmlElement element in elements)
{
if (element.GetAttribute("id") == "myselectbox")
{
element.GetElementsByTagName("option")[1].SetAttribute("selected", "selected");
//webBrowser1.Document.GetElementById("myselectbox").InvokeMember("Click");
//webBrowser1.Document.InvokeScript("__doPostBack");
//webBrowser1.Document.GetElementById("myselectbox").RaiseEvent("onChange");
}
}
}
TEST3:与TEST1相同的结果
private void button1_Click(object sender, EventArgs e)
{
SendKeys.Send("{DOWN}");
SendKeys.Send("{UP}");
SendKeys.Send("{DOWN}");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.GetElementById("myselectbox").Focus();
}
TEST4:没有运气
private void button1_Click(object sender, EventArgs e)
{
foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("select"))
{
if (el.Id == "myselectbox")
{
foreach (HtmlElement comboItem in el.Children)
{
Console.WriteLine(comboItem.InnerText + " " + comboItem.GetAttribute("Selected"));
if (comboItem.InnerText == "Saab")
{
comboItem.SetAttribute("selected", "true");
// SendKeys.Send("\t");
SendKeys.Send("{Tab}");
SendKeys.Send("{ENTER}");
}
}
}
}
}
TEST5:我可以看到调试结果,因为事件找到了元素但没有点击触发器。我期待结果可能是第一个组合框将打开选项,我可能能够使用sendkeys.send选项卡的值。但没有运气
private void button1_Click(object sender, EventArgs e)
{
Point k = new Point(2,30);
HtmlElement ele = webBrowser1.Document.GetElementFromPoint(k);
ele.InvokeMember("click");
}
注意:我不知道第二个组合框获取数据的方式/位置。我正在使用firebug工具在实时网站上进行测试,然后发现第二个组合框数据来自服务器的xml文件。 我想要朝这个方向去获取第二个组合框的数据,因为在我用鼠标点击第一个组合框后,xml链接就会触发。
注意:将来的webbrowser控制器将从Windows窗体中隐藏。
任何类型的建议/代码/链接都会非常明显,非常感谢提前:)