Selenium Webdriver可以在后台静默打开浏览器窗口吗?


161

我有一个硒测试套件,可以运行许多测试,并且在每个新测试中,它都会在我打开的任何其他窗口之上打开一个浏览器窗口。在本地环境中工作时非常刺耳。有什么办法告诉Selenium或OS(MAC)在后台打开窗口?


如果你是做driver = webdriver.Firefox() 在你的代码,请按照我的答案在这里:stackoverflow.com/a/23898148/1515819
斯特凡Bruckert

@StéphaneBruckertChrome是否有类似的功能?
E.Praneeth '19

stackoverflow.com/a/48775203/1207193是2020年工作的解决方案GoogleChrome Windows
eusoubrasileiro

Answers:


64

有几种方法,但这不是简单的“设置配置值”。除非您购买了一款不适合所有人的无头浏览器,否则它会有点骇人听闻:

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

是否可以在Selenium RC中隐藏浏览器?

您可以“理应”地将一些参数传递到Chrome中,特别是: --no-startup-window

请注意,对于某些浏览器,尤其是IE,如果不集中精力运行它会损害您的测试。

您还可以使用AutoIT进行修改,以在打开窗口后将其隐藏。


8
“ --no-startup-window”现已弃用
Corey Goldberg

2
确实,使用“ --headless”而不是“ --no-startup-window”,我已经确认它可以在Mac和Chrome v80上运行
Loader在

178

如果您将Selenium Web驱动程序与Python一起使用,则可以使用PyVirtualDisplay,它是Xvfb和Xephyr的Python包装器。

PyVirtualDisplay需要Xvfb作为依赖项。在Ubuntu上,首先安装Xvfb:

sudo apt-get install xvfb

然后从Pypi安装PyVirtualDisplay:

pip install pyvirtualdisplay

使用PyVirtualDisplay以无头模式使用Python中的示例Selenium脚本:

    #!/usr/bin/env python

    from pyvirtualdisplay import Display
    from selenium import webdriver

    display = Display(visible=0, size=(800, 600))
    display.start()

    # now Firefox will run in a virtual display. 
    # you will not see the browser.
    browser = webdriver.Firefox()
    browser.get('http://www.google.com')
    print browser.title
    browser.quit()

    display.stop()

编辑 最初的答案发布于2014年,现在我们正处于2018年的风口浪尖。Chrome现在具有完全无头的版本,从而无需使用任何第三方库来隐藏UI窗口。示例代码如下:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options

    CHROME_PATH = '/usr/bin/google-chrome'
    CHROMEDRIVER_PATH = '/usr/bin/chromedriver'
    WINDOW_SIZE = "1920,1080"

    chrome_options = Options()  
    chrome_options.add_argument("--headless")  
    chrome_options.add_argument("--window-size=%s" % WINDOW_SIZE)
    chrome_options.binary_location = CHROME_PATH

    driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH,
                              chrome_options=chrome_options
                             )  
    driver.get("https://www.google.com")
    driver.get_screenshot_as_file("capture.png")
    driver.close()

一个美丽,干净的解决方案。感谢那。奇迹般有效。当之无愧的+1
Eldamir 2014年

9
Mac OSX是否可用?
vanguard69

如果您使用的是Ubuntu,并且您的测试套件使用Python
那就太好了


1
chrome_options的使用已被弃用,现在只是选项
Mojimi

40

Chrome 57具有传递--headless标志的选项,该标志使窗口不可见。

该标志与--no-startup-window不同,因为最后一个不启动窗口。如该页面所述,它用于托管后台应用程序。

将标志传递给Selenium Webdriver(ChromeDriver)的Java代码:

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver chromeDriver = new ChromeDriver(options);

您知道是否可以用VBA语言做同样的事情?
马丁

@马丁不知你是否已经问题已修复或没有,但快速搜索后,我发现那些:github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/...这是否帮你?
Marlies

