【发布时间】:2018-08-26 00:14:46
【问题描述】:
我是自动化网页访问的新手,所以请原谅可能是一个补救问题。我在控制台应用程序中使用 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;
}
}
}
【问题讨论】:
-
当您尝试访问该文档时,它可能只是部分完成。例如,
DocumentCompleted()事件可以由 IFrame 触发。在尝试解析之前尝试添加检查:if (webBrowser1.ReadyState == WebBrowserReadyState.Complete) { (...) };。 -
@Jimi - 非常感谢您的建议。您建议的检查确认页面
ReadyState是Complete;但是,在 MessageBox.Show() 语句之后,文档元素仍然无法访问。 -
用示例中的代码试试。我刚刚用 WebForm 登录页面对其进行了测试,密码已正确插入到 Input 容器中。
-
@Jimi - 我正在尝试在 ConsoleApp 中执行此操作。 WebBrowser 控件是否可能在 ConsoleApp 中无法正常工作?如果是这样,那就有点解释了。
-
我将在控制台项目中对此进行测试。我不记得行为上有什么不同,但重新检查并没有什么坏处。
标签: winforms webbrowser-control