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



我在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

而且似乎不需要安装Chrome驱动程序。

我在我的 githubs 操作 .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

但是当我尝试在python代码中运行时,我收到以下错误:

from selenium import webdriver
driver = webdriver.Chrome()
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.)

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

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

我将首先回答您的问题,然后我将提供另一种方法。我将使用统一的差异格式来突出显示我将对您的工作流程所做的更改。如果您不熟悉格式,请忽略前三行,然后假设我正在从工作流程中删除以"-"开头的行,并添加以"+"开头的行。以""开头的行保持原样。

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

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

您也不需要"启动浏览器"步骤。硒图书馆会为你做。默认情况下,它执行本地 chromedriver 二进制文件,而后者又默认执行 Chrome 浏览器二进制文件。如果您不想使用无头模式,您仍然必须启动虚拟帧缓冲(但没有别的(:

--- step1.yml   2021-04-23 00:01:00 +0000
+++ step2.yml   2021-04-23 00:02:00 +0000
@@ -15,11 +15,10 @@
- name: Prepare Selenium
# https://github.com/marketplace/actions/setup-chromedriver
uses: nanasess/setup-chromedriver@master
-    - name: Launch browser
+    - name: Start XVFB
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
+      env:
+        DISPLAY: :99

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

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

。我的替代方法是什么?我个人在引入第三方依赖项时有点谨慎。特别是对于应该只有几行代码的东西。在寻找灵感时,我会尽量接近源头。那么,Selenium是如何测试他们的代码的呢?

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

重要的部分是设置Chrome和chromedriver的操作。与您正在使用的大口健太郎(又名nanasess(的动作相比,直截了当且几乎相同。

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

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

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

PS:使用第三方操作时,请使用标签。你永远不知道什么样的变化会挤进别人的代码。宁愿让测试在 CI 期间失败,调查更改的内容,然后提高版本,而不是盲目相信总有人会为您做出正确的更改......

--- step3.yml   2021-04-23 00:03:00 +0000
+++ step4.yml   2021-04-23 00:04:00 +0000
@@ -15,3 +15,3 @@
- name: Prepare Selenium
# https://github.com/marketplace/actions/setup-chromedriver
-      uses: nanasess/setup-chromedriver@master
+      uses: nanasess/setup-chromedriver@v1.0.5

查看chromedriver-autoinstaller python软件包。

使用脚本中的以下代码行,您可以自动检查并下载最新版本的chromedriver,然后将其添加到路径中。

chromedriver_autoinstaller.install()

您还应该查看此模板。

使用无头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)

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

苹果操作系统

jobs:
build:
runs-on: macos-latest
...

窗户

jobs:
build:
runs-on: windows-latest
...

相关内容

  • 没有找到相关文章