【问题标题】:CefSharp how to know when ajax is completed and get result?CefSharp如何知道ajax何时完成并获得结果?
【发布时间】:2019-04-07 13:06:42
【问题描述】:

我正在使用 CefSharp winform 我尝试登录网站..

但是这个网站使用 ajax 这意味着网站页面不会重新加载以获取源代码

那么我怎么知道 AJAX 是否完成?

我需要类似的东西或任何其他解决方案

           var cvbar = chrom.EvaluateScriptAsync("Is AJAX completed ??")
           var response = cvbar.Result;
          if (response.Success == true && response.Result.ToString() !=   "")
          {
          //  MessageBox.Show(response.Result.ToString());
          }


        var response1 = cvbar1.Result;
        string HTML = await chrom.GetSourceAsync();

【问题讨论】:

  • 无论是否使用 AJAX,都必须有一个 URL/入口点用于用户身份验证。尝试将所有凭据数据发布到该入口点,您应该会得到响应,无论是有效的还是其他的。从此,做你想做的事。
  • iam 尝试登录到此页面,如果登录不成功将被标记为“用户名或密码有效”,但除非 ajax 完成,否则不会发生,所以我怎么知道“如果 ajax 完成”然后我检查页面来源
  • 也许我遗漏了一些东西 + 我过去只玩过一点 CefSharp,所以不确定这是一个正统的解决方案,但您是否尝试过在 javascript 中绑定对象?然后,您可以从 javascript 调用您的 c# 委托:stackoverflow.com/questions/23425059/…
  • 你能设置一个等待的计时器吗,例如20秒?在 XMLHttpRequest 应该完成它的工作后,再次检查当前页面的响应。或者你需要研究页面的JS代码,找出哪个JS对象被改变了,然后你可以使用EvaluateScriptAsync来评估状态。
  • @wannadream 查看我的链接,这不是传递响应的有效机制吗?那么它就不需要基于计时器,并且具有按照您在第一条评论中建议的方式进行操作的优势。

标签: c# cefsharp


【解决方案1】:

生成js脚本

  async function eventClick() {   
  let target = (document.evaluate(".//html", document, null,
  XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue);
  let config = { attributes: true, childList: true, subtree: true, characterData: true + };
  let observer;

    function isItDone() {
      return new Promise(resolve => {
          // wait ajax response
          setTimeout(() => { resolve(false); }, 30000); 
          // catch ajax response
          observer = new MutationObserver(() => { 
              if (!compareObjects(oldElements, mutateElements) 
                    resolve(true);
          }
        });
        observer.observe(target, config);
    });
  }
  // ajax request
  document.evaluate(".//button", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click(); 
  let change = await isItDone();
  console.log(change);
  observer.disconnect();
  observer = null; target = null; config = null; 
  return change;  
  }

在cefsarp中执行

JavascriptResponse responseClick = await browser.EvaluateScriptAsPromiseAsync("return eventClick();");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多