gpt4 book ai didi

python - Selenium 在运行大约 500 次测试后崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 10:38:31 25 4
gpt4 key购买 nike

我正在尝试运行一些动态生成的测试。它们在 500 左右时完美运行,然后我只收到以下错误。有人以前见过这个吗?

ChromeDriver executable needs to be available in the path.  

我在想这可能是机器规范问题。我有一个超线程 i5 和 8GB 内存。查看系统监视器,我没有看到内存超过 6GB,并且 CPU 在任何内核上都从未达到 100%。我正在运行 Linux Mint。

我曾尝试在浏览器关闭后添加超时,但它似乎没有做任何事情。我注意到有很多 ChromeDriver 进程。他们对这个过程有某种限制吗?

如有任何帮助,我们将不胜感激。

最佳答案

简答

编辑:已确认,主控中修复了两个错误 herehere ;在 2.46.0 中发布。以下内容与 2.45 及更早版本相关。

nose 和/或 selenium 似乎有问题。我可以在用 Nose 运行测试时复制这个错误;我怀疑还有其他方法可以触发它。

如果您需要在错误修复之前找到解决方案,您可以执行以下操作之一:

  • 增加允许打开文件的最大数量...或...
  • ... 调整您的 site-packages/selenium/webdriver/chrome/service.py 文件

我猜测 ulimit -n 在您的机器上的输出是 1024。我为什么这么想? 500 * 2 接近于 1024(这是一个常见的设置)……继续阅读。


长答案

这是一个微妙的错误,只有当您以特定方式运行测试时才会发生,并且环境中存在特定限制。

导致难以识别的是一个 selenium 错误,它会导致错误消息不正确。

错误 #1 ... 异常范围太广

Selenium 通过使用过于宽泛的异常来向您隐藏真正的错误。如果您的测试在前 122 次运行中通过(就像我的那样),然后每次后续测试都开始失败,并且 ChromeDriver executable needs to be available in the path ... 好吧,有些奇怪的事情正在发生。对于前 122(或 500)次测试,您显然在正确的路径中使用了 chromedriver。

因此,让我们通过告诉 selenium 停止假设每个引发的异常都是 chromedriver 二进制文件不在 PATH 环境变量中的异常来获取真正的错误消息。

更改site-packages/selenium/webdriver/chrome/service.py中的start方法

来自:

try:
self.process = subprocess.Popen([
self.path,
"--port=%d" % self.port] +
self.service_args, env=env, stdout=PIPE, stderr=PIPE)
except:
raise WebDriverException(
"'" + os.path.basename(self.path) + "' executable needs to be \
available in the path. Please look at \
http://docs.seleniumhq.org/download/#thirdPartyDrivers \
and read up at \
http://code.google.com/p/selenium/wiki/ChromeDriver")

收件人:

try:
self.process = subprocess.Popen([
self.path,
"--port=%d" % self.port] +
self.service_args, env=env, stdout=PIPE, stderr=PIPE)
except:
# let all exceptions reach the user, with error type and message
# for demonstration purposes only
raise

现在,重新运行您的 500 次测试。您会收到更有用的错误消息,可能是:OSError: [Errno 24] Too many open files

错误 #2 ...打开的文件太多

由于某些原因,stdoutstderr 没有关闭。

我可以通过重复足够多次的以下测试文件来强制这个错误。

# bash to duplicate: 
# for i in `seq 1 130`
# do
# cp test_std_close.py test_std_close_$(printf %03d ${i}).py
# done

import unittest
from selenium import webdriver

class TestStdClose(unittest.TestCase):

def test_std_close(self):
driver = webdriver.Chrome();
driver.get('https://google.com');
driver.close()

如果我将其中的 130 个(test_001.py、test_002.py 等)放入一个目录并运行 nosetests std_test/test*py

我在#122 上失败了,就像我的普通测试套件一样。您可能需要运行它 500 次才能重现您的错误。

解决方案

解决方法是提高打开文件的最大数量,或者更改 site-packages/selenium/webdriver/chrome/service.py< 中的 stop 方法

来自:

try:
if self.process:
self.process.kill()
self.process.wait()
except OSError:
# kill may not be available under windows environment
pass

收件人:

try:
if self.process:
self.process.stdout.close() # add this line
self.process.stderr.close() # and this one
self.process.kill()
self.process.wait()
except OSError:
# kill may not be available under windows environment
pass

这些 hack 中的任何一个都将确保我的 160 个测试都在各种 Mac OS 配置(10.6、10.9、10.10)上执行。

我正在向 selenium 提交错误报告和补丁;问题的根源可能在其他地方,但是这两个更改之一修复了我的测试套件(通过 nose 运行)。

结论

那么,为什么这对您来说在 ~500 之后失败了?我猜 ulimit -n 在您的机器上报告 1024。一些数学运算:500 * 2 (stdout, stderr) == 1000,剩下 24 个文件可供使用。

为什么这对我来说在 ~122 之后失败了?因为在我的 Mavericks MacBook Pro 上 ulimit -n 报告 256。一些数学运算:122 * 2 == 244,给我留下 12 个打开的文件。

关于python - Selenium 在运行大约 500 次测试后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22220856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com