提问人:secretAgent 提问时间:11/9/2023 最后编辑:secretAgent 更新时间:11/9/2023 访问量:57
如何在 Gitlab 上获取 Firefox 服务来运行 Selenium 端到端前端 Python 测试?
how to get Firefox service on Gitlab to run Selenium end-to-end front-end Python test?
问:
我正在尝试让 Selenium 和 Python 前端测试在 Gitlab CI 中运行,但我被困在浏览器位上。
正如你所看到的,我对默认支持的Firefox感到满意。即使是无头模式也可以。
我一直在尝试这个解决方案,它似乎是 Selenium Grid。不知道为什么,也不在乎哪种解决方案,我只是需要一些东西来让它工作。
我还尝试了其他几种方法(即 GeckoDriverManager、Firefox-ESR),但它们可能都在同一点上失败了 - 我找不到 Geckodriver 的存储位置,因此无法通过 FirefoxService 传递路径。
当我在 gitlab-ci.yml 的那个阶段将哪个 firefox 或 whereis geckodriver放入脚本位时,我在 Gitlab 的作业控制台中没有得到任何响应。
它们都在我的 Ubuntu 23.04、python3.11、selenium 4.13、virtualenv 20.24.5、unittest、Firefox 119(通过 /usr/bin/firefox)上本地运行(没有网格位)。
我 tests.py 的相关部分:
import unittest
from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver import Remote
class Main(unittest.TestCase):
def setUp(self):
optns = webdriver.FirefoxOptions()
optns.add_argument('--headless')
optns.set_capability('browserName', 'firefox')
optns.set_capability('moz:firefoxOptions', {})
remote_url = "http://firefox:4444/wd/hub"
self.driver = webdriver.Remote(command_executor=remote_url, options=optns)
def test_main(self):
self.setUp()
if __name__ == "__main__":
unittest.main()
它是 JS Web 服务器项目。
我gitlab-ci.yml的相关部分:
image: node:latest
stages:
- py_tests
- deploy
py_tests:
stage: py_tests
services:
- name: selenium/standalone-firefox:latest
alias: firefox
script:
- npm install --cache
- npx ci
- npm start &
- apt update -qy
- apt install -y python3-pip
- apt install -y xvfb
- pip install -r requirements.txt --break-system-packages
- pip install pytest --break-system-packages
- python3 -m unittest tests/selenium_python/*.py
置信区间错误:
$ python3 -m unittest tests/selenium_python/*.py
/usr/lib/python3.11/unittest/case.py:576: ResourceWarning: unclosed file <_io.BufferedWriter name='/dev/null'>
self.setUp()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
E/usr/lib/python3.11/unittest/case.py:622: ResourceWarning: unclosed file <_io.BufferedWriter name='/dev/null'>
with outcome.testPartExecutor(self):
ResourceWarning: Enable tracemalloc to get the object allocation traceback
E
======================================================================
ERROR: test_main (tests.selenium_python.tests.Main.test_main)
----------------------------------------------------------------------
Traceback (most recent call last):
File " tests.py", line 82, in test_main
self.setUp()
File " tests.py", line 36, in setUp
self.driver = webdriver.Remote(command_executor=remote_url, options=optns)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/selenium/webdriver/remote/webdriver.py", line 205, in __init__
self.start_session(capabilities)
File "/usr/local/lib/python3.11/dist-packages/selenium/webdriver/remote/webdriver.py", line 289, in start_session
response = self.execute(Command.NEW_SESSION, caps)["value"]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/selenium/webdriver/remote/webdriver.py", line 344, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.11/dist-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: Could not start a new session. New session request timed out
Host info: host: '3afb89......', ip: '172.17.0.3'
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.4.109+', java.version: '11.0.20.1'
Driver info: driver.version: unknown
Stacktrace:
at org.openqa.selenium.grid.sessionqueue.local.LocalNewSessionQueue.addToQueue (LocalNewSessionQueue.java:221)
at org.openqa.selenium.grid.sessionqueue.NewSessionQueue.lambda$new$0 (NewSessionQueue.java:68)
at org.openqa.selenium.remote.http.Route$TemplatizedRoute.handle (Route.java:193)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.remote.http.Route$CombinedRoute.handle (Route.java:345)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.grid.sessionqueue.NewSessionQueue.execute (NewSessionQueue.java:128)
at org.openqa.selenium.remote.tracing.SpanWrappedHttpHandler.execute (SpanWrappedHttpHandler.java:87)
at org.openqa.selenium.remote.http.Filter$1.execute (Filter.java:63)
at org.openqa.selenium.remote.http.Route$CombinedRoute.handle (Route.java:345)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.grid.router.Router.execute (Router.java:87)
at org.openqa.selenium.grid.web.EnsureSpecCompliantResponseHeaders.lambda$apply$0 (EnsureSpecCompliantResponseHeaders.java:34)
at org.openqa.selenium.remote.http.Filter$1.execute (Filter.java:63)
at org.openqa.selenium.remote.http.Route$CombinedRoute.handle (Route.java:345)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.remote.http.Route$NestedRoute.handle (Route.java:271)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.remote.http.Route$CombinedRoute.handle (Route.java:345)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.remote.http.Route$CombinedRoute.handle (Route.java:345)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.remote.http.Route$CombinedRoute.handle (Route.java:345)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.remote.http.Route$CombinedRoute.handle (Route.java:345)
at org.openqa.selenium.remote.http.Route.execute (Route.java:69)
at org.openqa.selenium.remote.AddWebDriverSpecHeaders.lambda$apply$0 (AddWebDriverSpecHeaders.java:35)
at org.openqa.selenium.remote.ErrorFilter.lambda$apply$0 (ErrorFilter.java:44)
at org.openqa.selenium.remote.http.Filter$1.execute (Filter.java:63)
at org.openqa.selenium.remote.ErrorFilter.lambda$apply$0 (ErrorFilter.java:44)
at org.openqa.selenium.remote.http.Filter$1.execute (Filter.java:63)
at org.openqa.selenium.netty.server.SeleniumHandler.lambda$channelRead0$0 (SeleniumHandler.java:44)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:515)
at java.util.concurrent.FutureTask.run (FutureTask.java:264)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:628)
at java.lang.Thread.run (Thread.java:829)
提前致谢!
答: 暂无答案
评论