1. 程式人生 > >selenium webdriver 以署理proxy方式啟動firefox,ie,chrome

selenium webdriver 以署理proxy方式啟動firefox,ie,chrome

本文是在Webdriver 2.12.0下面測試得到的結論


2. webdriver的maven配置

  <repositories> <repository> <id>selenium</id> <name>selenium</name> <url>;/url> </repository> </repositories> <dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.12.0</version> </dependency> </dependencies>




3. webdriver中firefox以代理方式啟動
普通情況下,firefox的代理修改是直接修改其配置檔案,即prefs.js,把對應的配置修改掉

  user_pref("network.proxy.ftp_port", 1000); user_pref("network.proxy.gopher", "10.0.0.0"); user_pref("network.proxy.gopher_port", 1000); user_pref("network.proxy.http", "10.0.0.0"); user_pref("network.proxy.http_port", 1000); user_pref("network.proxy.no_proxies_on", ""); user_pref("network.proxy.share_proxy_settings", true); user_pref("network.proxy.socks", "10.0.0.0"); user_pref("network.proxy.socks_port", 1000); user_pref("network.proxy.ssl", "10.0.0.0"); user_pref("network.proxy.ssl_port", 1000); user_pref("network.proxy.type", 1);



firefoxdriver初始化時,我們可以通過配置FirefoxProfile,來修改上面的配置,特別要注意的是localhost的配置,請看下述例子:

  String proxyIp = "localhost"; int proxyPort = 8080; FirefoxProfile profile = new FirefoxProfile(); // 使用代理 profile.setPreference("network.proxy.type", 1); // http協議代理配置 profile.setPreference("network.proxy.http", proxyIp); profile.setPreference("network.proxy.http_port", proxyPort); // 所有協議公用一種代理配置,如果單獨配置,這項設定為false,再類似於http的配置 profile.setPreference("network.proxy.share_proxy_settings", true); // 對於localhost的不用代理,這裡必須要配置,否則無法和webdriver通訊 profile.setPreference("network.proxy.no_proxies_on", "localhost"); // 以代理方式啟動firefox FirefoxDriver ff = new FirefoxDriver(profile); ff.get(""); ff.quit();



4. webdriver中IE以代理方式啟動,chrome類似
方式不同於firefox,這裡是利用webdriver提供的Proxy和WindowsProxyManager來處理,這裡也要特別注意localhost的處理。


處理步驟為:
1. InternetExplorerDriver初始化時,呼叫WindowsProxyManager的backupRegistrySettings方法儲存老的代理配置
2. 呼叫WindowsProxyManager的changeRegistrySettings方法類修改代理配置
3. 程式執行結束後,呼叫WindowsProxyManager的restoreRegistrySettings來恢復到老的配置。
特別需要提醒的是第3條,我認為webdriver這裡處理的不好。恢復到預設配置是在程式結束後,如果程式啟動了多個InternetExplorerDriver,每個InternetExplorerDriver儲存的是該InternetExplorerDriver啟動時IE的配置,而程式結束是呼叫的shutdownhooker,同時恢復,執行緒的執行快慢不確定,最後是否恢復到初始配置還很難說,所以,如果同個程式只啟動一個InternetExplorerDriver,使用webdriver自帶的初始InternetExplorerDriver時修改代理是沒有問題,如果啟動多個,就要採取其他方式,可以參看本文的第5部分。

程式只啟動一個InternetExplorerDriver,以代理模式啟動的程式碼如下:

  String proxyIpAndPort= "localhost:8080"; // 代理配置 DesiredCapabilities cap = new DesiredCapabilities(); org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy(); // 配置http、ftp、ssl代理(注:當前版本只支援所有的協議公用http協議,下述程式碼等同於只配置http) proxy.setHttpProxy(proxyIpAndPort) .setFtpProxy(proxyIpAndPort) .setSslProxy(proxyIpAndPort); // 以下三行是為了避免localhost和selenium driver的也使用代理,務必要加,否則無法與iedriver通訊 cap.setCapability(CapabilityType.ForSeleniumServer.AVOIDING_PROXY, true); cap.setCapability(CapabilityType.ForSeleniumServer.ONLY_PROXYING_SELENIUM_TRAFFIC, true); System.setProperty("http.nonProxyHosts", "localhost"); cap.setCapability(CapabilityType.PROXY, proxy); WebDriver driver = new InternetExplorerDriver(cap); driver.get(""); driver.close();



InternetExplorerDriver初始化後,IE對應的代理配置為:
381x309

開啟上圖中的代理配置檔案,可以看到下述配置,具體的可以自己查閱資料:

  function FindProxyForURL(url, host) { if (shExpMatch(host, 'localhost')) { return 'DIRECT'; } if (shExpMatch(url, '*/selenium-server/*')) { return 'PROXY localhost:0; DIRECT'; } return 'PROXY 10.16.16.38:3229'; }



程式結束後,恢復原來配置
370x253

5. ie和chrome,手動儲存老的代理、修改代理、恢復代理
這裡同樣使用的是webdriver提供的Proxy和WindowsProxyManager,只不過是我們顯示呼叫而已,不讓webdriver幫我們處理。幾個介面,我在上面也提起過,這裡就直接上程式碼了。

  final WindowsProxyManager proxyManager = new WindowsProxyManager(true, "webdriver-ie", 0, 0); // 備份老代理配置 proxyManager.backupRegistrySettings(); // 增加hooker,jvm退出時,把代理修改為之前的。當然,這裡可以自己決定什麼時候恢復,比如,在每次InternetExplorerDriver關閉後掉用 new Thread() { @Override public void run() { proxyManager.restoreRegistrySettings(true); } }; // 修改代理 DesiredCapabilities cap = changeProxy("localhost",8080); proxyManager.changeRegistrySettings(cap); // 啟動ie WebDriver driver1 = new InternetExplorerDriver(cap); driver1.get(""); driver1.close(); // 再次修改代理 DesiredCapabilities cap2 = changeProxy("localhost",80); proxyManager.changeRegistrySettings(cap); // 再次啟動ie WebDriver driver2 = new InternetExplorerDriver(cap); driver2.get(""); driver2.close();