如何隐藏Firefox窗口(Selenium WebDriver)?

53

当我同时执行多个测试时,我不想让Firefox浏览器窗口可见。我可以使用selenium.minimizeWindow()将其最小化,但我不想这样做。

有没有办法隐藏Firefox窗口?我正在使用FireFox WebDriver。


14个回答

74

Python

隐藏浏览器最简单的方法是安装PhantomJS。然后,修改这一行:

driver = webdriver.Firefox()

to:

driver = webdriver.PhantomJS()

您的代码其余部分无需更改,也不会打开任何浏览器。为了调试,请在代码的不同步骤中使用driver.save_screenshot('screen.png')或切换回Firefox webdriver。

在Windows上,您需要指定phantomjs.exe的路径:

driver = webdriver.PhantomJS('C:\phantomjs-1.9.7-windows\phantomjs.exe')

Java

可以看一下Ghost Driver:如何使用Java运行Selenium的Ghost Driver


C#

如何在PhantomDriver(无头浏览器)中隐藏FirefoxDriver(使用Selenium),而不会出现findElement函数错误?


7
除非你的代码特别依赖于Firefox浏览器及其配置选项,否则你的其余代码无需更改。 - Darren Ringer
1
@TejeshRaut 我不确定。看起来你遇到了特定的问题。我建议尝试减少代码量,以便重现问题,并发布一个新的问题。 - Stéphane Bruckert
6
这个问题特别涉及在Firefox中使用WebDriver。PhantomJS是一个完全不同的浏览器,目前不支持像CSS flexbox或WebGL这样的新网页功能。 - Anko
1
PhantomJS已被弃用,转而使用Headless Chrome(ium)。 - ivan_pozdeev
11
更新: UserWarning: Selenium 对于 PhantomJS 的支持已被弃用,请改用 Chrome 或 Firefox 的 headless 版本 - Lal
显示剩余2条评论

30

只需添加以下代码。

import os
os.environ['MOZ_HEADLESS'] = '1'
driver = webdriver.Firefox()

2
正如另一个答案所指出的那样,这是一个新功能自Firefox 56以来 - dequis

16

最终我找到了解决方案,适用于使用Windows机器运行任何测试的人们。虽然实现不是用Java,但你可以很容易地做到。

使用AutoIt 工具。它拥有处理Windows的所有功能,并且是免费的工具。

  1. 安装AutoIt: http://www.autoitscript.com/site/autoit/downloads/

  2. 打开编辑器并编写以下代码 隐藏任何窗口。

