У меня проблемы с 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()