如何在 wsl2 上从 python3 运行 Selenium ChromeDriver?

Posted

技术标签:

【中文标题】如何在 wsl2 上从 python3 运行 Selenium ChromeDriver?【英文标题】:How to run Selenium ChromeDriver from python3 on wsl2? 【发布时间】:2020-11-27 03:28:32 【问题描述】:

我正在尝试使用 python 3 从 WSL2(Ubuntu 18.04)无头打开 Chrome。

在 Windows 上,我使用的是 Chrome 84。我从 ChromeDriver - WebDriver for Chrome 下载了 Chrome 驱动程序 84。并在 C:\ChromeDriver\chromedriver.exe 下安装了.exe

我已经设置了一个从我的 Windows Chrome 和 ChromeDriver 到 WSL2 的符号链接:

sudo ln -s '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe' /usr/bin/google-chrome
sudo ln -s /mnt/c/ChromeDriver/chromedriver.exe /usr/bin/chromedriver

两个 Chrome 都设置为可由 WSL2 上的任何用户执行。

在 WSL2 上,当我进入控制台时:

google-chrome --use-gl=swiftshader

Chrome 在 Windows 上启动。

这是我的脚本:

from selenium import webdriver
browser = webdriver.Chrome()    # fails
# browser = webdriver.Chrome('/usr/bin/chromedriver') fails
# browser = webdriver.Chrome('/mnt/c/ChromeDriver/chromedriver.exe') fails
browser.get('https://***.com')

失败并出现错误:

raise WebDriverException("无法连接到服务 %s" % self.path)selenium.common.exceptions.WebDriverException:消息:可以 未连接到服务 chromedriver(* 或 /usr/bin/chromedriver 或 /mnt/c/ChromeDriver/chromedriver.exe,具体取决于我如何启动 webdriver.Chrome())

如何使用 python3 和 selenium 从 WSL2 启动 Chrome 驱动程序?

【问题讨论】:

您找到解决方案了吗? @LuísCosta 您在其他地方提到您从下面的答案中尝试过this link。当您尝试安装 Linux 版 Chrome 时发生了什么?我建议跟进该路径,因为正如我在另一条评论中提到的那样,该链接中提到的localhost 问题将阻止您以 WSL1 方式执行此操作(您和此 OP 似乎都是试)。作为一种可能的替代方法,有没有办法更改 Selenium 尝试连接的主机/端口? 我创建了一个新的 WSL 副本(以消除可能的错误配置),点击下面的链接并没有成功,无论我尝试什么我总是最终得到:消息:未知错误:Chrome启动失败:异常退出。 (未知错误:DevToolsActivePort 文件不存在)(从 chrome 位置 /usr/bin/google-chrome 启动的进程不再运行,所以 ChromeDriver 假设 Chrome 已崩溃由于您指出的问题,已经放弃了以前的方法出来:) @LuísCosta 不要忘记在回复中标记我 - 否则我不会收到通知(除非这是我的问题或答案)。只记得在我们上次就您的其他问题进行交流后回来查看!让我看看我是否可以设置它。自从我在 WSL2 上尝试 ChromeDriver 以来已经有一年了,我不记得我最终在哪里结束了。 @LuísCosta 你还在做这个吗?我能够通过 (a) 按照these steps 安装 xrdp (尽管这与为最终结果安装 X 服务器应该没有什么不同),然后 (b) 按照下面答案中链接的说明来完成这项工作.如果您仍想解决此问题,您可以发送command -v chromedrivercommand -v google-chrome 并发布结果吗?谢谢! 【参考方案1】:

我认为这是不可能的。你在这里是在 Linux 下,所以你不能使用 Windows 可执行文件。

我尝试使用无头版本的 Chromium,但它不起作用,因为(似乎)Q

【讨论】:

可以根据 Windows 的官方文档从 WSL 2 运行 Windows 可执行文件:link。 “WSL 可以使用 [tool-name].exe 直接从 WSL 命令行运行 Windows 工具。例如,notepad.exe ......在 WSL 中运行的 Windows 可执行文件的处理方式与本机 Linux 可执行文件类似——管道、重定向甚至后台工作按预期工作。”【参考方案2】:

您可以通过给定的代码安装 chromedrive。

wget -N http://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
chmod +x chromedriver
sudo mv -f chromedriver /usr/local/share/chromedriver
sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver

如果你没有使用给定的代码,你确实需要 chrome。

wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | sudo tee /etc/apt/sources.list.d/google-chrome.list
sudo apt-get update 
sudo apt-get install google-chrome-stable

我可能会遗漏一些东西,请参阅参考网站。 参考:https://www.srcmake.com/home/selenium-python-chromedriver-ubuntu

获得 selenium 和 chrome 驱动程序后,您可以将给定的代码用于无头 chrome。此外,还有一个名为“chromedriver_autoinstaller”的软件包,我不确定它是否适用于 ubuntu,但如果您每天都使用相同的脚本并且您的浏览器处于自动更新状态,那么它是一个很棒的软件包。

无头镀铬代码:

#for headless browser use this arguments
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920x1080")
driver = webdriver.Chrome(chrome_options=chrome_options)

如果您使用路径和其他条件,请在 webdriver.Chrome 中添加必要的参数。

【讨论】:

【参考方案3】:

对于那些尚未找到解决方案的人。 遵循本教程:chromedriver in WSL2 许多都是相似的,但对我来说,诀窍是将 chromedriver 放在相应的组和用户中:

sudo chown root:root /usr/bin/chromedriver

【讨论】:

在您链接到的 Greg Brisebois 的教程中,他从 resolve.conf 文件中对名称服务器条目进行 greps 的行实际上返回了我的 DHCP 服务器的 IP 地址,而不是Windows 主机 @ChillyPenguin 我无法告诉您您可能遇到什么错误,也许您正在关联 IP 地址,并且您认为它来自 DHCP,在我的情况下,Windows 主机的地址在不断变化,有时它从 172 开始,有时从 192 开始。另一方面,我必须在打开 xlaunch 和 IDE(在我的情况下为 VS Code)之前配置 DISPLAY 变量,以便它可以运行。最终纠正您的特定情况可能会在另一篇文章中找到。 我只想添加对我有用的内容,以便帮助遇到同样问题的其他人。 1.我按照上面答案中提到的教程在我的 WSL 中安装了 Chrome 和 Chrome 驱动程序。我没有安装 X 服务器。 2. 在我的测试代码中,我有以下两行使测试无头。 options = webdriver.ChromeOptions() options.headless = True 我希望这会有所帮助。

以上是关于如何在 wsl2 上从 python3 运行 Selenium ChromeDriver?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上运行多个 WSL2 实例?

ImportError : 无法在 linux 上从 <module> 导入名称 <method>

如何从 Docker 容器内部访问在 WSL2 上运行的服务?

如何在 PyGame 画布上从 PyRealSense2 绘制视频帧?

如何使用 127.0.0.1 从 Windows 主机访问在 WSL2 中运行的服务?

如何将在 WSL2 中运行的 Android Studio 与连接的设备或在主机上运行的 android 模拟器连接起来