在Travis CI中用Sauce Labs运行Django项目Selenium测试遇SSL错误
解决Travis+Sauce Connect+Django功能测试的SSL EOF错误
根据你提供的堆栈跟踪和代码配置,这个ssl.SSLEOFError问题大概率是因为错误地用HTTPS协议访问本地Sauce Connect代理导致的,结合其他可能的配置疏漏,给你几个具体的修复方案:
1. 修正WebDriver的命令执行器协议
你的代码里用了https://%s/wd/hub连接Sauce Connect,但本地的Sauce Connect代理(监听localhost:4445)是HTTP协议的,并不提供SSL证书,这直接触发了SSL握手失败。把协议改成http://就能解决这个核心问题:
def setUp(self): if "TRAVIS" in environ: username = environ["SAUCE_USERNAME"] access_key = environ["SAUCE_ACCESS_KEY"] capabilities = {} capabilities["tunnel-identifier"] = environ["TRAVIS_JOB_NUMBER"] hub_url = "%s:%s@localhost:4445" % (username, access_key) capabilities["build"] = environ["TRAVIS_BUILD_NUMBER"] capabilities["tags"] = [environ["TRAVIS_PYTHON_VERSION"], "CI"] # 关键修改:将https改为http self.selenium = webdriver.Remote( desired_capabilities=capabilities, command_executor="http://%s/wd/hub" % hub_url ) else: self.selenium = webdriver.Safari() super(FunctionalTestCase, self).setUp()
2. 确保Sauce Connect隧道正确启动并就绪
在Travis的构建脚本中,要保证Sauce Connect完全启动后再运行测试,且参数配置正确:
- 下载最新版本的Sauce Connect,避免旧版本的兼容性问题
- 添加
--no-ssl-bump-domains localhost确保本地Django服务器的请求不被SSL拦截 - 用
&让隧道后台运行,并预留足够的等待时间(比如10秒)
示例Travis配置片段:
before_script: # 启动Sauce Connect隧道 - wget https://saucelabs.com/downloads/sc-latest-linux.tar.gz - tar -xzf sc-latest-linux.tar.gz - cd sc-*-linux - ./bin/sc -u $SAUCE_USERNAME -k $SAUCE_ACCESS_KEY -i $TRAVIS_JOB_NUMBER --no-ssl-bump-domains localhost & - sleep 10 # 启动Django开发服务器 - python manage.py runserver 0.0.0.0:8000 & - sleep 5
3. 检查Django服务器的绑定地址
确保Django的runserver绑定到0.0.0.0而不是默认的127.0.0.1,这样Sauce Connect隧道才能访问到本地服务器。
4. 升级依赖版本
你的Python 3.6.3版本较老,SSL模块可能存在兼容性问题,建议升级到Python 3.7+,同时升级selenium库到最新稳定版:
pip install --upgrade selenium
5. 验证环境变量的正确性
确认Travis构建环境中SAUCE_USERNAME、SAUCE_ACCESS_KEY、TRAVIS_JOB_NUMBER这些变量都已正确设置,且capabilities["tunnel-identifier"]的值和Sauce Connect启动时的-i参数完全一致。
先尝试修改WebDriver的协议为HTTP,这应该能直接解决你遇到的SSL EOF错误,如果还有问题再逐一排查其他配置项。
内容的提问来源于stack exchange,提问作者FyZyX
相关产品推荐
相关产品推荐

