4

タイトなループで 4 つの画像を要求する C# のコンソール アプリは、前の要求を返すことがあります。コードは次のとおりで、どの Web サイトに対しても機能します。通常、実行ごとに 3 つまたは 4 つのエラーが表示されます。私が管理している Web サイトを閲覧している人々から、ユーザーが HTML ページを要求したときに jpeg またはスクリプトが読み込まれることがあるという報告を受けて、このコードを開発しました。

Chrome の問題なのか ChromeDriver の問題なのかわかりません。前のリクエストが HTML ページだった場合、画像の代わりに 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 がページロードを検出できない理由がわかりません。これは確かに 3 つの HTML ラッパーの中で最も最小限のものであり、w3 バリデーターは HTML を検証するように求められると軽度のパニック攻撃を起こしますが、他の 2 つのバリデーターは比較的適切に検証されます。

また、mootinator が述べたように、Chrome ドライバー全般について多くの苦情が寄せられているため、Chrome Web ドライバー自体の問題である可能性があります。上記が興味深いと感じたので、共有する価値があると思いました.

于 2012-07-17T13:12:37.513 に答える
1

Chrome ドライバーのパフォーマンスについては、多くの不満があるようです。

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

2 つの事実: 1. Chrome 自体はパフォーマンスの悪いブラウザではありません。2. 新しい URL のリクエストは非同期で送信されます。

実際の実装が何であるかに関係なく、Chrome ドライバーは、リクエストを作成したり、リクエストの結果で自分自身を更新したりするプロセスのどこかにパフォーマンス上の問題があることは明らかです。

Selenium ドライバーは、ページを確認する前にページの読み込みが完了することを保証しません。そのため、テストの 1 つで競合状態が発生した場合、それをドライバーのバグと呼ぶのは合理的ではありません。信頼できるセレン テストを行うには、Roddy が示したように、タイムアウト/待機の使用に依存する必要があります。

于 2012-07-18T03:49:38.953 に答える
0

私はしばらくの間 S​​elenium を使用してきましたが、リクエスト ページが完全に読み込まれる前に C# コードの実行が終了した場合は常に、Selenium の機能が非常に遅いことを意味します。したがって、セレンがその機能を実行するために、Thread.Sleep の使用を終了し、テストが正しく機能し始めました。

良い方法ではないことに同意しますが、さまざまな方法を試しましたが、よりクリーンな解決策を見つけることができませんでした

詳細については、リンクを参照してください。なぜ Selenium RC はとても遅いのですか? 右側のこの同じページには、セレンに関連する他の問題に関するいくつかの関連リンクがあります

于 2012-07-18T20:54:56.140 に答える