【问题标题】:Running Selenium Webdriver in GitHub Actions for unit tests在 GitHub Actions 中运行 Selenium Webdriver 以进行单元测试
【发布时间】:2022-01-17 08:33:44
【问题描述】:

在部署我的 AWS Lambda 之前,我尝试在 GitHub 操作 中运行单元测试,我在其中运行 Selenium Webdriver一个正常工作的硒铬 λ 层 (https://github.com/vittorio-nardone/selenium-chromium-lambda)。我在 Python 3.6 中运行我的环境并使用 ChromeDriver 版本 95.0.4638.54

我在运行单元测试时一直遇到这个错误:

selenium.common.exceptions.WebDriverException: 
Message: unknown error: Chrome failed to start: exited abnormally. 
(chrome not reachable)

我使用了与运行 AWS Lambda 时相同的 Chrome 选项(有效):

lambda_options = [
    '--autoplay-policy=user-gesture-required',
    '--disable-background-networking',
    '--disable-background-timer-throttling',
    '--disable-backgrounding-occluded-windows',
    '--disable-breakpad',
    '--disable-client-side-phishing-detection',
    '--disable-component-update',
    '--disable-default-apps',
    '--disable-dev-shm-usage',
    '--disable-domain-reliability',
    '--disable-extensions',
    '--disable-features=AudioServiceOutOfProcess',
    '--disable-hang-monitor',
    '--disable-ipc-flooding-protection',
    '--disable-notifications',
    '--disable-offer-store-unmasked-wallet-cards',
    '--disable-popup-blocking',
    '--disable-print-preview',
    '--disable-prompt-on-repost',
    '--disable-renderer-backgrounding',
    '--disable-setuid-sandbox',
    '--disable-speech-api',
    '--disable-sync',
    '--disk-cache-size=33554432',
    '--hide-scrollbars',
    '--ignore-gpu-blacklist',
    '--ignore-certificate-errors',
    '--metrics-recording-only',
    '--mute-audio',
    '--no-default-browser-check',
    '--no-first-run',
    '--no-pings',
    '--no-sandbox',
    '--no-zygote',
    '--password-store=basic',
    '--use-gl=swiftshader',
    '--use-mock-keychain',
    '--single-process',
    '--headless']

for argument in lambda_options:
    chrome_options.add_argument(argument)

带有一些特定于 Lambda 的附加选项:

chrome_options.add_argument('--user-data-dir={}'.format(tmp_folder + '/user-data'))
chrome_options.add_argument('--data-path={}'.format(tmp_folder + '/data-path'))
chrome_options.add_argument('--homedir={}'.format(tmp_folder))
chrome_options.add_argument('--disk-cache-dir={}'.format(tmp_folder + '/cache-dir'))

chrome_options.binary_location = "/opt/bin/chromium"

最后,我要启动驱动了:

driver = webdriver.Chrome(options=chrome_options)

这在 Lambda 中运行良好,但每次我尝试在 GitHub 操作中运行单元测试时都会失败。

这是在 GitHub 操作中运行作业时的配置:

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.7
        uses: actions/setup-python@v2
        with:
          python-version: 3.7
      - name: Install dependencies
        run: |
        .......

      - name: Unit test
        run: |

          wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
          echo "deb http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee -a /etc/apt/sources.list.d/google-chrome.list
          sudo apt-get update -qqy
          sudo apt-get -qqy install google-chrome-stable
          CHROME_VERSION=$(google-chrome-stable --version)
          CHROME_FULL_VERSION=${CHROME_VERSION%%.*}
          CHROME_MAJOR_VERSION=${CHROME_FULL_VERSION//[!0-9]}
          sudo rm /etc/apt/sources.list.d/google-chrome.list
          export CHROMEDRIVER_VERSION=`curl -s https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION%%.*}`
          curl -L -O "https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip"
          unzip chromedriver_linux64.zip && chmod +x chromedriver && sudo mv chromedriver /usr/local/bin
          export CHROMEDRIVER_VERSION=`curl -s https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION%%.*}`
          curl -L -O "https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip"
          unzip chromedriver_linux64.zip && chmod +x chromedriver && sudo mv chromedriver /usr/local/bin
          chromedriver -version
          which chromedriver
          which google-chrome

配置完全取自 Selenium 自己 (https://github.com/SeleniumHQ/selenium/blob/selenium-4.0.0-beta-3/.github/actions/setup-chrome/action.yml) 在 GibHub 中的 Chrome 设置 操作,效果很好。

此 GitHub 操作配置使用的是最新的 ChromeDriver,因此我尝试过旧版本(如前所述的 95.0.4638.54)和最新版本(96.0.4664.45),但我仍然遇到相同的错误:

selenium.common.exceptions.WebDriverException: 
Message: unknown error: Chrome failed to start: exited abnormally. 
(chrome not reachable)

【问题讨论】:

    标签: python selenium-webdriver aws-lambda github-actions google-chrome-headless


    【解决方案1】:

    这是我需要添加到 Chrome 选项以使其正常工作的内容。

    首先添加一个远程调试端口

    chrome_options.add_argument('--remote-debugging-port=9222')
    

    然后我也把二进制位置改成了下面那个,binary_location选项是针对谷歌浏览器的:

    chrome_options.binary_location = "/usr/bin/google-chrome"
    

    最后,正如这个答案 (https://stackoverflow.com/a/60092331/6697714) 中提到的,我还在 Chrome 驱动程序中添加了一个可执行路径

    executable_path="/usr/local/bin/chromedriver"
    

    lambda 配置保持不变:

    lambda_options = [
        '--autoplay-policy=user-gesture-required',
        '--disable-background-networking',
        '--disable-background-timer-throttling',
        '--disable-backgrounding-occluded-windows',
        '--disable-breakpad',
        '--disable-client-side-phishing-detection',
        '--disable-component-update',
        '--disable-default-apps',
        '--disable-dev-shm-usage',
        '--disable-domain-reliability',
        '--disable-extensions',
        '--disable-features=AudioServiceOutOfProcess',
        '--disable-hang-monitor',
        '--disable-ipc-flooding-protection',
        '--disable-notifications',
        '--disable-offer-store-unmasked-wallet-cards',
        '--disable-popup-blocking',
        '--disable-print-preview',
        '--disable-prompt-on-repost',
        '--disable-renderer-backgrounding',
        '--disable-setuid-sandbox',
        '--disable-speech-api',
        '--disable-sync',
        '--disk-cache-size=33554432',
        '--hide-scrollbars',
        '--ignore-gpu-blacklist',
        '--ignore-certificate-errors',
        '--metrics-recording-only',
        '--mute-audio',
        '--no-default-browser-check',
        '--no-first-run',
        '--no-pings',
        '--no-sandbox',
        '--no-zygote',
        '--password-store=basic',
        '--use-gl=swiftshader',
        '--use-mock-keychain',
        '--single-process',
        '--headless',
    ]
    
    for argument in lambda_options:
        chrome_options.add_argument(argument)
    
    

    这是最终配置的样子:

    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--user-data-dir={}'.format(tmp_folder + '/user-data'))
    chrome_options.add_argument('--data-path={}'.format(tmp_folder + '/data-path'))
    chrome_options.add_argument('--homedir={}'.format(tmp_folder))
    chrome_options.add_argument('--disk-cache-dir={}'.format(tmp_folder + '/cache-dir'))
    chrome_options.add_argument('--remote-debugging-port=9222')
    
    chrome_options.binary_location = "/usr/bin/google-chrome"
    driver = webdriver.Chrome(options=chrome_options, executable_path="/usr/local/bin/chromedriver")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多