1. 程式人生 > >webdriver之Can not connect to the Service chromedriver

webdriver之Can not connect to the Service chromedriver

停留了幾天,重新開啟robot,寫好了指令碼,跑了一遍,結果發現瀏覽器打不開了;於是鬱悶了一會,根本就沒動過這套環境,突然就不行了,瀏覽器沒有更新版本,webdriver也沒動過;通過檢視日誌,報的是Can not connect to the Service chromedriver,這個錯誤之前從來沒遇到過,通過查詢後得知答案,是因為這幾天在學習java動了hosts檔案,異常連不上chromedriver,重新配置了127.0.0.1 localhost後恢復正常。本來已經解決問題,已經沒什麼事情了的,但是就是搞不懂,因為hosts檔案預設就是localhost指向127.0.0.1的,根本不需要hosts檔案做任何改變才對。
第一步:ping localhost發現列印的是來自::1的回覆,為什麼不是127.0.0.1呢?於是再次去看hosts檔案,發現::1 localhost之前的註釋不知道什麼時候被我去掉了,於是乎我又加上了註釋符,再次執行,指令碼正常執行,問題解決。注:預設本來兩句都是註釋的,我不知道什麼時候手賤去掉了註釋符,再次加上後恢復原樣,如下:#127.0.0.1 localhost#::1 localhost第二步:再ping localhost發現列印的還是來自::1的回覆,但是我明明把::1 localhost與127.0.0.1 localhost兩行都註釋了。結果發現,必須127.0.0.1 localhost不能註釋,這樣才沒問題,於是乎就鬱悶啦。
第三步:通過查詢,原來兩個都註釋的情況下,ipv6解析優先順序高於ipv4,我們現在普遍用的都是ipv4,而::1就是ipv6解析localhost的結果,所以目的很明確,就是修改優先順序如下步驟:(1)使用管理員開啟cmd命令視窗(2)輸出netsh interface ipv6 show prefixpolicies,檢視ipv6、ipv4的解析優先順序,如下圖:ipv6(::/0)的優先順序比ipv4(::ffff:0:0/96、::/96)優先順序高,標籤數字表示優先順序,0最大。所以這裡就很明顯的說明問題了,兩個都註釋的情況下,會指向解析成::1,兩個同時都不註釋的情況下,也會解析成::1,沒辦法優先順序高就是牛逼。
(3)所以解決辦法就有兩個,一就是註釋::1 localhost,把127.0.0.1 localhost不註釋,二就是修改優先順序(4)第一就不說了,這裡說說修改優先順序,依此執行下面命令修改netsh int ipv6 set prefix ::/96 50 0
netsh int ipv6 set prefix ::ffff:0:0/96 40 1
netsh int ipv6 set prefix 2002::/16 35 2
netsh int ipv6 set prefix 2001::/32 30 3
netsh int ipv6 set prefix ::1/128 10 4
netsh int ipv6 set prefix ::/0 5 5

(5)修改成功後,再來試試,兩個同時註釋或同時不註釋,都會是來自127.0.0.1的回覆,當然如果是註釋其一,則解釋成不註釋的總結:這樣就問題很明顯了,就是因為去掉註釋後,localhost指向了::1,所以導致了webdriver傳送請求到chrome失敗了,這就應了前面那句,Can not connect to the Service chromedriver,意思就是連線不到chromedriver服務。忙完後,我再整理一份webdriver的請求原理,應該就能更清晰明白了。還有讓我鬱悶的是,我在win10、2012上試,就算我不註釋::1 localhost,優先順序也更高,一樣可以啟動成功,指令碼正常跑,而我在win7上就能發現問題,我也是醉了,無能為力啦,只針對win7來說啊,其他系統我不敢保證啦。