1

我正在使用 Ruby 2.1.0、watir-webdriver、rspec、taza和 PhantomJS 1.9.8。操作系统是Linux tester 3.2.0-4-686-pae #1 SMP Debian 3.2.65-1+deb7u1 i686 GNU/Linux.

我通过运行 PhantomJSWatir::Browser.new并提供以下命令行参数--ignore-ssl-errors=true --ssl-protocol=any --debug=true --cookies-file=/tmp/cookies.txt

一开始有一个规范文件间歇性地失败(我会说,可能是失败而不是通过):Connection refused - connect(2) for "127.0.0.1" port 8910. 同时,netstat -tulpan显示:

...
tcp        0      0 127.0.0.1:43695         127.0.0.1:8910          TIME_WAIT   -
tcp        0      0 127.0.0.1:43723         127.0.0.1:8910          TIME_WAIT   -
tcp        0      0 127.0.0.1:43743         127.0.0.1:8910          TIME_WAIT   -
tcp        0      0 127.0.0.1:43677         127.0.0.1:8910          TIME_WAIT   -
tcp        0      0 127.0.0.1:43740         127.0.0.1:8910          TIME_WAIT   -
...

总共大约90个港口。rspec它们在退出后保持打开状态。我对这种故障的间歇性感到困惑。有没有其他人遇到过同样的问题?非常感谢任何建议、推荐、链接等。谢谢你。


UPD:我仔细看了看,发现在某个时间点 PhantomJS 开始丢弃从 webdriver 获得的连接:-> [SYN], <- [RST, ACK]。该过程保留在内存中,但由于 PhantomJS 不保留任何错误日志,我完全不知道是什么原因。

4

1 回答 1

0

我不知道这是否会解决您的问题,但它可能会解释您在 netstat 中看到的内容。请注意,显示的状态是TIME_WAIT。查看 netstat 上的文档表明这是在端口关闭后一段时间内显示的常见状态

TIME_WAIT 客户端主动关闭后进入该状态

注意:socket 长时间处于 TIME_WAIT 状态是正常的。该时间在 RFC793 中指定为最大段生命周期 (MSL) 的两倍。MSL 指定为 2 分钟。因此,套接字可能处于 TIME_WAIT 状态长达 4 分钟。一些系统为 MSL 实施不同的值(少于 2 分钟)。

请注意,来自此 MS 支持页面,因此您的 MSL 长度可能与您在 Debian Linux 上时的 2 分钟不同,但其余部分基于协议规范,因此将适用于正确实现该规范的任何操作系统

您的代码打开和关闭“浏览器”对象多少次?也许这与此有关?你能把它用完吗?对于真正的浏览器,我们倾向于在测试运行开始时打开浏览器,并且只在最后关闭它,主要是为了节省浏览器本身的启动/关闭时间。如果您没有为您的测试这样做,您可能需要进行试验,看看它是否能解决您的问题。

于 2015-02-08T23:25:16.887 回答