【问题标题】:CefSharp Wait For Element to Appear Javascript Not Triggering Raise EventCefSharp 等待元素出现 Javascript 未触发引发事件
【发布时间】:2017-01-04 07:00:17
【问题描述】:

我在这方面已经有很长一段时间了,到处都在挖,我已经不知所措了。解决方案似乎很简单:在 chromium 浏览器中注入一些 javascript 代码以等待元素出现(浏览器已经完成加载并且无需等待元素,我的 .net 代码就会超越我想要在页面上执行的自动化部分),然后继续。

我正在关注 herehere 的示例集(请参阅构造函数)。

但是,raise 事件并没有像我想象的那样触发。这可能是由于我的 javascript 代码 - 或者我可能在其他地方错过了一些东西。

这里是js代码:

private void InjectJsWait(string eventName, string selector, int time, string eventStage)
    {
        string script = @"function waitForElementToDisplay(##SELECTOR##, ##TIME##) {
                                    if(document.querySelector(##SELECTOR##)!=null) {
                                        window.boundEvent.raiseEvent('##EVENTNAME##', {eventStage: ##STAGE##});
                                        return;
                                    }
                                    else {
                                        setTimeout(function() {
                                            waitForElementToDisplay(##SELECTOR##, ##TIME##);
                                        }, ##TIME##);
                                    }
                                }";

        script = Regex.Replace(script, "##SELECTOR##", selector);
        script = Regex.Replace(script, "##TIME##", time.ToString());
        script = Regex.Replace(script, "##EVENTNAME##", eventName);
        script = Regex.Replace(script, "##STAGE##", eventStage);

        browser.ExecuteScriptAsync(script);
    }

任何帮助将不胜感激。

【问题讨论】:

  • 您是否考虑过使用MutationObserver?还要确保您已阅读 github.com/cefsharp/CefSharp/wiki/…
  • 是的,我在 LoadingStateChanged 事件触发并通过 !IsLoading 测试后注入 JS。我已经阅读了很多关于 MutationObserver 的内容,但我似乎无法理解它。
  • 我在 Mozilla 的示例中看到了脚本是如何编写的,这对我来说很有意义。但是,我仍然需要将此脚本绑定到一个 boundObject 并在 C# 中引发一个事件来检查该元素是否最终存在,对吗?我将对此进行试验,看看是否可以使用 MutationObserver。

标签: javascript c# chromium-embedded cefsharp


【解决方案1】:

使用MutationObserver 应该可以做到这一点。

您只需检查观察到的变化并过滤掉您需要的变化;无需猜测是否触发了事件或添加了元素。

请记住,这需要 Chrome 18+ 或 26+ 才能工作

【讨论】:

  • 是的,我一直想知道这是否是要走的路,我只是不知道如何实现它。我现在正在深入研究它。
  • 所以问题是当元素最终在页面上时我仍然必须触发一个事件,以便通过 boundObject 类将数据传递回 C#。我现在正在测试这个。谢谢莲。 :)
猜你喜欢
  • 2012-07-09
  • 2023-04-06
  • 2019-06-11
  • 2010-12-26
  • 2017-04-12
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多