19

要在没有任何浏览器的情况下运行,可以以无头模式运行它。

我向您展示了一个适用于我的Python示例

from selenium import webdriver


options = webdriver.ChromeOptions()
options.add_argument("headless")
self.driver = webdriver.Chrome(executable_path='/Users/${userName}/Drivers/chromedriver', chrome_options=options)

我还将在Google官方网站https://developers.google.com/web/updates/2017/04/headless-chrome中为您添加更多有关此信息的信息


最简单的答案!
MarcioPorto

截至2020
Jonny Boy

15

从Chrome 57开始,您有了无用的论点:

var options = new ChromeOptions();
options.AddArguments("headless");
using (IWebDriver driver = new ChromeDriver(options))
{
    // the rest of your test
}

Chrome的无头模式比UI版本的性能高30.97%。其他无头驱动程序PhantomJS的性能比Chrome的无头模式好34.92%。

PhantomJSDriver

using (IWebDriver driver = new PhantomJSDriver())
{
     // the rest of your test
}

Mozilla Firefox的无头模式性能比UI版本好3.68%。令人失望的是,Chrome的无头模式比UI模式节省了30%以上的时间。其他无头驱动程序PhantomJS的性能比Chrome的无头模式好34.92%。令我惊讶的是,Edge浏览器击败了所有这些。

var options = new FirefoxOptions();
options.AddArguments("--headless");
{
    // the rest of your test
}

可从Firefox 57+开始使用

Mozilla Firefox的无头模式性能比UI版本好3.68%。令人失望的是,Chrome的无头模式比UI模式节省了30%以上的时间。其他无头驱动程序PhantomJS的性能比Chrome的无头模式好34.92%。令我惊讶的是,Edge浏览器击败了所有这些。

注意:PhantomJS不再维护!


8

我建议使用Phantom Js获取更多信息,您需要访问Phantom官方网站

据我所知,PhantomJS仅适用于Firefox ..

下载PhantomJs.exe之后,您需要导入到您的项目中,如下面的图片所示,Phantomjs位于常用 >> >> phantomjs.exe 在此处输入图片说明

现在,您在Selenium代码中所需要做的就是更改行

browser = webdriver.Firefox()

import os
path2phantom = os.getcwd() + "\common\Library\phantomjs.exe"
browser = webdriver.PhantomJS(path2phantom)

phantomjs的路径可能不同...随您的喜好更改:)

就是这样,它对我有用。肯定他会为您工作的,干杯


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能无效
slfan

7

在Windows上,您可以使用win32gui:

import win32gui
import win32con
import subprocess

class HideFox:
    def __init__(self, exe='firefox.exe'):
        self.exe = exe
        self.get_hwnd()


    def get_hwnd(self):
      win_name = get_win_name(self.exe)
      self.hwnd = win32gui.FindWindow(0,win_name)


    def hide(self):
        win32gui.ShowWindow(self.hwnd, win32con.SW_MINIMIZE)
        win32gui.ShowWindow(self.hwnd, win32con.SW_HIDE)

    def show(self):
        win32gui.ShowWindow(self.hwnd, win32con.SW_SHOW)
        win32gui.ShowWindow(self.hwnd, win32con.SW_MAXIMIZE)

def get_win_name(exe):
    '''simple function that gets the window name of the process with the given name'''
    info = subprocess.STARTUPINFO()
    info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    raw=subprocess.check_output('tasklist /v /fo csv', startupinfo=info).split('\n')[1:-1]
    for proc in raw:
        try:
            proc=eval('['+proc+']')
            if proc[0]==exe:
                return proc[8]             
        except:
            pass
    raise ValueError('Could not find a process with name '+exe)

例:

hider=HideFox('firefox.exe')  #can be anything, eq: phantomjs.exe, notepad.exe ...
#To hide the window
hider.hide()
#To show again
hider.show()

