Я настраиваю веб-тест с использованием 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?