2013-05-15 52 views
1

所以,基本上我使用硒來自動化測試Web應用程序。有沒有辦法讓硒存儲cookie,以便我可以在java代碼中調用它?

  1. 我使用從Selenium IDE中導入的Java基本步驟,然後添加一些額外的Java代碼。
  2. 然後我將它發送到Selenium服務器來執行自動化步驟。

這裏是代碼的作用分解成兩個部分:1

部分:
這基本上是一些步驟登錄到Web應用程序。 它有用戶名和密碼,它發送POST和POSTDATA到服務器。 這裏的一切都是通過Selenium完成的,當Selenium自動完成測試時,您可以在Web瀏覽器中看到它完成。

第2部分:
這基本上是一些步驟發送所述數據庫中的用戶名的PHP文件使用POST和POSTDATA在服務器上。 (爲了正確發送此POST,它需要使用第1部分的Web應用程序進行身份驗證。) 此處的所有內容均通過Java完成。

問題:
所以我遇到問題是,第1部分和第2部分,似乎被視爲相互排斥。一旦我使用Selenium與Web應用程序進行身份驗證,普通的Java代碼就不會使用該會話。我不得不從HTTP頭中複製cookie,直接將它從第1部分插入到第2部分的POST中。這似乎是一個非常手動的過程,可以讓第2部分工作。

所以我想知道是否在第1部分中有一種方法讓Selenium在驗證和登錄之後在某處存儲cookie。 (可能會將cookie存儲到某個對象中)

因此,在第2部分中,我可以使用Java調用該對象並將cookie填充到必填字段中,然後完成第二次POST到Web應用程序,而無需手動給它一個有效的cookie。

回答

2

登錄後,相應的cookie已發送到客戶端瀏覽器,然後您可以使用JavaScriptExecuter將該cookie的值獲取到您的Java。

下面是我如何設置我的JavaScriptExecuter(你可能看起來有點不同):

//setup 
ProfilesIni profile = new ProfilesIni(); 
FirefoxProfile ffprofile = profile.getProfile("SELENIUM"); 
driver = new FirefoxDriver(ffprofile); 
js = (JavascriptExecutor) driver; 

下面是一個包含JavaScript來讀取cookies的字符串。您只需將其添加到頁面(執行它)每頁一次。

private final String readCookieFunction = 
    "function readCookie(name) { " + 
    "// name is the cookie you want to read - returns the value of specified cookie " + 
    "var nameEQ = name + '='; " + 
    "var ca = document.cookie.split(';'); " + 
    "for (var i = 0; i < ca.length; i++) { " + 
    "var c = ca[i]; " + 
    "while (c.charAt(0) == ' ') " + 
    "c = c.substring(1, c.length); " + 
    "if (c.indexOf(nameEQ) == 0) " + 
    "return c.substring(nameEQ.length, c.length); " + 
    "} " + 
    "return null; " + 
    "} "; 

所以,如果你重新打開或刷新頁面,你需要添加/執行下面的JS實際上調用函數之前再次執行的是:

private final String readCookie = "return readCookie(name);" 

這裏,JavaScript變量「名」是你的Cookie的名稱 - 一個字符串 - 因此,如果在測試你的網站是計算器,上面的JS會是這個樣子,而不是:

private final String readCookie = "return readCookie('stackoverflow.com');" 

反正以後,最初的本質tup,獲取cookie的價值很簡單。 部分測試可能如下所示:

// Add the function to the page's JS 
js.executeScript(readCookieFunction); 
// Call that function to get the cookie's value from the page into Java 
String cookieValue = (String) js.executeScript(readCookie); 
相關問題