但是,此解决方案存在一个问题-使用send_keys方法可使窗口显示出来。您可以使用不显示窗口的javascript处理它:

def send_keys_without_opening_window(id_of_the_element, keys)
    YourWebdriver.execute_script("document.getElementById('" +id_of_the_element+"').value = '"+keys+"';")

5

我将此代码用于Windows中的Firefox并得到了答案:(参考此处

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

Options = Options()
Options.headless = True

Driver = webdriver.Firefox(options=Options, executable_path='geckodriver.exe')
Driver.get(...)
...

但是我不对其他浏览器进行测试。


问题已经回答,作者已经批准了答案。
Sariq Shaikh

4
我为其他会看到此帖子的人回答
NaabNuts

1
谢谢你给我们Firefox的另类
TimDC

欢迎您。如果您对Selenium和Django有任何疑问,我会回答。
NaabNuts

也适用于Chrome!
海森堡

3

它可能是选项。这是相同的Java代码。

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setHeadless(true);
        WebDriver driver = new ChromeDriver(chromeOptions);

1

这是一个简单的NodeJS解决方案,可在新版本的Selenium 4.x(可能也是3.x)中使用。

铬:

const { Builder } = require('selenium-webdriver')
const chrome = require('selenium-webdriver/chrome');

let driver = await new Builder().forBrowser('chrome').setChromeOptions(new chrome.Options().headless()).build()

await driver.get('https://example.com')

Firefox:

const { Builder } = require('selenium-webdriver')
const firefox = require('selenium-webdriver/firefox');

let driver = await new Builder().forBrowser('firefox').setFirefoxOptions(new firefox.Options().headless()).build()

await driver.get('https://example.com')

整个过程只是在后台运行。正是我们想要的。


1

如果您使用的是chrome驱动程序,则可以使用以下非常简单的代码:(对我有用)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome('chromedriver2_win32/chromedriver.exe', options=chrome_options)
driver.get('https://www.anywebsite.com')


0

这是一个对我有用的.net解决方案:

在此处下载PhantomJs http://phantomjs.org/download.html

从下载的bin文件夹中复制.exe,并将其粘贴到Visual Studio项目的bin debug / release文件夹中。

使用添加

using OpenQA.Selenium.PhantomJS;

在您的代码中打开驱动程序,如下所示:

PhantomJSDriver driver = new PhantomJSDriver();
using (driver)
{
   driver.Navigate().GoToUrl("http://testing-ground.scraping.pro/login");
   //your code here 
}

0

如果您使用的是Ubuntu(Gnome),一种简单的解决方法是安装Gnome扩展程序auto-move-window:https : //extensions.gnome.org/extension/16/auto-move-windows/

然后将浏览器(例如Chrome)设置到另一个工作空间(例如Workspace 2)。浏览器将在其他工作区中静默运行,不再打扰您。您仍然可以在工作区中使用Chrome,而不会受到任何干扰。


0

嗨,我在使用python和options的chromedriver上遇到了同样的问题。

opt=webdriver.ChromeOptions()
opt.arguments.append("headless")

我希望这个对你有用。


0

实现此目的的一种方法是在无头模式下运行浏览器。这样做的另一个优点是测试执行速度更快。

请找到以下代码,以在chrome浏览器中设置无头模式。

package chrome;
   public class HeadlessTesting {
        public static void main(String[] args) throws IOException{
            System.setProperty("webdriver.chrome.driver",
                    "ChromeDriverPath");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("headless");
            options.addArguments("window-size=1200x600");
            WebDriver driver = new ChromeDriver(options);
            driver.get("https://contentstack.built.io");
            driver.get("https://www.google.co.in/");
            System.out.println("title is: " + driver.getTitle());
            File scrFile = ((TakesScreenshot) driver)
                    .getScreenshotAs(OutputType.FILE);
            FileUtils.copyFile(scrFile, new File("pathTOSaveFile"));
            driver.quit();
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.