Selenium Webdriverはバックグラウンドでブラウザーウィンドウをサイレントで開くことができますか?


160

多くのテストを実行するセレンテストスイートがあり、新しいテストを実行するたびに、開いている他のウィンドウの上にブラウザウィンドウが開かれます。ローカル環境での作業中は非常に不快です。ウィンドウをバックグラウンドで開くようにセレンまたはOS(MAC)に指示する方法はありますか?


あなたがやっている場合はdriver = webdriver.Firefox() 、あなたのコードでは、ここに私の答えは次のとおりstackoverflow.com/a/23898148/1515819を
ステファンBruckert

@StéphaneBruckertChromeにそのようなものはありますか?
E.Praneeth

回答:


64

いくつかの方法がありますが、それは単純な「構成値の設定」ではありません。すべての人の要件に合わないヘッドレスブラウザに投資しない限り、これは少しハックです。

Firefoxウィンドウ(Selenium WebDriver)を非表示にする方法は?

そして

Selenium RCでブラウザーを非表示にすることはできますか?

「想定通り」に、いくつかのパラメータをChromeに渡すことができます。具体的には次のとおりです。 --no-startup-window

一部のブラウザ、特にIEの場合、テストをフォーカスしないとテストに悪影響を与えることに注意してください。

AutoITで少しハックして、ウィンドウを開いたら非表示にすることもできます。


8
"--no-startup-window"が非推奨になりました
Corey Goldberg

2
実際、「-no-startup-window」の代わりに「--headless」を使用します。MacおよびChrome v80で動作することを確認しました
Loaderon

178

PythonでSelenium Webドライバーを使用している場合は、XvfbおよびXephyrのPythonラッパーであるPyVirtualDisplayを使用できます。

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に
値する

9
Mac OSXで利用できますか?
vanguard69 2015

Ubuntuを使用していて、テストスイートがPythonである場合、これはすばらしい
kevzettler


1
chrome_optionsの使用は廃止され、現在は単なるオプションになっています
Mojimi

38

Chrome 57には、ウィンドウを非表示にする--headlessフラグを渡すオプションがあります。

最後のフラグはウィンドウを起動しないため、このフラグは--no-startup-windowとは異なります。このページにあるように、バックグラウンドアプリをホストするために使用されます

フラグをSelenium Webdriver(ChromeDriver)に渡すJavaコード:

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

VBA言語で同じことができるかどうか知っていますか?
マーティン

:私はあなたの問題が既に修正されたかどうか知らないが、クイック検索の後、私はそれらの見つけ@Martin github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/...はこれを行います助けます?
Marlies

19

ブラウザなしで実行する場合は、ヘッドレスモードで実行できます。

今私のために働いているPythonの1つの例を示します

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 Official Websiteにアクセスするために必要な詳細情報を入手することをお勧めします

私の知る限り、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()

ただし、このソリューションには1つの問題があります。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

クロムでも動作します!
ハイゼンベルク

2

オプションの場合があります。これは、同じJavaコードです。

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

1

これは、Seleniumの新しいバージョン4.x(おそらく3.x)で機能する単純なNodeJSソリューションです。

クロム:

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)を使用している場合、1つの簡単な回避策は、Gnome拡張auto-move-windowをインストールすることです:https : //extensions.gnome.org/extension/16/auto-move-windows/

次に、ブラウザ(Chromeなど)を別のワークスペース(Workspace 2など)に設定します。ブラウザは他のワークスペースで静かに実行され、もう邪魔されることはありません。作業を中断することなく、引き続きChromeをワークスペースで使用できます。


0

こんにちはpythonとoptions.add_argument( "headless")を使用しているchromedriverで同じ問題がありましたが、うまくいきませんでしたが、それを修正する方法を理解したので、以下のコードに入れました

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

私はそれがあなたのために働くことを望みます。


0

これを実現する1つの方法は、ブラウザをヘッドレスモードで実行することです。これのもう1つの利点は、テストがより速く実行されることです。

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();
        }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.