WebRequest返回的源代码多于Browser>查看源

时间:2014-03-14 22:31:51

标签: c# html .net http selenium

我正在用C#编写Selenium实用程序来帮助进行自动化测试。我可能会遗漏一些在这里完全显而易见的东西,但为什么如果我将HttpWebRequest发送到服务器并检索响应流,我最终会得到更多来源(即Selenium的更多可映射的WebElements),而不是我在点击 - 在我的浏览器中查看页面源?

这意味着我正在映射Selenium驱动程序无法找到运行时的元素。

我很困惑:S

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());

var src = sr.ReadToEnd();

1 个答案:

答案 0 :(得分:0)

有很多种可能性。一个可能的罪魁祸首是您发送到服务器的信息的差异。除非您明确添加,否则浏览器通常会发送Web请求所没有的各种标头,cookie等。

例如,当我使用我的网络浏览器访问www.google.com时,我从Google Plus获得了一些内容,并且我获得了最高级的体验,因为我使用的是常绿浏览器。我的“查看源”页面中出现大约139000个字符。

但是,当我对同一个URL进行Web请求时(使用以下代码),我在响应流中只获得45000个字符:

async void Main()
{
    var result = await GetTextAsync("https://www.google.com");
    Console.Write(result.Length);
}

public async Task<string> GetTextAsync(string url){
    var result = await WebRequest.Create(url).GetResponseAsync();
    using (var stream = result.GetResponseStream())
    using (var reader = new StreamReader(stream))
    {
        return await reader.ReadToEndAsync();
    }
}

我怀疑如果我将WebRequest设置为发送Chrome发送给Google的所有相同的Cookie和标头,我的结果会更加相似。