【问题标题】:Selenium can't find element on Linux headless, but it can on Windows headless?Selenium 在 Linux headless 上找不到元素,但它可以在 Windows headless 上找到?
【发布时间】:2022-01-16 09:23:34
【问题描述】:

我在 Linux 机器上无头运行 Selenium,但它找不到特定元素。但是,我在 Windows 机器上运行完全相同的代码,它可以毫无问题地找到元素。我的 Linux 机器上有最新版本的驱动程序。任何想法如何解决这个问题?

options = Options()
options.add_argument('--no-sandbox')
options.add_argument("--headless")
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                     'Chrome/97.0.4692.71 Safari/537.36')
with webdriver.Chrome(options=options) as driver:
    driver.get(url)
    driver.find_element(By.ID, "btnhome").click()
    video = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.TAG_NAME, "video"))).get_attribute("src")

问题元素是视频元素。我也将等待时间增加到 2 分钟,仅用于调试。它在 Windows headless 上运行良好,但在 Linux headless 上找不到。

谢谢

【问题讨论】:

  • 您可以做的一个快速检查是禁用无头,让浏览器可见并查看问题发生在哪里。
  • 您可以尝试使用element_to_be_clickablevisibility_of_element_located 而不是presence_of_element_located,如果有帮助,请更新我们?
  • 我第二个@curisepandey。即使元素在背景中,元素的存在也会变为绿色,并且不一定在 DOM 中可见和可点击。
  • @AnandGautam 不幸的是 Linux 系统是一个非 GUI 系统,所以除非它是无头的,否则我无法运行它
  • 使用stackoverflow.com/a/6300672/7058266 应该可以帮助您解决问题。我将您需要的所有详细信息放在我发布的较长答案中。

标签: python python-3.x selenium


【解决方案1】:

解决方案涉及使用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 pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
# ...
options = Options()
options.add_argument('--no-sandbox')
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                     'Chrome/97.0.4692.71 Safari/537.36')
with webdriver.Chrome(options=options) as driver:
    driver.get(url)
    driver.find_element(By.ID, "btnhome").click()
    video = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.TAG_NAME, "video"))).get_attribute("src")
# ...
display.stop()

(根据需要进行修改,例如屏幕分辨率等)

有一些 Selenium Python 框架已经内置了虚拟显示(例如SeleniumBase,它通过添加的pytest 命令行参数激活虚拟显示:--xvfb。)每个框架都有内置功能可能会有所不同。

【讨论】:

  • 如果您使用此解决方案,请确保不要在无头模式下运行 Chrome。虚拟显示器应该允许您在无头环境中运行常规的有头 Chrome。
  • 我会试试这个。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2016-05-09
  • 2019-04-16
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多