我正在使用aCefSharp.Wpf.ChromiumWebBrowser(版本47.0.3.0)来加载网页。页面加载后我想获取源代码。
我打过电话:
wb.GetBrowser().MainFrame.GetSourceAsync()
然而它似乎没有返回所有源代码(我相信这是因为有子帧)。
如果我打电话:
wb.GetBrowser().MainFrame.ViewSource()
我可以看到它列出了所有源代码(包括内部框架)。
我想获得与ViewSource()相同的结果。有人能指出我正确的方向吗?
更新 - 添加了代码示例
注意:Web浏览器指向的地址也将仅适用于2016年10月10日。之后,它可能会显示不同的数据,而不是我要查看的数据。
在frmSelection.xaml文件中
<cefSharp:ChromiumWebBrowser Name="wb" Grid.Column="1" Grid.Row="0" />
在frmSelection.xaml.cs文件中
public partial class frmSelection : UserControl
{
private System.Windows.Threading.DispatcherTimer wbTimer = new System.Windows.Threading.DispatcherTimer();
public frmSelection()
{
InitializeComponent();
// This timer will start when a web page has been loaded.
// It will wait 4 seconds and then call wbTimer_Tick which
// will then see if data can be extracted from the web page.
wbTimer.Interval = new TimeSpan(0, 0, 4);
wbTimer.Tick += new EventHandler(wbTimer_Tick);
wb.Address = "http://www.racingpost.com/horses2/cards/card.sd?race_id=644222&r_date=2016-03-10#raceTabs=sc_";
wb.FrameLoadEnd += new EventHandler<CefSharp.FrameLoadEndEventArgs>(wb_FrameLoadEnd);
}
void wb_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
if (wbTimer.IsEnabled)
wbTimer.Stop();
wbTimer.Start();
}
void wbTimer_Tick(object sender, EventArgs e)
{
wbTimer.Stop();
string html = GetHTMLFromWebBrowser();
}
private string GetHTMLFromWebBrowser()
{
// call the ViewSource method which will open up notepad and display the html.
// this is just so I can compare it to the html returned in GetSourceAsync()
// This is displaying all the html code (including child frames)
wb.GetBrowser().MainFrame.ViewSource();
// Get the html source code from the main Frame.
// This is displaying only code in the main frame and not any child frames of it.
Task<String> taskHtml = wb.GetBrowser().MainFrame.GetSourceAsync();
string response = taskHtml.Result;
return response;
}
}
答案 0 :(得分:17)
我认为我没有得到这个one gazillion peta-bits-OMG-look-how-fast-I-go
解决方案。我会这样做:
DispatcherTimer
我对public frmSelection()
{
InitializeComponent();
wb.FrameLoadEnd += WebBrowserFrameLoadEnded;
wb.Address = "http://www.racingpost.com/horses2/cards/card.sd?race_id=644222&r_date=2016-03-10#raceTabs=sc_";
}
private void WebBrowserFrameLoadEnded(object sender, FrameLoadEndEventArgs e)
{
if (e.Frame.IsMain)
{
wb.ViewSource();
wb.GetSourceAsync().ContinueWith(taskHtml =>
{
var html = taskHtml.Result;
});
}
}
的输出和ViewSource
变量中的文字做了差异,它们是相同的,所以我不能在这里重现你的问题。
这就是说,我注意到主框架很晚才加载,所以你必须等待一段时间,直到记事本弹出来源。
答案 1 :(得分:1)
我有同样的问题试图点击并且项目位于框架而不是主框架上。使用你的答案中的例子,我写了以下扩展方法:
public static IFrame GetFrame(this ChromiumWebBrowser browser, string FrameName)
{
IFrame frame = null;
var identifiers = browser.GetBrowser().GetFrameIdentifiers();
foreach (var i in identifiers)
{
frame = browser.GetBrowser().GetFrame(i);
if (frame.Name == FrameName)
return frame;
}
return null;
}
如果您的表单上有“使用”包含此方法的模块,您可以执行以下操作:
var frame = browser.GetFrame("nameofframe");
if (frame != null)
{
string HTML = await frame.GetSourceAsync();
}
当然,在使用之前你需要确保页面加载完成,但我打算大量使用它。希望它有所帮助!
吉姆
答案 2 :(得分:-1)
带有此代码和源代码的CefSharp,您可以获取
public ChromiumWebBrowser syhmhfzdrv;
async Task<string> Bekraanlizying()
{
string syhmhfzhtml = await syhmhfzdrv.GetSourceAsync();
return syhmhfzhtml;
}
来自iframe的源代码以获取此代码
async Task<string> syhmhfziframesourcecode()
{
string syhmhfzHtml = "";
var identifiers = drv.GetBrowser().GetFrameIdentifiers();
foreach (var i in identifiers)
{
IFrame frame = drv.GetBrowser().GetFrame(i);
if (frame.Name == "frmMain")//Write the name iframe..
{
syhmhfzHtml = await frame.GetSourceAsync();
}
}
return syhmhfzHtml;
}