【问题标题】:How to get dynamically generated HTML by JavaScript of web page in C# or Windows forms?如何在 C# 或 Windows 窗体中通过网页的 JavaScript 获取动态生成的 HTML?
【发布时间】:2017-11-19 07:06:18
【问题描述】:

我可以使用以下代码获取 HTML 源代码。但是当我尝试使用https://marriott.medallia.com/sso/marriott/homepage.do?v=bnAaQvo3*lVHsqtnwluPh_CMCsIHyFkti&alreftoken=6d0d31c7eb7583b964d0ecb89b55e12b

页面 URL 正在动态更改,当我看到源视图时,在下一个生成的页面上,我只在 HTML 正文中获得以下代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>IdP Selection</title>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" type="text/css" href="style.min.css">
</head>
<body>
  <div id="app-container" class="app-container"></div>
  <script>
      AppContext = {
          idps: '[{&quot;entityId&quot;:&quot;MI-PROD-SAML2-IDP-MEDALLIA&quot;,&quot;name&quot;:&quot;Marriott International (any associate w/ EID)&quot;},{&quot;entityId&quot;:&quot;https://identity.starwoodhotels.com&quot;,&quot;name&quot;:&quot;Starwood Hotels&quot;}]'
      };
  </script>
  <script src="main.min.js"></script>
</body>
</html>

当我检查生成的单选按钮时,我能够在浏览器开发人员元素选项卡中获取 HTML 元素。

我的C#代码如下:

public Form1()
    {
        InitializeComponent();
        this.webBrowser1.ObjectForScripting = new MyScript();
    }
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        webBrowser1.Navigate("javascript: window.external.CallServerSideCode();");
    }
[ComVisible(true)]
    public class MyScript
    {
        public void CallServerSideCode()
        {
            var doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document;
            var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml;
            var marelement = doc.GetElementById("MI-PROD-SAML2-IDP-MEDALLIA");
            HtmlElementCollection eCollections = doc.GetElementsByTagName("HTML");
            string strDoc = eCollections[0].OuterHtml;

        }
    }

【问题讨论】:

  • 您的代码运行时是否遇到特定异常?
  • 代码运行良好,但我无法在运行时获取生成的元素,var marelement = doc.GetElementById("MI-PROD-SAML2-IDP-MEDALLIA");在这里变空。 :(

标签: javascript c# html winforms web-scraping


【解决方案1】:

我认为是因为 ajax!在 ajax 之前的元素处理程序没有更新之后,您应该在 OnPropertyChanged 事件上附加处理程序:

var element = webBrowser.Document.GetElementsByTagName("HTML")[0];
element != null ? element.AttachEventHandler("onpropertychange", handler) : return;
private string renderedHtml;

private void handler(Object sender, EventArgs e)
{
      var element = webBrowser.Document.GetElementsByTagName("HTML")[0];
      if (element != null)
          renderedHtml = element.OuterHtml; 
}

【讨论】:

  • 我应该如何在第二行初始化/实例化目标?
  • return 还是报错(无效的表达式term return)
  • 我用 if (element != null) { element.AttachEventHandler("onpropertychange", handler); 更改表达式}
  • @RaviAnand 你做得对。我只是快速将它们写在编辑器上而不检查。现在可以用了吗?
  • 是的,项目运行良好。但处理程序没有被解雇。 :(
【解决方案2】:

所以页面是由 ReactJS 渲染的,所以你将很难让它工作。我能想到的最好的事情是创建一个“等待”在 WebBrowserControl 中创建元素的东西......

!(function() { 
    function check(){
        if(!document.getElementById("MI-PROD-SAML2-IDP-MEDALLIA")) {
            setTimeout(check, 100);
        } else {
            window.external.CallServerSideCode();
        }
    }
    check();
}());

然后可以将其缩小为您可以使用的东西...

webBrowser1.Navigate(@"javascript:!(function(){function c(){if(!document.getElementById('MI-PROD-SAML2-IDP-MEDALLIA')){setTimeout(c, 100);}else{window.external.CallServerSideCode();}}c();}());");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2014-04-04
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多