AutoItSetOption("WinTitleMatchMode", 2)
WinSetState("Title Of Your Window", "", @SW_HIDE) 
  • 要取消隐藏,您可以使用以下代码行。

  • AutoItSetOption("WinTitleMatchMode", 2)
    WinSetState("Title Of Your Window", "", @SW_SHOW)
    

    WinTitleMatchMode 有不同的选项可以用来匹配窗口标题。

    1 = Match the title from the start (default)`
    2 = Match any substring in the title
    3 = Exact title match
    4 = Advanced mode, see Window Titles & Text (Advanced)
    
    所以,我所做的是:我创建了一个小程序的.exe文件,并将参数作为命令行参数传递,如下所示。
    Runtime.getRuntime().exec("C:/Diiinnovation/HideNSeek.exe 0 \"" + "Mozilla Firefox" + "\"");
    

    下面是我在HideNSeek.exe中使用的AutoIt代码:

    AutoItSetOption("WinTitleMatchMode", 1) 
    
    if $CmdLine[0] > 0 Then
        if $CmdLine[1] == 0 Then
            WinSetState($CmdLine[2], "", @SW_HIDE)    
        ElseIf $CmdLine[1] == 1 Then
            WinSetState($CmdLine[2], "", @SW_SHOW)          
        Else    
        EndIf   
    EndIf
    

    $CmdLine[] 是一个数组,包含所有命令行参数...

    $CmdLine[0] = number of Parameter
    $CmdLine[1] = 1st Parameter after Exe Name 
    ...
    

    如果窗口标题中有任何空格,则必须使用双引号将其作为命令行参数传递,如上所示。

    下面的代码行将执行AutoIt exe,如果我在第一个参数中传递'0',则它将隐藏窗口,如果我传递'1',则它将显示与标题匹配的窗口。

    Runtime.getRuntime().exec("C:/Diiinnovation/HideNSeek.exe 0 \"" + "Mozilla Firefox" + "\"");
    

    我希望这能对你有所帮助。谢谢!


    2
    这种方法的一个问题是隐藏窗口仍然会从你正在做的任何事情中夺走焦点。它不再混乱执行,但它使得尝试输入变得非常困难。 - 110SidedHexagon
    我不知道你在说什么!我没听懂,抱歉! - Paresh
    2
    我使用了这种方法来隐藏Chrome浏览器,以运行一个程序,该程序从网站下载文件并将数据编译成Excel表格。当程序运行时,在隐藏的浏览器中单击按钮和填写文本框时,我注意到它会从Web驱动程序执行操作时窃取焦点。例如,如果程序正在运行,并且我想输入电子邮件,我可以开始输入,但在某个时候,窗口将失去焦点,我将不再在电子邮件窗口中输入,而是在隐藏的浏览器窗口中输入。 - 110SidedHexagon

    15

    只需执行(Python):

    opts = webdriver.FirefoxOptions()
    opts.headless = True
    firefox = webdriver.Firefox(options=opts)
    

    13

    我使用xvfb解决了这个问题。

    首先,安装Xvfb:

    # apt-get install xvfb
    

    在Debian/Ubuntu上;或者

    # yum install xorg-x11-Xvfb
    

    在Fedora/RedHat上,选择一个不太可能碰撞的显示器编号(即使您稍后添加了一个真正的显示器)- 像99这样高的编号应该可以。在此显示器上运行Xvfb,并关闭访问控制:

    # Xvfb :99 -ac
    

    现在在运行Selenium服务器之前,您需要确保您的显示设置为99(它本身会启动浏览器)。最简单的方法是将DISPLAY:= 99导出到Selenium的环境中。首先,请确保从命令行按如下方式工作:

    现在你需要确保在运行Selenium服务器之前将你的显示器设置为99(服务器本身会启动浏览器)。最简单的方法是将DISPLAY=:99导出到Selenium的环境变量中。首先,确保从命令行正常运行Selenium:

    $ export DISPLAY=:99
    $ firefox
    

    或者只是

    $ DISPLAY=:99 firefox
    

    下面有一个链接帮助了我
    http://www.alittlemadness.com/2008/03/05/running-selenium-headless/


    使用xvfb-run(至少在Ubuntu上是xvfb软件包的一部分)更加简单:xvfb-run firefox - David Röthlisberger

    9
    PhantomJS的默认浏览器是IE,尽管许多浏览器功能在那里无法工作。如果您想要打开一个无头Firefox窗口,可以使用 Firefox 56+的新功能。使用此功能,您可以像这样获取headless驱动程序:
    System.setProperty("webdriver.gecko.driver", firefoxDriverExePath);
    FirefoxOptions options = new FirefoxOptions();
    options.addArguments("--headless");
    FirefoxDriver driver = new FirefoxDriver(options);
    

    新版本的Chrome也具有headless选项。

    8

    只需添加这些代码,如果您使用Chrome浏览器则会生效,在Firefox中也很有用。

    from selenium.webdriver.chrome.options import Options
    '''option to make driver work background'''
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    

    4

    火狐浏览器有一个无头模式,如果你想使用它,只需要在二进制选项中设置如下:

    binary = FirefoxBinary("C:/Program Files/Mozilla Firefox/firefox.exe")
    options = webdriver.FirefoxOptions()
    # set headless mode on
    options.set_headless(True) 
    driver = webdriver.Firefox(firefox_binary=binary,options=options)
    

    4
    如果您正在使用 Selenium RC 或 Remote WebDriver,则可以在远程或虚拟机器上运行浏览器实例。这意味着您不必担心隐藏浏览器窗口,因为它们不会在本地计算机上启动。

    我没有使用远程 Web 驱动程序;而且我的客户要求所有东西都在一台机器上,所以他们想要隐藏浏览器。难道没有办法隐藏浏览器吗? - Paresh
    那么,真的没有其他方法可以隐藏Firefox吗?:(.. HtmlUnitDriver可以帮助,但我不想使用它。 - Paresh

    3
    如果你使用KDE桌面环境,你可以让Firefox窗口在初始打开时处于最小化状态,这对于解决这个问题对我非常有帮助。只需按照以下步骤操作:
    1. 打开Firefox
    2. 点击菜单栏左上角的Firefox图标 ->高级 ->特殊应用程序设置...
    3. 进入“大小和位置”选项卡。
    4. 点击“最小化”,选择“初始应用”(是)。
    这些设置将应用于新的Firefox窗口,从现在开始,当使用Webdriver运行测试时,你将不再被弹出窗口所困扰。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接