我正在尝试使我们的一些流程自动化,其中一个包括登录到外部网页,单击链接以展开详细信息,然后获取显示的所有详细信息。
我已经登录了进程,展开后可以抓取所有详细信息。
问题在于单击链接。链接定义如下(我已经删除了 Submit
方法实际执行的操作,因为代码很长并且可能不相关。显然 img
只是一个示例的占位符):
<a id="form:SummarySubView:closedToggleControl" onclick="A4J.AJAX.Submit(...); return false;" href="#">
<img ... />
</a>
我使用这些数据如下:
void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser browser = (WebBrowser)sender;
HtmlElement expandDetails = browser.Document.GetElementById("form:SummarySubView:closedToggleControl");
//When open ID for element is "form:SummarySubView:openToggleControl"
if(expandDetails == null) //If already expanded
{
//Stuff
}
else
{
expandDetails.InvokeMember("click"); //Click on element to run AJAX
}
}
运行 expandDetails.InvokeMember("click");
browser_DocumentCompleted
按预期再次调用,但文档与之前相同并且 expandDetails
再次使用“已关闭”ID 找到。这意味着我正在寻找的详细信息永远不会显示。
如何在 AJAX 脚本正确运行后访问文档?
添加一个定时器
来延迟检查文档似乎没有用。
最佳答案
所以一个非常简单的解决方案似乎奏效了。我的代码现在看起来像:
void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser browser = (WebBrowser)sender;
HtmlElement expandDetails = browser.Document.GetElementById("form:SummarySubView:closedToggleControl");
//When open ID for element is "form:SummarySubView:openToggleControl"
if(expandDetails == null) //If already expanded
{
//Stuff
}
else
{
expandDetails.InvokeMember("click"); //Click on element to run AJAX
while (expandDetails != null)
{
expandDetails = browser.Document.GetElementById("form:SummarySubView0:closedToggleControl");
Application.DoEvents();
System.Threading.Thread.Sleep(200);
}
//Stuff
}
}
因此,运行 while
循环对我来说效果很好。
关于c# - 包含 AJAX 按钮的屏幕抓取网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41983037/