Селен [в питоне]: хромедривер без головы часто становится недоступным - PullRequest
0 голосов
/ 02 апреля 2020

У меня проблемы с selenium; chromedriver очень часто вылетает в моем скрипте. Иногда сценарий завершается успешно и печатает заголовок страницы в соответствии с запросом (см. Ниже).

Когда происходит сбой сценария, я получаю следующую ошибку: chrome not reachable.

Я использую следующее в Ubuntu 18.04.4 (WSL) с Python 3.7.6:

  • xvfb == 2: 1.19.6-1ubuntu4.4
  • chromedriver == 80.0. 3987.149-0ubuntu0.18.04.1
  • PyVirtualDisplay == 0.2.5
  • селен == 3.141.0

Я пробовал много разных вещей, таких как изменение бэкэнд (Xvfb и Xvn c), настройка chromedriver аргументов командной строки, добавление условий ожидания селена / тайм-ауты; однако, похоже, ничто не удерживает chromedriver от сбоя.

Как сделать так, чтобы приведенный ниже скрипт надежно извлекал https://www.cisco.com/ с chrome?

I'm используя следующий скрипт (сохраненный как chrome_test.py):

import time
import sys
import os

from pyvirtualdisplay.xvnc import XvncDisplay
from pyvirtualdisplay.xvfb import XvfbDisplay

from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver

def build_display(backend='xvfb', bgcolor='black', color_bits=24,
    width=1280, height=800):
    assert backend=='xvfb' or backend=='xvnc'
    assert bgcolor=='black' or bgcolor=='white'

    if backend=='xvfb':
        display = XvfbDisplay(bgcolor=bgcolor, color_depth=color_bits,
            size=(width, height))

    elif backend=='xvnc':
        display = XvncDisplay(rfbport='5900', bgcolor=bgcolor,
            color_depth=color_bits, size=(width, height))

    else:
        raise ValueError("Invalid display backend: '{}'".format(backend))

    display.start()
    return display

def firefox_driver():
    """Return the firefox_driver"""
    # Add some firefox startup options
    f_opt = FirefoxOptions()
    f_opt.add_argument('--window-size=800x600')
    f_opt.add_argument('--safe-mode')
    f_opt.add_argument('--headless')

    driver = webdriver.Firefox(firefox_binary='/usr/bin/geckodriver', options=f_opt)
    return driver

def chrome_driver():
    """Return the chrome_driver"""
    # Add some chrome startup options
    c_opt = ChromeOptions()
    c_opt.add_argument('--window-size=800x600')
    #c_opt.add_argument('--log-level=DEBUG')
    #c_opt.add_argument('--log-path=/tmp/chrome.log')
    c_opt.add_argument('--disable-extensions')
    c_opt.add_argument('--no-sandbox')
    c_opt.add_argument('--disable-dev-shm-usage')
    c_opt.add_argument('--disable-gpu')
    c_opt.add_argument('--headless')

    cmd = '/usr/bin/chromium-browser'
    cmd = '/usr/bin/chromedriver'
    cmd = '/usr/lib/chromium-browser/chromedriver'
    driver = webdriver.Chrome(options=c_opt, executable_path=cmd)
    return driver

display = build_display(backend='xvfb')

try:
    driver = chrome_driver()
    print("Browser started")
    #driver.set_window_position(10, 10)
    #driver.set_page_load_timeout(100)
    #driver.set_script_timeout(40)
    #driver.implicitly_wait(10)

    driver.get('https://www.cisco.com/')
    wait = WebDriverWait(driver, 10)
    wait.until(expected_conditions.title_contains(('Cisco')))
    print("Got page title: "+driver.title)
except Exception as ee:
    print("ERROR: "+str(ee))
    sys.exit(1)

driver.quit()
display.stop()
...