停留了几天,重新打开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来说啊,其他系统我不敢保证啦。