Selenium WebDriver を使用して、URL GET が正常に返されるかどうかを確認する最も便利な方法は何ですか (HTTP 200)?
この特定のケースでは、現在のページの画像が壊れていないことを確認することに最も関心があります。
これを試して:
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.
}
}
getEval コマンドを使用して、ページ上の各画像に対して次の JavaScript から返される値を確認できます。
@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 の例を追加しました。
最初の対応はうまくいかないと思います。間違った名前の画像を 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"))
Java でトラバースする代わりに、すべての画像に対して javascript を 1 回だけ呼び出す方が高速な場合があります。
boolean allImgLoaded = (Boolean)((JavascriptExecutor) driver).executeScript(
"return Array.prototype.slice.call(document.images).every("
+ "function (img) {return img.complete && img.naturalWidth > 0;});");
代替ソリューションの 1 つは、テストの実行後に Web サーバーのログを分析することです。このアプローチにより、見逃した画像だけでなく、css、スクリプト、およびその他のリソースをキャッチできます。
やり方の説明はこちら。
Funda for Checking 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