Chrome 如何修复在无头浏览器(Selenium Python)中无法点击的元素?

pgky5nke  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(289)

对于上下文,我正在研究一种方法,可以自动从公司的预订引擎中获取特定的信息。我使用selenium登录预订引擎,并导航到相关页面以获取我想要的信息。我希望能够做到这一点,而不打开一个实际可见的浏览器窗口。
我一直在使用一个可见的浏览器,目的是帮助我在运行代码时看到代码在做什么,从而更容易修复错误。然而,当我试图用一个无头浏览器运行它时,我突然得到一个元素不可交互的异常。下面是我的代码的相关部分。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

option = webdriver.ChromeOptions()
option.add_argument('headless')

driver = webdriver.Chrome(ChromeDriverManager().install(), options=option)

我的代码和以前的完全一样。我唯一改变的是在选项中增加了“无头”参数。有人知道为什么这会导致一些元素不能交互以及如何修复它吗?

o2g1uqev

o2g1uqev1#

解决这个问题的方法是使用https://github.com/ponty/PyVirtualDisplay在Linux等无头环境中模拟有头显示器。(这可以帮助您解决只有在使用无头浏览器加载网站时才可能出现的问题。)虚拟显示器使用Xvfb,实际上这里有一个非常流行的Stack Overflow解决方案:https://stackoverflow.com/a/6300672
以下是针对您的情况的先前解决方案的摘要:
要安装:

pip install pyvirtualdisplay

以下是如何在Python代码中使用它:

from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
# display is active / Run your selenium code
# ----------
display.stop()
# display is stopped

将所有这些与代码放在一起后,它看起来像这样:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))
display.start()
# ...
option = webdriver.ChromeOptions()
driver = webdriver.Chrome(ChromeDriverManager().install(), options=option)
# ...
display.stop()

(Make必要的修改,例如屏幕分辨率等)
有一些Selenium Python框架已经内置了虚拟显示(例如SeleniumBase,它通过添加的pytest命令行arg激活虚拟显示:--xvfb .)每个具有内置特性的框架可能会做一些不同的事情。
如果你使用这个解决方案,一定不要在无头模式下运行Chrome。虚拟显示器应该可以让你在无头环境中运行一个普通的有头Chrome。

相关问题