Selenium firefox瀏覽器修改為標籤頁開啟方式的各種坑
需求:
今天有位朋友遇到一個梗,selenium使用firefox開啟多個網頁時,firefox總是以新視窗的方式開啟;而這位朋友的需求是以標籤頁的方式開啟新頁面。
1.新視窗方式:
2.新標籤頁方式(在IE稱為新選項卡):
當然從selenium觀點來出發,無論瀏覽器以新視窗或者新標籤,都不影響WebDriver操作元素,只需要做好控制代碼的切換即可。而現在的需求就是不想以新視窗方式開啟,因為開啟多個視窗覺得煩、亂;哈哈,我是處女座的,不知道這位朋友是不是。
解決思路
1.第一點:“修改瀏覽器的設定”
如下圖設定以標籤頁方式開啟設定好
使用selenium執行程式碼,發現依然是以視窗的方式開啟,檢視selenium啟動的firefox瀏覽器設定,發現”需要新建視窗時以新建標籤頁代替(T)“這個選項是取消的,這就可以推斷,WebDriver啟動firefox時會重置瀏覽器的配置。
2.第二點:程式碼設定
冒出的思路是在selenium啟動firefox時,設定一下瀏覽器的開啟新視窗的方式,通過查詢資料知道browser.link.open_newwindow的值是設定瀏覽器新開視窗的方式
- 值為1,在當前視窗開啟
- 值為2,新視窗方式開啟
- 值為3,以標籤頁方式開啟
啟動時設定的程式碼如下:(注意每個default檔案在不同機器上路徑不同)
String firefoxProfileDir="C:\\Users\\Administrator\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\vxhj8pmc.default";
FirefoxProfile profile = new FirefoxProfile(new File(firefoxProfileDir));
profile.setPreference("browser.link.open_newwindow", 3);
WebDriver driver = new FirefoxDriver(profile);
執行後報錯Caused by: java.lang.IllegalArgumentException: Preference browser.link.open_newwindow may not be overridden: frozen value=2, requested value=3,不允許修改配置。
3.第三點:修改webdriver_prefs.json檔案
繼續查資料發現selenium的jar中對firefox進行了格外的照顧,有一個特定的json檔案規定了firefox瀏覽器的配置,這個webdriver_prefs.json檔案路徑在org/openqa/selenium/firefox下面;
開啟檔案找到browser.link.open_newwindow的值為2,表示firefox瀏覽器以新視窗的方式開啟。所以無論我們做任何操作都是徒勞無功的。找到原因後,就好辦了,只要想辦法把這個檔案的browser.link.open_newwindow值改成3,就會以標籤頁方式開啟。
幸運的是這個檔案是Json檔案,而不是class編譯檔案裡寫死的,所以我們可以盡情的修改它。把jar字尾改成zip字尾,找到檔案開啟修改為3後儲存,再改回jar的字尾即可(記得備份,後面有彩蛋)。然後替換Eclipse中的舊jar包,執行程式碼,神奇的發現,firefox以標籤頁的方式開啟視窗,完美的解決了需求。
彩蛋來了
以標籤頁的方式開啟新視窗,興高采烈之際,切換控制代碼來了一個大坑,使用firefox的標籤頁方式開啟,無論打開了多少個,使用driver.getWindowHandles()方法得到的Set控制代碼集合都只有一個值,而用IE、Chrome並沒有這個問題。為了驗證是不是2變成3引起的,把備份的還原回去執行,發現真是這樣,以新視窗的方式開啟可以正確得到全部控制代碼。就因為一點處女座情節知道了這麼大的問題,好像也挺知足的。在度娘上找答案是不可能的,翻牆出去找到了原因,大概的解釋就是說,驅動程式無法管理以標籤頁的方式開啟的視窗。具體請看https://github.com/SeleniumHQ/selenium/issues/1614。
總結:這也就說得過去,為什麼selenium要預設設定2了,對於Selenium來說新視窗是最標準的firefox開啟方式。