- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 CefSharp 用 C# 编写一个应用程序。我的目的是获取给定页面上的所有链接,例如
https://wixlabs---dropbox-folder.appspot.com/index?instance=lp5CbqBbK6JUFzCW2hXENEgT4Jn0Q-U1-lIAgEbjeio.eyJpbnN0YW5jZUlkIjoiYjNiNzk5YjktNjE5MS00ZDM0LTg3ZGQtYjY2MzI1NWEwMDNhIiwiYXBwRGVmSWQiOiIxNDkyNDg2NC01NmQ1LWI5NGItMDYwZi1jZDU3YmQxNmNjMjYiLCJzaWduRGF0ZSI6IjIwMTgtMDEtMjJUMTg6Mzk6MjkuNjAwWiIsInVpZCI6bnVsbCwidmVuZG9yUHJvZHVjdElkIjpudWxsLCJkZW1vTW9kZSI6ZmFsc2V9&target=_top&width=728&compId=comp-j6bjhny1&viewMode=viewer-seo
当我加载页面并打开开发工具并执行
document.getElementsByTagName('a');
在开发工具中我得到了 374 个结果。接下来,我从 BrowserLoadingStateChanged 执行以下代码:-
private async Task ProcessLinksAsync()
{
var frame = browser.GetMainFrame();
var response = await frame.EvaluateScriptAsync("(function() { return document.getElementsByTagName('a'); })();", null);
ExpandoObject result = response.Result as ExpandoObject;
Console.WriteLine("Result:" + result);//What do I do here?
}
我得到一个扩展对象,它似乎不包含任何内容。我这样说是因为我使用了断点并检查了该对象。我已经经历过https://keyholesoftware.com/2019/02/11/create-your-own-web-bots-in-net-with-cefsharp/ , https://github.com/cefsharp/CefSharp/wiki/General-Usage#javascript-integration以及关于SO的问题但无法解决我的问题。我在这里做错了什么吗?我的实际意图是获取链接然后导航到它们。提前致谢。
编辑:我在浏览器和开发工具中使用了以下脚本,均返回 187 个结果,这是正确的。
(function() {
var links=document.getElementsByClassName('file-link');
var linksArray = new Array();
for (var i = 0; i < links.length; i++) {
linksArray[i] = String(links[i].href);
}
return linksArray;
})();
但是在我的应用程序中我得到一个 0 长度的数组。
编辑2:我使用以下代码来获取 DOM:-
public void OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
{
ContextCreated?.Invoke(this, frame);
const string script = "document.addEventListener('DOMContentLoaded', function(){ alert(document.links.length); });";
frame.ExecuteJavaScriptAsync(script);
}
对于我尝试过的所有其他网站,除了上面提到的 URL 之外,代码都是成功的。任何人都可以告诉我,当 DOM 加载到开发工具中并且完全可访问时,可能会出现什么问题。所以,我想我的代码中可能缺少一些东西。再次感谢。
最佳答案
您需要等待页面加载。另外,如果页面使用ajax加载数据,则需要稍等片刻才能加载数据。然后您需要将结果调整为自定义 JavaScript 对象。
ChromiumWebBrowser browser;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
browser = new ChromiumWebBrowser(
"https://google.com/"); // Tried with your URL.
browser.LoadingStateChanged += Browser_LoadingStateChanged;
browser.Dock = DockStyle.Fill;
Controls.Add(browser);
}
private async void Browser_LoadingStateChanged(object sender,
LoadingStateChangedEventArgs e)
{
if (!e.IsLoading)
{
await Task.Delay(5000); //Just for pages which use ajax loading data
var script = @"
(function () {
var data = document.getElementsByTagName('a');
return Array.from(data, a => ({href:a.href, innerText:a.innerText}));
})();";
var result = await browser.EvaluateScriptAsync(script);
var data = (IEnumerable<dynamic>)result.Result;
MessageBox.Show(string.Join("\n", data.Select(x=>$"{x.href}").Distinct()));
}
}
关于javascript - 为什么 EvaluateScriptAsync 在 CefSharp 中返回空的 Expando 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57738283/
我正在尝试获取存储在页面上的财务数据点(“https://www.avanza.se/aktier/om-aktien.html/31607/ica-gruppen”)。 稍微提炼一下问题。 然后我尝
当前在我的 Visual Studio 项目中使用 CefSharp 来显示 Web 浏览器。我正在使用 EvaluateScriptAsync 调用 javascript 中的函数。 但是我遇到了一
我正在尝试使用 CefSharp 用 C# 编写一个应用程序。我的目的是获取给定页面上的所有链接,例如 https://wixlabs---dropbox-folder.appspot.com/ind
我在我的项目中使用 CefSharp WinForms,但我无法让它从 CefSharp 浏览器控件执行 JS 脚本(虽然我是导航到 URL - 所以大部分 CEF 功能都有效)我尝试按照教程进行操作
我是一名优秀的程序员,十分优秀!