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

时间:2011-03-20 19:10:06

标签: python selenium firefox webdriver

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

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

14 个答案:

答案 0 :(得分:61)

的Python

隐藏浏览器的最简单方法是install PhantomJS。然后,更改此行:

driver = webdriver.Firefox()

为:

driver = webdriver.PhantomJS()

您的其他代码不需要更改,也不会打开任何浏览器。出于调试目的,请在代码的不同步骤使用driver.save_screenshot('screen.png'),或者再次切换到Firefox webdriver。

在Windows上,您必须指定phantomjs.exe的路径:

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

爪哇

看一下Ghost Driver:How to run ghostdriver with Selenium using java


C#

How to hide FirefoxDriver (using Selenium) or put it in C#Form

答案 1 :(得分:16)

最后,我找到了那些使用Windows机器以任何方法运行测试的解决方案。好吧,实现不是Java,但你可以很容易地实现。

使用AutoIt工具。它具有处理窗口的所有功能。这是一个免费的工具。

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

  2. 打开编辑器并在下面编写代码 用于隐藏任何窗口。

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

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

    WinTitleMatchMode有不同的选项可用于匹配Windows标题。

    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)
    
  4. 所以,我所做的是:我创建了一个小程序的.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 :(得分:11)

我用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的环境中。首先,确保事情正在从命令行运行,如下所示:

$ export DISPLAY=:99
$ firefox

或只是

$ DISPLAY=:99 firefox

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

答案 3 :(得分:6)

只需添加以下代码即可。

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

答案 4 :(得分:4)

PhantomJS的默认浏览器是IE,但许多浏览器功能在那里不起作用。如果要打开无头(隐藏)Firefox窗口,可以使用new feature of Firefox 56+

使用此功能,您可以获得headless这样的驱动程序:

System.setProperty("webdriver.gecko.driver", firefoxDriverExePath);
FirefoxOptions options = new FirefoxOptions();
options.addArguments("--headless");
FirefoxDriver driver = new FirefoxDriver(options);

新版Chrome还具有headless选项。

答案 5 :(得分:3)

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

答案 6 :(得分:2)

如果您使用的是KDE桌面,则可以使Firefox Windows最初打开时最小化。对我来说这是关于这个问题的一天。只需执行以下操作:

  1. 打开Firefox
  2. 点击菜单栏左上角的Firefox图标 - >高级 - >特殊应用程序设置......
  3. 转到“尺寸和位置”标签。
  4. 点击“最小化”并选择“最初应用”(是)。
  5. 从现在开始,这些设置将适用于新的Firefox窗口,并且在使用Webdriver运行测试时,您不会再受到弹出窗口的困扰。

答案 7 :(得分:2)

Firefox有无头模式。如果你想使用它,你只需要在二进制选项上设置它,如下所示:

<p id="ex1" style="color: red;">red</p>
<p id="ex2">f</p>
<script type="text/javascript">
    var myElement = document.getElementById('ex1');
    if (myElement.style.color = red){
        document.getElementById('ex2').innerHTML = 'red';
    }
</script>

答案 8 :(得分:1)

爪哇

我在使用ChromeDriver时遇到了类似的问题(我需要在测试运行时最小化浏览器窗口)。我找不到更好的方法,所以我最终使用键盘组合Alt + Space,N来做到这一点。这应该仅适用于Windows,该示例使用Java AWT Robot类来播放键盘快捷键:

//Alt + Space to open the window menu
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_SPACE);
robot.keyRelease(KeyEvent.VK_SPACE);
robot.keyRelease(KeyEvent.VK_ALT);
Thread.sleep(200);

// miNimize
robot.keyPress(KeyEvent.VK_N);
robot.keyRelease(KeyEvent.VK_N);

答案 9 :(得分:1)

根据Stéphane的建议,我发现最简单的方法是使用PhantomJS。我下载了二进制文件并将phantomjs放在我的PATH中,在我的情况下(Mac OS)放在/ usr / bin /中。我喜欢保留选项,看看发生了什么,所以我把它包装成这样(在Python中):

def new_driver():
    if 'VISIBLE_WEBDRIVER' in os.environ:
        return webdriver.Firefox()
    else:
        return webdriver.PhantomJS()

参考文献:
http://blog.likewise.org/2013/04/webdriver-testing-with-python-and-ghostdriver/
http://www.realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/

答案 10 :(得分:1)

只需(Python):

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

答案 11 :(得分:1)

只需添加这些即可,如果您使用的是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')

答案 12 :(得分:0)

在Java中,您可以使用HtmlUnitDriver启动无头浏览器会话,该会话实际上不会打开浏览器。

将以下依赖项添加到您的pom.xml(或下载并参考以下内容):

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.15</version>
</dependency>

...并像测试WebDriver驱动程序一样测试它:

 driver = new HtmlUnitDriver();
 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
 driver.get("http://www.google.com");
 // etc..
 driver.quit();

SO中的另一个类似问题:Avoid opening browser on remote server during selenium call

答案 13 :(得分:0)

在选项中(Firefox选项,chrome选项)

通过调用set_headless方法将布尔无头设置为true。