2014-09-30 32 views
2

之間餅乾我有以下情形:硒FirefoxDriver:共享會話/不同的情況下

我有一個C#WPF程序,我試圖在同一時間從他們訪問不同的網站,並收集數據。

網站(www.example.com)的登錄表單,並登錄後顯示號碼的鏈接,如www.example.com?redir=abc

我做什麼:

  • 啓動FirefoxDriver 1
  • 登錄
  • 無限循環:收集所有的鏈接&刷新頁面

問題是,我的另一個FirefoxDriver實例2在我的項目中的另一個線程中運行。

在此實例2中,我訪問之前收集的鏈接並希望打開它們。

問題是,爲了訪問他們(他們重定向),我需要再次登錄到網站A. 當我登錄時,實例1上的會話結束,所以我需要再次登錄等等等這樣,有效的實例就是「竊取」其他會話。 (我想更多地擴展這個例子以使實例3,4 ...使問題變得更糟)。

顯然我的問題是實例1和實例2沒有共享同一個會話。

可能性,我覺得要解決這個問題:使用相同的FirefoxProfile

  • :試過了,沒有工作,仍然沒有用一個實例與2窗口/標籤共享會話
  • 和訪問它使用硒ThreadGuard類兩個線程:好像很複雜,因爲我需要使用Selenium電網所有的時間
  • 窗口之間切換:似乎矯枉過正,我還沒能弄清楚,如果這是正確的事情對我來說

因此,我問,任何人有一個建議,我應該如何設計?

謝謝你的幫助。

+0

有點困惑爲什麼你甚至使用線程來做到這一點? – Arran 2014-09-30 11:12:35

+0

,因爲我需要不斷地更新和從網站A上閱讀,同時在第二個網站上做些東西B.我認爲線程是正確的事情,實際上我不知道如何做到這一點。任何建議可能? – skhro87 2014-09-30 15:09:29

回答

5

首先,我認爲有一種方法可以在兩個實例之間共享配置文件,但WebDriver似乎並不是這種情況。我能得到它的工作的唯一辦法是把餅乾從一個實例複製到其他:

var driver1 = new FirefoxDriver(); 
driver1.Navigate().GoToUrl("http://www.html-kit.com/tools/cookietester/"); 
driver1.FindElementByXPath("//input[@value=\"Set Test Cookie\"]").Click(); 

var driver2 = new FirefoxDriver(); 
driver2.Navigate().GoToUrl("http://www.html-kit.com/tools/cookietester/"); 

// Copy cookies from one driver to the other 
foreach (Cookie c in driver1.Manage().Cookies.AllCookies) 
{ 
    driver2.Manage().Cookies.AddCookie(new Cookie(c.Name, c.Value, c.Domain.TrimStart('.'), c.Path, c.Expiry)); 
} 

driver2.Navigate().Refresh(); 

唯一的問題,我不得不解決的是,webdriver的(或Firefox)不會讓你設置cookies是否你不在同一個域上。因此需要一點小小的詭計:轉到同一個域上的URL和刷新,或稍後導航到目標URL。所以你的情況:

  • 驅動程序1:導航到站點A
  • 驅動程序1:登錄
  • 驅動2:導航到站點A
  • 從驅動程序1複製cookies來驅動2
  • 驅動2:刷新(應先登錄現在)
  • 驅動2:導航到網站B

情景的位。我希望它能起作用。祝你好運。

+0

謝謝!它至少在大多數時候都有效......當我導航到同一網站中的特定網址時,我得到了一些奇怪的行爲......正在解決此問題。希望我終於可以在我的特定用例中使用這個解決方案 – skhro87 2014-10-09 04:47:50