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

Posted

技术标签:

【中文标题】如何隐藏 Firefox 窗口(Selenium WebDriver)?【英文标题】:How to hide Firefox window (Selenium WebDriver)? 【发布时间】:2011-07-19 06:01:34 【问题描述】:

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

有什么方法可以隐藏 Firefox 窗口吗?我正在使用 FireFox WebDriver。

【问题讨论】:

非常相关(对于其他浏览器):Can Selenium WebDriver open browser windows silently in the background? -- 包含this answer which uses pyvirtualdisplay, which is not mentioned here。 【参考方案1】:

Python

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

driver = webdriver.Firefox()

到:

driver = webdriver.PhantomJS()

您的其余代码无需更改,也不会打开任何浏览器。出于调试目的,请在代码的不同步骤中使用driver.save_screenshot('screen.png'),或者只是再次切换到 Firefox 网络驱动程序。

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

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

Java

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


C#

How to hide FirefoxDriver (using Selenium) without findElement function error in PhantomDriver(headless browser)?

【讨论】:

'其余代码不需要更改' - 当然,除非它特别依赖于 Firefox 浏览器及其配置选项。 @TejeshRaut 我不知道。看起来你有一个特定的问题。我会尽量减少重现问题所需的代码量并发布新问题。 -1 这个问题专门关于使用 WebDriver for Firefox。 PhantomJS 是一个完全不同的浏览器,目前不支持 CSS flexbox 或 WebGL 等较新的 Web 功能。 PhantomJS has been abandoned in favor of Headless Chrome(ium). 更新:UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead【参考方案2】:

只需添加以下代码。

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

【讨论】:

另一个答案指出,这是一个新功能since firefox 56【参考方案3】:

最后,我找到了适合那些使用 windows Machine 以使用任何方法运行测试的解决方案。好吧,实现不是在 Java 中,但你可以很容易地做到这一点。

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

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

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

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

    要取消隐藏它,您可以使用下面的代码行。

    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)
    

所以,我所做的是:我创建了一个小程序的 .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" + "\"");

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

【讨论】:

这种方法的一个问题是隐藏的窗口仍然会从你正在做的事情中转移焦点。它不会再搞乱执行,但它会使尝试打字变得非常困难。 我不知道你想说什么!没听懂,对不起! 我使用这种方法隐藏 Chrome 浏览器以运行从网站下载文件并将数据编译成 Excel 表单的程序。当程序运行时,在隐藏的浏览器中单击按钮并填充文本框,我注意到当它使用 Web 驱动程序执行操作时,它会从我所在的任何窗口中窃取焦点。例如,如果程序正在运行,并且我想输入一封电子邮件,我可以开始输入,但有时窗口会失去焦点,我将不再在电子邮件窗口中输入,而是在隐藏的浏览器窗口中输入。 【参考方案4】:

我用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/

【讨论】:

使用 xvfb-run(至少在 Ubuntu 上是 xvfb 包的一部分)更容易:xvfb-run firefox【参考方案5】:

只要做(Python):

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

【讨论】:

【参考方案6】:

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 选项。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

我没有使用远程网络驱动程序;我的客户要求是在一台机器上拥有所有东西,所以他们想要隐藏浏览器。有没有办法隐藏浏览器? 那么现在真的有其他解决方案可以隐藏 Firefox 吗? :(.. htmlUnitDriver 可以提供帮助,但我不想使用它。【参考方案9】:

Firefox 有一个无头模式。如果你想使用它,你只需要像这样在二进制选项上设置它:

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)

【讨论】:

【参考方案10】:

如果您使用的是 KDE 桌面,您可以使最初打开的 Firefox Windows 最小化。这让我对这个问题感到满意。只需执行以下操作:

    打开火狐 点击菜单栏左上角的 Firefox 图标 -> 高级 -> 特殊应用程序设置... 转到“尺寸和位置”标签。 点击“最小化”并选择“最初应用”(YES)。

从现在开始,这些设置将适用于新的 Firefox 窗口,并且在使用 Webdriver 运行测试时,您将不再被弹出窗口所困扰。

【讨论】:

【参考方案11】:

根据 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/

【讨论】:

【参考方案12】:

Java

我在使用 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);

【讨论】:

【参考方案13】:

在 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

【讨论】:

【参考方案14】:

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

通过调用 set_headless 方法将 boolean headless 设置为 true。

【讨论】:

以上是关于如何隐藏 Firefox 窗口(Selenium WebDriver)?的主要内容,如果未能解决你的问题,请参考以下文章

带有 java 关键字的机器人框架:Selenium.open(..) 以隐藏模式打开 Firefox 浏览器

Selenium 调出Firefox后不继续运行脚本了

在 Python 中使用 Selenium 下载文件:即使设置了 Firefox 配置文件,下载窗口也会打开

java+selenium+new——启动带有用户配置信息的Firefox浏览器窗口

selenium 怎么获取当前窗口的标题

如何使用 Selenium WD 为不同的浏览器类型打开隐身/私人窗口?