2012-07-15 45 views
3

C#中的一个控制台应用程序在紧密循环中请求四个图像,有时会返回先前的请求。代码如下,适用于任何网站,我通常会在每次运行中看到3或4个错误。我在浏览网站的人员的报告后开发了此代码,我管理用户请求HTML页面时偶尔会加载jpeg或脚本的位置。Selenium和ChromeDriver偶尔为GET请求返回错误的内容

我不知道它是Chrome还是ChromeDriver问题。如果以前的请求是一个HTML页面,那么您可以最终获取该图像而不是图像。似乎是一种竞争条件。

有没有其他人看到过这种行为,他们可以重复下面的代码吗?

class ContentVerify 
{ 
    OpenQA.Selenium.IWebDriver driver; 

    readonly System.Collections.Generic.List<string> testUrls = new System.Collections.Generic.List<string>() 
    { 
     "http://i.imgur.com/zNJvS.jpg", 
     "http://i.imgur.com/lzVec.jpg", 
     "http://i.imgur.com/rDuhT.jpg", 
     "http://i.imgur.com/sZ26q.jpg" 
    }; 

    public void Check() 
    { 
     driver = new OpenQA.Selenium.Chrome.ChromeDriver(); // Both InternetExplorerDriver and FirefoxDriver work OK. 

     for (int i = 0; i < 10; i++) 
     { 
      TestUrls(); 
     } 
     driver.Quit(); // The driver also crashes on exit, but this seems to be a known bug in Selenium. 
    } 

    private void TestUrls() 
    { 
     foreach (var item in testUrls) 
     { 
      System.Console.WriteLine(item); 
      //System.Threading.Thread.Sleep(1); // Uncommenting this makes Chrome & ChromeDriver work as expected. 
      driver.Url = item; 
      // Requests for images come back as an HTML image tag wrapped in a brief HTML page, like below; 
      //<html><body style="margin: 0px;"><img style="-webkit-user-select: none" src="http://i.imgur.com/zNJvS.jpg"></body></html> 
      // So the image should always be in the page, but sometimes (not always) we get the previous image requested. 
      if (!driver.PageSource.Contains(item)) 
      { 
       System.Console.ForegroundColor = System.ConsoleColor.Red; 
       System.Console.WriteLine("Expected: {0}, got: {1}", item, driver.PageSource); 
       System.Console.ResetColor(); 
      } 
     } 
    } 
} 

回答

2

这可能是因为你没有给司机足够的时间来完成呼叫,并在页面加载,所以它会“回归”无论前一页它回来了。你有没有考虑过在驱动上设置timeout/wait

编辑

至于的的问题,为什么有这个问题在Chrome而不是其他的浏览器,我不得不斗胆猜测说,这可能与该怎么办不同的浏览器引擎会直接显示图像而不是HTML。我做这个假设是因为这样的差异在运行类似于Google主页等HTML页面的代码时没有看到。

每个浏览器都用一些HTML包装图像。例如,IE9包装这样:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML><HEAD> 
<META content="text/html; charset=windows-1252" http-equiv=Content-Type></HEAD> 
<BODY><IMG src="[url here]"></BODY></HTML> 

而火狐将其包装,如:

<html> 
<head> 
    <meta content="width=device-width; height=device-height;" name="viewport"> 
    <link href="resource://gre/res/TopLevelImageDocument.css" rel="stylesheet"> 
    <title>[filename] (JPEG Image, 500&nbsp;×&nbsp;332 pixels)</title> 
</head> 
<body> 
    <img alt="[url here]" src="[url here]"> 
</body> 
</html> 

最后,铬:

<html> 
<body style="margin: 0px;"> 
    <img style="-webkit-user-select: none; " src="[url here]" width="500" height="332"> 
</body> 
<style type="text/css"></style> 
</html> 

现在,我不知道为什么Chrome浏览器版本会导致webdriver无法检测页面加载。它肯定是三个HTML封装中最小的一个,当被要求验证它的HTML时,其他两个验证相对较好,并且w3 validator有轻微的恐慌发作。

另外,正如mootinator所提到的,关于Chrome驱动程序一般有很多抱怨,所以它可能只是Chrome webdriver本身的一个问题。我刚刚发现上面有趣的事情,并认为它可能值得分享。

+0

是的,它可能是。我希望ChromeDriver的工作方式与Firefox和IE一样,但他们不需要这样的延迟,它们会阻塞,直到内容加载完毕。 – 2012-07-17 13:48:30

+0

将延迟添加到其他驱动程序实际上不应该伤害处理,只是可能会花费更长的时间。如果它是隐含的等待而不是显式的(例如,等到元素存在而不是等待30秒),那么它可能根本不会增加处理时间。 – 2012-07-17 15:28:22

+0

但我想找到它的原因,是ChromeDriver还是Chrome的错误?我想知道的原因是,在Chrome浏览活网站时,偶尔发出的GET请求不见了,这个测试案例似乎重现了这一点。 – 2012-07-17 16:28:36

1

似乎有很多关于Chrome驱动程序性能的抱怨。

http://code.google.com/p/selenium/issues/detail?id=1294

两个事实:1。 铬本身并不是一个表现不佳的浏览器。 2.新URL的请求是异步发送的。

无论实际的实现是什么,显然Chrome驱动程序在进行请求和/或使用请求结果更新自己的过程中存在性能问题。

Selenium驱动程序不保证保证在您想要窥视它之前,页面将完成加载。因此,如果您碰巧在您的某个测试中遇到竞争条件,则无法合理将其称为驱动程序中的错误。为了做出可靠的硒测试,您需要依赖使用,如Roddy所示,超时/等待。

0

我一直在使用Selenium一段时间,并且它始终是C#代码在请求页面完全加载之前已经完成执行的情况,这意味着硒在执行其功能时非常缓慢。因此,为了使硒做最后我们使用了Thread.Sleep和我们的测试中它的东西已经开始正常工作

我同意不漂亮的方式做到这一点,但我们已经尝试过各种方法,并没有找到清晰的解决方案

请查看链接了解相关信息Why is Selenium RC so slow?在同一页面的右侧它们是与硒相关的其他问题的一些相关链接