2010-03-01 49 views
38

Làm cách nào để nhận mã trạng thái HTTP trong Selenium?Kiểm tra mã trạng thái HTTP trong Selenium

Ví dụ: vì vậy tôi có thể kiểm tra nếu trình duyệt yêu cầu/người dùng/27 và không có người dùng nào có ID = 27 tồn tại, một HTTP 404 được trả về?

Quan tâm chính của tôi là Selenium RC, nhưng nếu ai đó biết câu trả lời cho selenium "bình thường", tôi có thể dễ dàng dịch nó thành RC.

/Pete

+0

có thể trùng lặp của [Kiểm tra HttpResponse OK (200) với Selenium WebDriver] (http://stackoverflow.com/questions/14537336/checking-httpresponse-ok-200-with-selenium-webdriver) – Kzqai

+2

Câu hỏi này không chính xác là một bản sao, bởi vì khi tôi hỏi câu hỏi 6 năm trước, tôi đã nói về Selenium RC mà trước đó WebDriver. Nhưng điều đó cũng khiến cho câu hỏi này không liên quan vì tôi không nghĩ mọi người sẽ sử dụng API cũ nữa. – Pete

Trả lời

10

Đây có thể không phải là cách sử dụng tốt nhất của Selenium cho loại thử nghiệm này. Có nhu cầu cần thiết để tải một trình duyệt khi bạn có thể làm và có một bài kiểm tra chạy nhanh hơn

[Test] 
[ExpectedException(typeof(WebException), UserMessage = "The remote server returned an error: (404) Not Found")] 
public void ShouldThrowA404() 
{ 
    HttpWebRequest task; //For Calling the page 
    HttpWebResponse taskresponse = null; //Response returned 
    task = (HttpWebRequest)WebRequest.Create("http://foo.bar/thiswontexistevenifiwishedonedayitwould.html"); 
    taskresponse = (HttpWebResponse)task.GetResponse(); 
} 

Nếu thử nghiệm của bạn được chuyển hướng đến một trang khác trong một Selenium 404 có thể kiểm tra trang cuối cùng có gì bạn mong đợi.

1

Bạn có thể muốn kiểm tra cuộc gọi captureNetworkTraffic(). Ngay bây giờ nó chỉ hoạt động đáng tin cậy với Firefox, trừ khi bạn thiết lập IE/Safari/etc theo cách thủ công thành lưu lượng proxy qua cổng 4444.

Để sử dụng nó, chỉ cần gọi selenium.start ("captureNetworkTraffic = true"), và sau đó trong tập lệnh, bạn có thể gọi selenium.captureNetworkTraffic ("...") trong đó "..." là "plain", "xml" hoặc "json".

5

Vì Selenium 2 bao gồm HtmlUnit, bạn có thể sử dụng nó để nhận quyền truy cập trực tiếp vào phản hồi.

public static int getStatusCode(long appUserId) throws IOException { 
    WebClient webClient = new WebClient(); 
    int code = webClient.getPage(
      "http://your.url/123/" 
    ).getWebResponse().getStatusCode(); 
    webClient.closeAllWindows(); 
    return code; 
} 
+5

Thật không may là nó không hoạt động với phiên bản C# của Selenium. – Pete

5

Tôi biết đây là một hack gây sốc, nhưng đây là những gì tôi đã thực hiện:

protected void AssertNotYellowScreen() 
    { 
     var selenium = Selenium; 

     if (selenium.GetBodyText().Contains("Server Error in '/' Application.")) 
     { 
      string errorTitle = selenium.GetTitle(); 

      Assert.Fail("Yellow Screen of Death: {0}", errorTitle); 
     } 
    } 

Nó được công việc thực hiện trong tình hình tôi cần nó cho, mặc dù tôi chấp nhận nó không phải là lý tưởng ...

+0

Tôi thậm chí còn phải sử dụng để tìm kiếm từ "lỗi" trong văn bản nội dung. Không lý tưởng nhưng nó được hoàn thành công việc. –

+0

Vâng, tôi đã ghi nhớ điều này và đang tìm kiếm một cái gì đó tốt hơn, nhưng điều này giống như cách tôi sẽ phải đi ngay bây giờ. –

-2

Nếu vẫn thất bại, bạn có thể thích ứng với mã phía máy chủ của bạn, thời gian thử nghiệm, để sản xuất các trạng thái HTTP trong các trang như là một yếu tố:

Ví dụ, trên trang Denied 403 Permission của tôi, tôi có :

<h1 id="web_403">403 Access Denied</h1> 

có thể dễ dàng kiểm tra thông qua API WebDriver:

public boolean is403(WebDriver driver) { 
     try { 
      driver.findElement(By.id("web_403")); 
      return true; 
     } catch (NoSuchElementException e) { 
      return false; 
     } 
    } 

http://www.ninthavenue.com.au/how-to-get-the-http-status-code-in-selenium-webdriver

-2

Thử lần thứ là, người

WebClient wc = new WebClient(); 
int countRepeats = 120; // one wait = 0.5 sec, total 1 minute after this code 
boolean haveResult = false; 
try { 
    HtmlPage pageHndl = wc.getPage(Urls); 
    for(int iter=0; iter<countRepeats; iter++){ 
     int pageCode = pageHndl.getWebResponse().getStatusCode(); 
     System.out.println("Page status "+pageCode); 
     if(pageCode == 200){ 
      haveResult = true; 
      break; 
     } 
     else{ 
      Thread.sleep(500); 
     } 
    } 
} catch (IOException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
} catch (InterruptedException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
} 
Các vấn đề liên quan