我是网页访问自动化的新手,所以原谅可能是一个补救问题。我在控制台应用程序中使用C#/ Windows.Forms。我需要以编程方式在网页上输入我无法修改且运行javascript的输入值。我已成功打开页面(触发WebBrowser.DocumentCompleted).
我将浏览器仿真模式设置为IE11(在注册表中),因此脚本运行时没有错误。当DocumentCompleted()触发时,我无法在没有首先查看文档的情况下访问文档元素内容来自MessageBox.Show()
,这对我的无人值守应用来说显然是不可接受的。
我需要做什么才能使我的文档元素在无人参与的会话中是可访问的(所以我可以从下面的代码中删除MessageBox.Show())?详情如下。谢谢。
输入HTML是:
<input class="input-class" on-keyup="handleKeyPress($key)" type="password">
我的DocumentCompleted事件处理程序是:
private static void LoginPageCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb = ((WebBrowser)sender);
var document = wb.Document;
// I'm trying to eliminate these 3 lines
var documentAsIHtmlDocument = (mshtml.IHTMLDocument)document.DomDocument;
var content = documentAsIHtmlDocument.documentElement.innerHTML;
MessageBox.Show(content);
String classname = null;
foreach (HtmlElement input in document.GetElementsByTagName("input"))
{
classname = input.GetAttribute("className");
if (classname == "input-class")
{
input.SetAttribute("value", password);
break;
}
}
}
答案 0 :(得分:1)
我的问题是我正在访问的页面是由javascript创建的。即使documentComplete事件被触发,页面仍未完全呈现。我已经成功处理了第一页,等待文档元素可用,如果不可用,在循环中执行Application.DoEvents();
直到它们为止,所以我现在知道我在正确的轨道上。
请注意,检查DocumentComplete并不能准确指示javascript生成的页面上文档元素的可用性。我需要继续检查元素并运行Application.DoEvents()
直到它们可用(在javascript生成它们之后)。
答案 1 :(得分:0)
如果问题来自创建一个STAThread,这是实例化WebBrowser控件的底层Activex组件所必需的,这是
您链接的SO问题中显示的Hans Passant's code的修改版本。
在控制台项目中测试。
ListViewItem