【发布时间】:2017-01-04 07:00:17
【问题描述】:
我在这方面已经有很长一段时间了,到处都在挖,我已经不知所措了。解决方案似乎很简单:在 chromium 浏览器中注入一些 javascript 代码以等待元素出现(浏览器已经完成加载并且无需等待元素,我的 .net 代码就会超越我想要在页面上执行的自动化部分),然后继续。
我正在关注 here 和 here 的示例集(请参阅构造函数)。
但是,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