Python Splinter无头浏览器未在气流DAG内初始化

Python Splinter无头浏览器未在气流DAG内初始化,python,selenium,airflow,splinter,Python,Selenium,Airflow,Splinter,我正在使用Splinter设置一个web测试,每周在远程Ubuntu机器上通过气流自动运行。当在Ubuntu机器上的python外壳中运行时,web测试运行得很好(这不是因为测试失败),但是当在Airflow PythonOperator中运行时,web测试在启动Splinter浏览器时失败 除了浏览器启动,我已经切断了一切,同样的错误正在发生。我发现,但是当我实现了相同的代码来启动和停止虚拟显示时,错误消息没有改变。我曾尝试通过在DAG上使用并发限制来删除并行性,但错误仍然存在。我还检查了ge

我正在使用Splinter设置一个web测试,每周在远程Ubuntu机器上通过气流自动运行。当在Ubuntu机器上的python外壳中运行时,web测试运行得很好(这不是因为测试失败),但是当在Airflow PythonOperator中运行时,web测试在启动Splinter浏览器时失败

除了浏览器启动,我已经切断了一切,同样的错误正在发生。我发现,但是当我实现了相同的代码来启动和停止虚拟显示时,错误消息没有改变。我曾尝试通过在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气流测试web\u测试运行\u拉动“2019-01-01”
最初的例外是:
回溯(最近一次呼叫最后一次):
文件“/usr/local/bin/afflow”,第32行,在
args.func(args)
包装器中的文件“/usr/local/lib/python3.6/dist-packages/afflow/utils/cli.py”,第74行
返回f(*args,**kwargs)
文件“/usr/local/lib/python3.6/dist-packages/afflow/bin/cli.py”,第660行,测试中
ti.run(ignore\u task\u deps=True,ignore\u ti\u state=True,test\u mode=True)
文件“/usr/local/lib/python3.6/dist-packages/afflow/utils/db.py”,第73行,在包装器中
返回函数(*args,**kwargs)
文件“/usr/local/lib/python3.6/dist-packages/afflow/models/__-init___.py”,第1542行,运行中
会话=会话)
文件“/usr/local/lib/python3.6/dist-packages/afflow/utils/db.py”,第69行,在包装器中
返回函数(*args,**kwargs)
文件“/usr/local/lib/python3.6/dist-packages/afflow/models/__-init___;.py”,第1441行,在原始任务中
结果=任务\复制.执行(上下文=上下文)
文件“/usr/local/lib/python3.6/dist-packages/afflow/operators/python_operator.py”,执行中的第112行
return\u value=self.execute\u callable()
文件“/usr/local/lib/python3.6/dist-packages/afflow/operators/python\u operator.py”,第117行,在execute\u callable中
返回self.python_可调用(*self.op_参数,**self.op_参数)
文件“/home/joe/ftp/files/Documents/Projects/afflow/dags/dev_afflow.py”,第233行,浏览器测试中
b=浏览器(“firefox”,headless=True)
文件“/usr/local/lib/python3.6/dist-packages/splinter/browser.py”,第63行,在浏览器中
返回驱动器(*args,**kwargs)
文件“/usr/local/lib/python3.6/dist-packages/splinter/driver/webdriver/firefox.py”,第65行,在__
超时=超时,**kwargs)
文件“/usr/local/lib/python3.6/dist-packages/selenium/webdriver/firefox/webdriver.py”,第170行,在__
使_保持活动状态=真)
文件“/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py”,第156行,在__
启动会话(功能、浏览器配置文件)
文件“/usr/local/lib/python3.6/dist packages/selenium/webdriver/remote/webdriver.py”,第245行,在启动会话中
响应=self.execute(Command.NEW_会话,参数)
文件“/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py”,执行中第314行
self.error\u handler.check\u响应(响应)
文件“/usr/local/lib/python3.6/dist packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.WebDriverException:消息:无效参数:无法终止已退出的进程
当运行python3时,我能够导入DAG文件并运行函数browser\u测试,没有任何错误


我希望DAG运行时不会抛出任何错误,如果我打印b.title(),我希望它是“Google”。老实说,我希望在Airflow DAG中运行的任何东西的反应都与在Python shell中运行时一样?

您能使用Bash操作符来运行脚本吗?使用bash操作符的一个示例是

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

可以直接在气流中绕过碎片吗?它没有回答您为什么会遇到问题,但可能符合您的要求?

您可以使用BashOperator来运行脚本吗?使用bash操作符的一个示例是

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

可以直接在气流中绕过碎片吗?它没有回答您为什么会遇到问题,但可能符合您的要求?

run\u pull只是较长DAG的一部分,它是唯一出错的部分,因此它不仅仅是让DAG运行。我刚刚将其隔离到复制所需的最小代码中。也就是说,如果bash操作符是唯一的方法,那么我就必须这样做。老实说,我仍然感觉像是一个黑客,为什么我不能直接使用Python操作符并让Splinter自然运行呢?更新:我尝试过使用bash操作符,但这次在bash操作符输出中发生了相同的错误。run_pull只是较长DAG的一部分,它是唯一的错误部分,所以它不仅仅是让它运行。我刚刚将其隔离到复制所需的最小代码中。也就是说,如果bash操作符是唯一的方法,那么我就必须这样做。老实说,我仍然感觉像是一个黑客,为什么我不能直接使用Python操作符并让Splinter自然运行呢?更新:我尝试过使用bash操作符,但这次在bash操作符输出中出现了相同的错误。