我试图让 Selenium 在 EC2 机器上运行,但遇到了一个问题,当 VS Code 通过 SSH 连接进行连接时,该问题消失了。如果我仅使用终端进行连接,问题仍然存在。
我已经让 Selenium 通过一个简单的 Python 脚本工作,但遇到了一个问题,我希望在某些 EC2 机器上自动执行此操作。这是一个显示行为的示例脚本:
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
if __name__ == '__main__':
chrome_options = Options()
chrome_options.add_argument('--headless')
service = Service('/usr/bin/chromedriver')
driver = Chrome(service=service, options=chrome_options)
driver.get("https://example.com/")
print(driver.title)
driver.quit()
在终端上运行
python3 script.py
时效果很好。当 crontab 运行它时它也可以正常运行并且 SSH 连接仍然存在。但是,当此连接消失并且机器从未连接过 VS Code 时,它将退出并出现以下错误:
Traceback (most recent call last):
File "/usr/share/stratoverse/SCC/SCC/appScripts/selenium/proofOfWork.py", line 17, in <module>
driver = Chrome(service=service, options=chrome_options)
File "/home/ubuntu/.local/lib/python3.10/site-packages/selenium/webdriver/chrome/webdriver.py", line 45, in __init__
super().__init__(
File "/home/ubuntu/.local/lib/python3.10/site-packages/selenium/webdriver/chromium/webdriver.py", line 55, in __init__
self.service.start()
File "/home/ubuntu/.local/lib/python3.10/site-packages/selenium/webdriver/common/service.py", line 102, in start
self.assert_process_still_running()
File "/home/ubuntu/.local/lib/python3.10/site-packages/selenium/webdriver/common/service.py", line 115, in assert_process_still_running
raise WebDriverException(f"Service {self._path} unexpectedly exited. Status code was: {return_code}")
selenium.common.exceptions.WebDriverException: Message: Service /usr/bin/chromedriver unexpectedly exited. Status code was: 1
现在有趣的部分来了。如果您使用 VS Code 建立 SSH 连接,则所有后续运行都将正常工作,直到计算机终止。无论是否有活动的 SSH 连接,也无需更改任何(环境)变量或脚本。 Ubuntu 22.04 上出现这种情况,一开始我以为是
/home/ubuntu
文件夹被加密导致的,但事实并非如此。在不同位置安装 Selenium 也不能解决此问题,执行这些运行时的环境是相同的
所以我的问题是:VS Code 在连接时会做什么,而当终端连接到它时不会发生? (以及如何在不先连接到 WebDriver 的情况下欺骗 WebDriver 工作,目标是使用 crontab)
对于你的疑问,你可以这样理解。首先,VS Code 在远程计算机上安装一个小型服务器,用于在连接时与本地 vscode 进行通信。它设置的
DISPLAY
和 PATH
环境变量将影响程序在远程计算机上的运行方式。其次,在此过程中它会启动一个与非交互式 SSH 会话不同的新 shell 会话。然后,您可以检查环境变量是否与export PATH=$PATH:/sbin
一致。另外,您需要在终端中使用tail -f /path/to/chromedriver.log
查看ChromeDriver日志。您可以使用此文档来了解SSH远程开发。