如何在 Gitlab 上获取 Firefox 服务来运行 Selenium 端到端前端 Python 测试?

how to get Firefox service on Gitlab to run Selenium end-to-end front-end Python test?

提问人:secretAgent 提问时间:11/9/2023 最后编辑:secretAgent 更新时间:11/9/2023 访问量:57

问:

我正在尝试让 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)

提前致谢!

python selenium-webdriver gitlab webdriver cicd

评论


答: 暂无答案