Браузер Splinter Headless не инициализируется в Airflow DAG

Я настраиваю веб-тест с использованием Splinter для автоматического запуска каждую неделю с помощью Airflow на удаленном компьютере с Ubuntu. При запуске в оболочке python на машине Ubuntu веб-тест работает нормально (дело не в том, что тест не работает), но при запуске в Airflow PythonOperator веб-тест не выполняется при запуске браузера Splinter.

Я вырезал все, кроме запуска браузера, и возникает та же ошибка. Я нашел несколько примеров и примеров использования Selenium Xvfb, но когда я реализовал тот же код для запуска и остановки виртуального дисплея, сообщение об ошибке не изменилось. Я попытался устранить параллелизм с помощью ограничений параллелизма в группе DAG, но ошибка не исчезла. Я также проверил версии своего geckodriver и firefox, и они кажутся нормальными (и они работают, когда не работают в воздушном потоке)

Это DAG:

def browser_test(queries, **context): 
    b = Browser("firefox", headless = True)
    b.visit('http://www.google.com')
    b.quit()

with DAG(
    dag_id = "web_test",
    start_date = datetime(2019, 1, 1),
    schedule_interval = None,
    concurrency=1,
    ) as dag: 

    PythonOperator(
    task_id = "run_pull", 
    python_callable = browser_test, 
    provide_context = True,
                            )

Возникающая ошибка довольно большая, поэтому я сократил ее до выданной команды и исходного исключения (здесь полно < / а>);

joe@Ubuntu-VM1:~/airflow$ sudo airflow test web_test run_pull "2019-01-01"

Original exception was:
Traceback (most recent call last):
  File "/usr/local/bin/airflow", line 32, in <module>
    args.func(args)
  File "/usr/local/lib/python3.6/dist-packages/airflow/utils/cli.py", line 74, in wrapper
    return f(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/airflow/bin/cli.py", line 660, in test
    ti.run(ignore_task_deps=True, ignore_ti_state=True, test_mode=True)
  File "/usr/local/lib/python3.6/dist-packages/airflow/utils/db.py", line 73, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/airflow/models/__init__.py", line 1542, in run
    session=session)
  File "/usr/local/lib/python3.6/dist-packages/airflow/utils/db.py", line 69, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/airflow/models/__init__.py", line 1441, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/usr/local/lib/python3.6/dist-packages/airflow/operators/python_operator.py", line 112, in execute
    return_value = self.execute_callable()
  File "/usr/local/lib/python3.6/dist-packages/airflow/operators/python_operator.py", line 117, in execute_callable
    return self.python_callable(*self.op_args, **self.op_kwargs)
  File "/home/joe/ftp/files/Documents/Projects/Airflow/dags/dev_airflow.py", line 233, in browser_test
    b = Browser("firefox", headless = True)
  File "/usr/local/lib/python3.6/dist-packages/splinter/browser.py", line 63, in Browser
    return driver(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/splinter/driver/webdriver/firefox.py", line 65, in __init__
    timeout=timeout, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 170, in __init__
    keep_alive=True)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 156, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 245, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 314, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: invalid argument: can't kill an exited process

И когда я просто запускаю python3, я могу импортировать файл DAG и запустить функцию browser_test без каких-либо ошибок.

Я ожидал, что DAG будет работать без каких-либо ошибок, и если я напечатаю b.title (), я ожидаю, что это будет «Google». Честно говоря, я ожидал, что все, что запущено в Airflow DAG, будет реагировать так же, как и в оболочке Python?


person JoeShmoe    schedule 15.07.2019    source источник


Ответы (1)


Не могли бы вы использовать BashOperator для запуска скрипта? Пример использования BashOperator:

t1 = BashOperator(
    task_id='web_test',
    bash_command='python web_test.run_pull()',
    dag=dag)

Что могло обойтись без запуска Splinter прямо в Airflow? Он не отвечает на вопрос, почему у вас возникла проблема, но может соответствовать вашим требованиям?

person Dove    schedule 15.07.2019
comment
run_pull - это только одна часть более длинного DAG, это единственная часть с ошибками, поэтому это больше, чем просто заставить ее запустить. Я просто изолировал его до наименьшего кода, необходимого для репликации. Сказав это, если оператор bash - единственный способ сделать это, тогда мне придется это делать именно так. Честно говоря, все еще кажется хаком, почему я не могу просто использовать оператор Python и заставить Splinter работать естественным образом? - person JoeShmoe; 15.07.2019
comment
ОБНОВЛЕНИЕ: я пробовал использовать оператор bash, и возникла та же ошибка, но на этот раз в выводе оператора bash. - person JoeShmoe; 16.07.2019