我正在用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();
答案 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和标头,我的结果会更加相似。