背景:
Selenium + Java 實現UI自動化,發現登錄后,進不了主界面,還是調回登錄頁,前台報錯401,后台日志沒發現問題chrome版本 86.0.4240.111(正式版本) (64 位),查資料可知,原來Chrome 51 開始,瀏覽器的Cookie新增加了一個SameSite屬性,用來防止CSRF 攻擊和用戶追蹤。但是我們開發時,少不了跨域啊,上網找了一下資料,有以下解決方法
方法一:
在chrome瀏覽器的地址欄輸入:chrome://flags/ ;然后在搜索框輸入:SameSite 將SameSite by default cookies 和 Cookies without SameSite must be secure 狀態都改為:desabled;設置后點擊“relaunch”按鈕生效
然后重新打開網址,登錄,發現可以登錄后跳轉,接着運行UI 自動化代碼,發現還是無法登錄,重新查看SameSite設置,發現已被重置;沒辦法,查閱資料后,只能代碼中解決;
方法二:
代碼中設置:
//設置chrome跨域
ChromeOptions options=
new ChromeOptions();
options.addArguments(
"--args --disable-web-security --user-data-dir");
driver=
new ChromeDriver(options);
Log.info(
"初始化chrome瀏覽器");
再次運行,還是無法實現登錄后跳轉;
方法三:
那么,如何在Java Selenium中禁用Chrome實驗性選項
same-site-by-default-cookies
和cookies-without-same-site-must-be-secure
?
可以使用same-site-by-default-cookies@2
&禁用cookies-without-same-site-must-be-secure@
代碼如下:
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setHeadless(false);//true不打開頁面,false打開頁面
HashMap<String, Object> chromeLocalStatePrefs = new HashMap<String, Object>();
List<String> experimentalFlags = new ArrayList<String>();
experimentalFlags.add("same-site-by-default-cookies@2");
experimentalFlags.add("cookies-without-same-site-must-be-secure@2");
chromeLocalStatePrefs.put("browser.enabled_labs_experiments", experimentalFlags);
chromeOptions.setExperimentalOption("localState", chromeLocalStatePrefs);
再次運行,終於實現登錄后跳轉;