一、問題
使用Selenium+chromedriver開發自動操作頁面demo,本地調試使用IIS Express正常,
部署到IIS 訪問接口代碼正常執行,但是,但是頁面並沒有啓動
二、排查
網上找相似情況大概以下幾種
1,chromedriver和chrome 的版本不一致
2,IIS用戶權限
3,代碼寫法問題
本地可以正常啓動版本-----排除,
重新設置IIS站點權限還是無法啓動---排除
三、誤區與轉機
本次排查過程中一大誤區:本地可以運行=代碼沒有問題;
換一個方向;查看chromedriver和selenium官網看看這兩個玩意的詳細參數
ChromeDriver官網:https://chromedriver.chromium.org/security-considerations
這個文章詳細說明ChromeDriver 只允許本地連接。如果您需要從遠程主機連接到它,請在命令行上使用 --allowed-ips 開關來指定允許連接到 ChromeDrive 的 IP 地址列表。
首先:在CMD中執行,chromedriver.exe --port=8012 --whitelisted-ips="127.0.0.1" 設置白名單的地址和端口號
然後IWebDriver 使用RemoteWebDriver進行實例
ChromeOptions options = new ChromeOptions();
options.BinaryLocation = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
options.AddArgument("--start-maximized");
IWebDriver driver = new RemoteWebDriver(new Uri("http://127.0.0.1:8012"), options);
注意:
1,ChromeDriver很多版本參數命名不太一樣,上面那個命令不一定好使,建議使用 chromedriver.exe --h 查看所有參數
本次版本參數如下:
--port=要偵聽的port端口
--adb端口=端口adb服務器端口
--log path=FILE將服務器日誌寫入文件而不是stderr,將日誌級別增加到INFO
--log level=level設置日誌級別:ALL、DEBUG、INFO、WARNING、SEVERE、OFF
--verbose日誌verbosely(相當於--log level=ALL)
--無提示日誌(相當於--log level=OFF)
--追加日誌追加日誌文件而不是重寫
--可重放的(實驗性的)日誌,並且不要截斷長字符串,以便可以重放日誌。
--version打印版本號並退出
--url base命令的基本url路徑前綴,例如wd/url
--可讀時間戳將可讀時間戳添加到日誌
--enablechrome日誌顯示瀏覽器中的日誌(覆蓋其他日誌記錄選項)
--allowed ips=LIST允許連接到ChromeDriver的遠程IP地址的逗號分隔的allowelist
--allowed-origins=LIST允許連接到ChromeDriver的請求來源的逗號分隔的allowlist。使用“*”允許任何主機來源都是危險的!
2,注意設置了白名單後不要關閉CMD命令窗口
3,注意白名單端口不要衝突且不要使用ChromeDriver 默認的端口
執行 chromedriver.exe --h 後可以看到端口
四、關鍵代碼
/// <summary> /// 初始化驅動器 /// </summary> /// <param name="driver"></param> public static IWebDriver Init(this IWebDriver driver) { if (driver == null) { InitProcess(); ChromeOptions options = new ChromeOptions(); options.BinaryLocation = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"; options.AddArgument("--start-maximized"); driver = new RemoteWebDriver(new Uri("http://127.0.0.1:8012"), options); } return driver; } /// <summary> /// 初始化端口和IP白名單 /// </summary> private static void InitProcess() { var name = "cmd.exe"; var process = new Process(); // 創建一個Process類對象 process.StartInfo.FileName = name; // 設置進程的可執行文件 process.StartInfo.UseShellExecute = false; // 是否使用操作系統shell啓動進程 process.StartInfo.CreateNoWindow = true; // 是否在新窗口中啓動進程 process.StartInfo.RedirectStandardInput = true; // 是否重定向輸入 process.StartInfo.RedirectStandardOutput = true; // 是否重定向輸出 process.StartInfo.RedirectStandardError = true; // 是否重定向錯誤輸出 process.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8; // 輸出編碼方式 process.Start(); // 啓動進程 process.StandardInput.WriteLine("chromedriver.exe --port=8012 --whitelisted-ips=\"127.0.0.1\""); // 向CMD進程寫入命令 }