【发布时间】:2011-07-19 06:01:34
【问题描述】:
当我同时执行多个测试时,我不想让 Firefox 浏览器窗口保持可见。我可以使用 selenium.minimizeWindow() 将其最小化,但我不想这样做。
有什么方法可以隐藏 Firefox 窗口吗?我正在使用 FireFox WebDriver。
【问题讨论】:
标签: python selenium firefox webdriver
当我同时执行多个测试时,我不想让 Firefox 浏览器窗口保持可见。我可以使用 selenium.minimizeWindow() 将其最小化,但我不想这样做。
有什么方法可以隐藏 Firefox 窗口吗?我正在使用 FireFox WebDriver。
【问题讨论】:
标签: python selenium firefox webdriver
隐藏浏览器最简单的方法是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')
看看Ghost Driver:How to run ghostdriver with Selenium using java
C#【讨论】:
flexbox 或 WebGL 等较新的 Web 功能。
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
只需添加以下代码。
import os
os.environ['MOZ_HEADLESS'] = '1'
driver = webdriver.Firefox()
【讨论】:
最后,我找到了适合那些使用 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" + "\"");
我希望这会对你有所帮助。谢谢!
【讨论】:
我用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。
只要做(Python):
opts = webdriver.FirefoxOptions()
opts.headless = True
firefox = webdriver.Firefox(options=opts)
【讨论】:
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 选项。
【讨论】:
只需添加这些,如果您使用的是 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')
【讨论】:
如果您使用 Selenium RC 或 Remote WebDriver,则可以在远程或虚拟机上运行浏览器实例。这意味着您不必担心隐藏浏览器窗口,因为它们不会在您的本地计算机上启动。
【讨论】:
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)
【讨论】:
如果您使用的是 KDE 桌面,您可以使最初打开的 Firefox Windows 最小化。这让我对这个问题感到满意。只需执行以下操作:
从现在开始,这些设置将适用于新的 Firefox 窗口,并且在使用 Webdriver 运行测试时,您将不再被弹出窗口所困扰。
【讨论】:
根据 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/
【讨论】:
我在使用 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);
【讨论】:
在 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
【讨论】:
在选项中(Firefox 选项、chrome 选项)
通过调用 set_headless 方法将 boolean headless 设置为 true。
【讨论】: