【问题标题】:Selenium and ChromeDriver occasionally returning wrong content for GET requestsSelenium 和 ChromeDriver 偶尔会为 GET 请求返回错误的内容
【发布时间】:2012-07-15 11:47:07
【问题描述】:

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

我不知道是 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();
            }
        }
    }
}

【问题讨论】:

    标签: c# google-chrome selenium


    【解决方案1】:

    可能是您没有给驱动程序足够的时间来完成调用并加载页面,因此它会“返回”它返回的任何先前页面。您是否考虑过在驱动程序上设置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>
    

    而 Firefox 是这样包装的:

    <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>
    

    最后,Chrome:

    <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 网络驱动程序本身的问题。我只是觉得上面的内容很有趣,并认为值得分享。

    【讨论】:

    • 是的,它可能是。我希望 ChromeDriver 的工作方式与 Firefox 和 IE 相同,并且它们不需要延迟,它们会阻塞直到内容加载。
    • 好吧,将延迟添加到其他驱动程序实际上不应该影响处理,只是可能会花费更长的时间。如果它是隐式等待而不是显式等待(例如,等到元素出现而不是等待 30 秒),那么它可能根本不会增加处理时间。
    • 我想找到它的原因,它是 ChromeDriver 或 Chrome 中的错误吗?我想知道的原因是,在 Chrome 浏览实时站点时,偶尔会丢失 GET 请求,而这个测试用例似乎重现了这一点。
    • 我个人不知道。如果我不得不猜测,我会说这可能是浏览器引擎问题而不是浏览器问题。一个测试用例可能是看看在 Safari 等其他 webkit 浏览器上是否发生同样的事情。
    【解决方案2】:

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

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

    两个事实: 1. Chrome 本身并不是性能不佳的浏览器。 2. 对新 URL 的请求是异步发送的。

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

    Selenium 驱动程序不保证在您想要查看页面之前完成加载。因此,如果您碰巧在其中一个测试中遇到竞争条件,则不能合理地将其称为驱动程序中的错误。为了进行可靠的 selenium 测试,您需要依赖使用,如 Roddy 指出的那样,超时/等待。

    【讨论】:

      【解决方案3】:

      我已经使用 Selenium 有一段时间了,它总是在请求页面完全加载之前 C# 代码已经完成执行,这意味着 selenium 执行其功能的速度非常慢。因此,为了让 selenium 完成它的工作,我们结束了使用 Thread.Sleep 并且我们的测试已经开始正常工作

      我同意这不是很好的方法,但我们尝试了各种方法,但未能找到更清洁的解决方案

      请参阅右侧同一页面上的信息链接Why is Selenium RC so slow?,它们是与硒相关的其他问题的一些相关链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        • 2012-08-19
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        相关资源
        最近更新 更多