4

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();
            }
        }
    }
}
4

3 回答 3

3

可能是您没有给驱动程序足够的时间来完成调用并加载页面,因此它会“返回”它返回的任何前一页。您是否考虑过在驱动程序上设置超时/等待

编辑

关于为什么在 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 包装器中最小的一个,当要求w3 验证器验证其 HTML 而其他两个验证相对较好时,它会出现轻微的恐慌。

此外,正如 mootinator 所提到的,一般来说,有很多关于 Chrome 驱动程序的投诉,因此这可能只是 Chrome 网络驱动程序本身的问题。我刚刚发现上述内容很有趣,并认为可能值得分享。

于 2012-07-17T13:12:37.513 回答
1

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

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

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

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

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

于 2012-07-18T03:49:38.953 回答
0

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

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

请参阅链接获取信息为什么 Selenium RC 这么慢?在右侧的同一页面上,它们是与硒相关的其他问题的一些相关链接

于 2012-07-18T20:54:56.140 回答