如何使用 Github 操作让 Selenium 测试在 python 中运行?

tal*_*oaj 5 python selenium selenium-chromedriver github-actions

我无法在 github 操作中运行我的 python Selenium。

过去一年我一直在使用 Circle CI,但最近开始迁移到 github 操作。

为了让 Circle CI 在 Chrome 浏览器中运行 selenium,我的 config.yml 中有以下几行:

docker:
    # includes chrome browser for selenium testing
  - image: circleci/python:3.7.4-browsers
Run Code Online (Sandbox Code Playgroud)

并且似乎不需要安装 chromedriver。

我在我的 githubs action .yml 文件中使用以下内容:

jobs:
  build:
    runs-on: ubuntu-latest
    services:
      selenium:
        image: selenium/standalone-chrome
    steps:
    - uses: actions/checkout@v1
    - name: Set up Python 3.7
      uses: actions/setup-python@v1
      with:
        python-version: 3.7
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pipenv
        pipenv install
    - name: Prepare Selenium
      # https://github.com/marketplace/actions/setup-chromedriver
      uses: nanasess/setup-chromedriver@master
    - name: Launch browser
      run: |
        google-chrome --version
        export DISPLAY=:99
        chromedriver --url-base=/wd/hub &
        sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & # optional, disables headless mode
    - name: Run tests
      run: pipenv run python manage.py test functional_tests.tests.test_selenium.test_exams -v 2
Run Code Online (Sandbox Code Playgroud)

但是当我在我的 python 代码中尝试运行时出现以下错误:

from selenium import webdriver
driver = webdriver.Chrome()
Run Code Online (Sandbox Code Playgroud)
  File "/home/runner/.local/share/virtualenvs/lang-EMCZ4oUT/lib/python3.7/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "/home/runner/.local/share/virtualenvs/lang-EMCZ4oUT/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/runner/.local/share/virtualenvs/lang-EMCZ4oUT/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/runner/.local/share/virtualenvs/lang-EMCZ4oUT/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/runner/.local/share/virtualenvs/lang-EMCZ4oUT/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Run Code Online (Sandbox Code Playgroud)

从我可以在线阅读的内容来看,我应该只需要uses: nanasess/setup-chromedriver@master并且不应该需要image: selenium/standalone-chrome,但是切换进或切换出没有任何区别,python 测试仍然找不到 chrome 浏览器。

我应该设置一个端口来监听吗?

frz*_*zng 9

我\xe2\x80\x99m 将首先回答你的问题,然后我\xe2\x80\x99m 将提供另一种方法。I\xe2\x80\x99m 将使用统一的 diff 格式来突出显示我将对您的工作流程所做的更改。如果您\xe2\x80\x99不熟悉该格式,请忽略前三行,然后想象我\xe2\x80\x99m-从您的文件中删除以\xe2\x80\x9c \xe2\x80\x9d开头的行工作流程并添加以 \xe2\x80\x9c +\xe2\x80\x9d 开头的行。以 \xe2\x80\x9c 开头的行 \xe2\x80\x9d 开头的行保持原样。

\n

当您发布问题时,操作nanasess/setup-chromedriver会下载 Chrome 浏览器和 chromedriver(即 v1.0.1)。截至撰写本文时,它仍然执行相同的操作(v1.0.5)。因此,您不需要额外的服务容器来运行 Chrome 浏览器和 chromedriver \xe2\x80\x93,它们已经在您的主容器中。

\n
--- original.yml    2020-06-13 20:42:25 +0000\n+++ step1.yml   2021-04-23 00:01:00 +0000\n@@ -1,9 +1,6 @@\n jobs:\n   build:\n     runs-on: ubuntu-latest\n-    services:\n-      selenium:\n-        image: selenium/standalone-chrome\n     steps:\n     - uses: actions/checkout@v1\n     - name: Set up Python 3.7\n
Run Code Online (Sandbox Code Playgroud)\n

