0

我有一個使用服務工作者和緩存API的應用程序。 Service Worker中使用的緩存名稱包含GIT修訂版(散列),因此每個版本都使用新的緩存並刪除舊的緩存。這是爲了讓100%的用戶始終能夠獲得最新的資源(對於預期的發佈時間表,這種情況很好)。在硒中測試服務工作者和緩存

我使用Selenium每天運行幾次的Java(WebDriver)測試(比方說,當GIT repo發生變化時),我想確保工作人員的緩存正在被正確擦除新的GIT修訂版。

默認情況下,Selenium正在爲每個瀏覽器會話創建一個新的臨時概要文件目錄,這意味着在測試開始時總是沒有緩存。我想,雖然使用緩存,我的想法是(讓我們談談關於Firefox現在):

  • 保留一些模型簡介目錄
  • 當硒啓動火狐,通過模型配置文件到新的臨時配置文件,例如new FirefoxProfile(new File(PROFILE_MODEL))
  • 這將確保一些緩存中之前開始瀏覽器
  • 一旦測試完成,備份臨時配置文件(因爲它包含更新緩存)和替換(現在年紀大了)PROFILE_MODEL與最新的配置文件,以便下一次測試運行將使用此更新緩存再次

的「模型輪廓文件更新步驟」在試運行的結束是這樣的僞代碼

File modelDir = new File(PROFILE_MODEL); 
// copy current model for backup 
bckPath = Files.createTempDirectory("bckProfile"); 
Util.copy(modelDir, bckPath); 

// remove the now obsolete PROFILE_MODEL 
Util.deleteDirectory(modelDir); 

// copy current profile to the model dir 
File profileSnapshot = currentProfile.layoutOnDisk(); 
Util.copy(profileSnapshot.toPath(), modelPath); 

的問題是,雖然,在C所有currentProfile.layoutOnDisk();似乎並沒有包含任何緩存相關的信息,我不知道如何獲得當前正在使用的臨時配置文件的路徑(在Linux中,通常類似於/tmp/anonymous6209009552324183685webdriver-profile

所以基本上我的問題是,如何保護和控制瀏覽器(Firefox)緩存跨多個測試運行?我知道通常希望在測試中啓動帶有新緩存的瀏覽器,但我認爲對於測試服務人員的這種特殊情況,對其進行一些控制是非常有用的。

請注意,我跑在CI服務器測試,所以一些手動解決方案可能是相當困難的(但是,嘿,至少它可以點我的一些方向?)

更新:我可以啓動Firefox的配置文件與

profile = new ProfilesIni().getProfile("test") 

,然後知道實際的路徑,以「測試」模式的個人資料(型號,而不是由getProfile調用創建副本),我可以從調用ProfilesIni().getProfile("test")在更換它與那些所有文件測試結束,但這似乎並沒有例如複製訪問過的頁面的歷史。

更新2:這是我如何啓動瀏覽器:

caps = DesiredCapabilities.firefox(); 
FirefoxProfile sampleProfile = new ProfilesIni().getProfile("test"); 
caps.setCapability(FirefoxDriver.PROFILE, sampleProfile); 
browser = new FirefoxDriver(caps); 

,我可以看到它創建了2個人臨時文件夾:

  • 一個由呼叫new ProfilesIni().getProfile("test")創建,它贏得在測試過程中不會得到更新
  • 第二個是從FirefoxDriver.startClient創建的方法,該方法調用NewProfileExtensionConnection.start然後調用FirefoxProfile.layoutOnDisk

現在在測試過程中,只有第二個配置文件正在更新,我猜是有道理的。問題是,如何獲取從功能創建的實際輪廓目錄,可...

回答

2

您可以覆蓋FirefoxProfile.layoutOnDisk方法總是使用同一個文件夾的文件:

public class FirefoxProfileEx extends FirefoxProfile { 

    File profileDir; 

    public FirefoxProfileEx(File profileDir){ 
     super(profileDir); 
     this.profileDir = profileDir; 
    } 

    public File layoutOnDisk() { 
     try { 
      File userPrefs = new File(profileDir, "user.js"); 

      installExtensions(profileDir); 
      deleteLockFiles(profileDir); 
      deleteExtensionsCacheIfItExists(profileDir); 
      updateUserPrefs(userPrefs); 
      return profileDir; 
     } catch (IOException e) { 
      throw new UnableToCreateProfileException(e); 
     } 
    } 
} 

用法:

FirefoxProfileEx profile = new FirefoxProfileEx(new File("C:\\temp\\profile")); 
WebDriver driver= new FirefoxDriver(profile); 
+0

這是偉大的。我想知道用cookies做同樣的事情。這是如何完成的? – conteh

0

已知的layoutOnDisk()將用於調用當前配置文件,我們將寫入或保存到磁盤。我們需要儘可能早地使用這個保存的配置文件或目錄,因爲一旦執行完成,通過使用layoutOnDisk()保存的配置文件就沒用了。他們不工作。

欲瞭解更多信息,請參閱here

所以對於Firefox的唯一的事情就是剛剛通過保存所有Cookie「driver.Manage()Cookies.AllCookies。」在下次執行中使用這些。

我希望它更喜歡使用命名配置文件,而不是從目錄中獲取配置文件。 Here創建配置文件的方式

ProfilesIni profile = new ProfilesIni(); 

    FirefoxProfile myprofile = profile.getProfile("myProfilewhichIsSaved"); 

    WebDriver driver = new FirefoxDriver(myprofile); 

我希望IE在開始之前不會幫助清除。這裏link幫助你

您也可以通過鍍鉻嘗試profile

謝謝你, 穆拉利

+0

我不確定我是否關注,但這不適合我。我試圖使用更新中提到的命名配置文件,它創建了命名配置文件的「克隆」,它不使用現有的命名配置文件,這意味着任何頁面訪問將被記錄在克隆的配置文件中,但不是原來的(在測試之後它保持完整)。這同樣適用於layoutOnDisk(),它再次對命名配置文件進行克隆,但不是測試過程中使用的更新配置文件的副本。我會在原始問題中添加更多信息。謝謝 – ladar

+0

嗨,即使你使用命名配置文件,但我沒有工作。因爲一旦執行完成,所有的cookies/catch都會被刪除。我的意思是說,而不是從目錄中調用配置文件的好習慣來使用命名配置文件。我希望你明白了我的意思是說 –

+0

沒錯,但似乎使用通過功能設置的配置文件只創建一個新的配置文件,命名配置文件的克隆,並且原來的命名配置文件不再被「更新」試驗。我需要改變我的設置,看看如果我根本不使用功能,它將如何運作。 – ladar