2009-09-21 146 views
16

Selenium WebDriverを使用してURL GETが正常に返されるかどうかを確認する最も便利な方法は何ですか(HTTP 200)?Selenium WebDriverを使用して404のURLを確認する方法は?

この特定のケースでは、現在のページの画像が壊れていないことを確認することに最も関心があります。

+0

この質問のタイトルは、「Selenium WebDriverを使用してWebページ上のすべてのイメージをURLにロードしたかどうかを確認するにはどうすればよいですか?受け入れられた回答はHTTP応答コードとは無関係であり、同様の質問が出されないようにします。 – 0112

+0

同様の質問(応答コードのチェック)がここで質問/回答されました:http://stackoverflow.com/a/14547168/1596460 – 0112

答えて

10

はこれを試してみてください:

List<WebElement> allImages = driver.findElements(By.tagName("img")); 
for (WebElement image : allImages) { 
    boolean loaded = ((JavaScriptExecutor) driver).executeScript(
     "return arguments[0].complete", image); 
    if (!loaded) { 
    // Your error handling here. 
    } 
} 
+3

Dave Huntによって提案されたnaturalWidthチェックを使用する必要がありました。 boolean loaded =(ブール)driver.executeScript( "戻り値[0] .complete &&引数の型[0] .naturalWidth!="未定義\ "&& arguments [0] .naturalWidth> 0"、image); – paulcm

5

ページ上の各イメージに対して、次のJavaScriptから返される値を確認するためにgetEvalコマンドを使用できます。更新

@Test 
public void checkForBrokenImages() { 
    selenium.open("http://www.example.com/"); 
    int imageCount = selenium.getXpathCount("//img").intValue(); 
    for (int i = 0; i < imageCount; i++) { 
     String currentImage = "this.browserbot.getUserWindow().document.images[" + i + "]"; 
     assertEquals(selenium.getEval("(!" + currentImage + ".complete) ? false : !(typeof " + currentImage + ".naturalWidth != \"undefined\" && " + currentImage + ".naturalWidth == 0);"), "true", "Broken image: " + selenium.getEval(currentImage + ".src")); 
    } 
} 

追加をTestNGの/ Javaの例をテストしました。

2

私は、最初の応答が動作するとは思いません。誤って名前を付けたイメージをsrcに転送すると、期待どおりに404エラーがスローされます。しかし、私がfirebugでjavascriptをチェックすると、その(破損した)イメージは.completeがtrueに設定されています。それで、それは完成された404でしたが、依然として壊れたイメージです。

2番目の応答は、画像が完全であることを確認してから、画像にある程度の幅があることを確認するという点で、より正確なようです。

私のために働く2番目の応答のpython版を作った。少しきれいにすることができますが、うまくいけば助けになります。

def checkForBrokenImages(self): 
    sel = self.selenium 
    imgCount = int(sel.get_xpath_count("//img")) 
    for i in range(0,imgCount): 
     isComplete = sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].complete") 
     self.assertTrue(isComplete, "Bad Img (!complete): "+sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].src")) 
     typeOf = sel.get_eval("typeof selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].naturalWidth") 
     self.assertTrue(typeOf != 'undefined', "Bad Img (w=undef): "+sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].src")) 
     natWidth = int(sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].naturalWidth")) 
     self.assertTrue(natWidth > 0, "Bad Img (w=0): "+sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].src")) 
0

もう1つの解決策の1つは、テストの実行後にWebサーバーログを分析することです。このアプローチでは、欠落した画像だけでなく、CSS、スクリプトなどのリソースを捕捉することができます。

説明方法はhereです。

0

Javaでトラバースするのではなく、すべての画像に対して1回だけjavascriptを呼び出すほうが速い場合があります。

boolean allImgLoaded = (Boolean)((JavascriptExecutor) driver).executeScript(
    "return Array.prototype.slice.call(document.images).every(" 
    + "function (img) {return img.complete && img.naturalWidth > 0;});"); 
-1

Funda 404をチェックする:

を基本的に404エラーがURLのHTTP応答を介して確認することができます。

ステップ1:HTTPTestAPIのライブラリをインポートします。
ステップ2:HTTPRequestを作成します。

String URL="www.abc.com"; 
HTTPRequest request = new HTTPRequest(URL); 

//Get the response code of the URL 
int response_code = request.getResponseCode(); 

//Check for 404: 
if(response_code == 404) 
    FAIL -- THE URL is leading to 404. 
else 
    PASS 
+0

この回答はSeleniumには対処せず、別のHTTP接続を使用してテストします –

関連する問題