您也不需要 \xe2\x80\x99t \xe2\x80\x9cLaunch browser\xe2\x80\x9d 步骤。Selenium 库会为你做这件事。它默认执行本地 chromedriver 二进制文件,而后者又默认执行 Chrome 浏览器二进制文件。如果您不想使用无头模式,您仍然需要启动虚拟帧缓冲区(但仅此而已):

\n
--- step1.yml   2021-04-23 00:01:00 +0000\n+++ step2.yml   2021-04-23 00:02:00 +0000\n@@ -15,11 +15,10 @@\n     - name: Prepare Selenium\n       # https://github.com/marketplace/actions/setup-chromedriver\n       uses: nanasess/setup-chromedriver@master\n-    - name: Launch browser\n+    - name: Start XVFB\n       run: |\n-        google-chrome --version\n-        export DISPLAY=:99\n-        chromedriver --url-base=/wd/hub &\n         sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & # optional, disables headless mode\n     - name: Run tests\n       run: pipenv run python manage.py test functional_tests.tests.test_selenium.test_exams -v 2\n+      env:\n+        DISPLAY: :99\n
Run Code Online (Sandbox Code Playgroud)\n

这应该可以解决问题。注意添加env相同的DISPLAY端口与启动 XVFB 时传递的端口

\n

我的猜测是,您在此处共享的错误是由于您启动的 chromedriver 和 Google Chrome 与您的测试套件尝试启动和控制的 Chromedriver 和 Google Chrome 之间的冲突而发生的。

\n

我的替代方法是什么?我\xe2\x80\x99m个人在引入第三方依赖时有点谨慎。特别是对于那些应该只有几行代码的事情。在寻找灵感时,我会尝试尽可能接近源头。那么,Selenium 如何测试他们的代码呢?

\n

有趣的是,Selenium 项目正在使用 GitHub Actions 来测试库本身,并且它们有相当广泛的集成测试套件,需要运行浏览器。他们不使用第三方操作来设置浏览器环境。他们的测试非常复杂,但您可以接受提示,采取个人行动和步骤,并根据您的需要应用它们。

\n

重要的部分是设置 Chrome 和 chromedriver 的操作。与您\xe2\x80\x99 正在使用的Kentaro Ohkouchi(又名nanasess)的动作相比,直接且几乎相同。

\n

下一个重要部分是启动虚拟帧缓冲区。同样,如果您使用无头模式,则不需要它。与您或 Ohkouchi\xe2\x80\x99s 示例相比,他们的启动非常简单:

\n
--- step2.yml   2021-04-23 00:02:00 +0000\n+++ step3.yml   2021-04-23 00:03:00 +0000\n@@ -18,3 +18,3 @@\n     - name: Start XVFB\n       run: |\n-        sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & # optional, disables headless mode\n+        Xvfb :99 &\n
Run Code Online (Sandbox Code Playgroud)\n

sudo,没有额外的参数,只是DISPLAY端口。

\n

PS:使用第三方操作时,请使用标签。你永远不知道什么样的改变会被挤进别人\xe2\x80\x99的代码中。宁愿让测试在 CI 期间失败,调查发生了什么变化,然后升级版本,而不是盲目地相信有人总是会为你做出正确的改变\xe2\x80\xa6

\n
--- step3.yml   2021-04-23 00:03:00 +0000\n+++ step4.yml   2021-04-23 00:04:00 +0000\n@@ -15,3 +15,3 @@\n     - name: Prepare Selenium\n       # https://github.com/marketplace/actions/setup-chromedriver\n-      uses: nanasess/setup-chromedriver@master\n+      uses: nanasess/setup-chromedriver@v1.0.5\n
Run Code Online (Sandbox Code Playgroud)\n


小智 -1

使用无头 Chromedriver

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
Run Code Online (Sandbox Code Playgroud)

如果您需要带有 GUI 的 Chrome - 您可以使用macoswindows而不是 ubuntu

苹果系统

jobs:
  build:
    runs-on: macos-latest
    ...
Run Code Online (Sandbox Code Playgroud)

视窗

jobs:
  build:
    runs-on: windows-latest
    ...
Run Code Online (Sandbox Code Playgroud)