web-dev-qa-db-ja.com

Selenium Webdriverはバックグラウンドで静かにブラウザウィンドウを開くことができますか?

私は多くのテストを実行するSeleniumテストスイートを持っています、そして新しいテストのたびにそれは私が開いている他のどのウィンドウの上にもブラウザウィンドウを開きます。地元の環境で働いている間非常に不快です。 SeleniumまたはOS(MAC)にバックグラウンドでウィンドウを開くように指示する方法はありますか?

122
kevzettler

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

Firefoxウィンドウ(Selenium WebDriver)を隠すには?

そして

Selenium RCではブラウザを隠すことはできますか?

あなたは「おそらく」、いくつかのパラメータをChromeに渡すことができます。具体的には:--no-startup-window

一部のブラウザ、特にIEでは、フォーカスが合っていないとテストが損なわれることに注意してください。

AutoITで少しハックして、開いたウィンドウを隠すこともできます。

53
Arran

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()

EDIT最初の答えは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()
141
Amistad

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

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

フラグをSelenium webdriver(ChromeDriver)に渡すためのJavaコード:

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

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はもうメンテナンスされていません!

13
Anton Angelov

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

私は今、私にとってうまくいっている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

私があなたが訪問する必要があるより多くの情報のためにファントムJsを使うことを勧めます ファントムの公式ウェブサイト

私の知る限りではPhantomJSはFirefoxでしか動作しません。

phantomJs.exeをダウンロードした後、下の画像にあるようにプロジェクトにインポートする必要があります。Phantomjsは中common>>ライブラリ>>phantomjs.exeenter image description here

Seleniumコード内で行を変更するだけです。

browser = webdriver.Firefox()

好きなものに

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

Phantomjsへのパスは異なるかもしれません...あなたが好きなように変更してください:)

それはそれだ、それは私のために働いた。そして間違いなく彼はあなたのために働きます、乾杯

8
Ayoub

Windowsでは、win32guiを使用できます。

import win32gui
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, 6)
        win32gui.ShowWindow(self.hwnd, 0)

    def show(self):
        win32gui.ShowWindow(self.hwnd, 5)
        win32gui.ShowWindow(self.hwnd, 3)

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+"';")
4
Piotr Dabkowski

それは選択にあるかもしれません。これは同じJavaコードです。

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

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

次にブラウザ(例:Chrome)を別のワークスペース(例:Workspace 2)に設定します。ブラウザは他のワークスペースで黙って実行され、もう気にする必要はありません。作業スペースでChromeを中断することなく使用できます。

0
Bob

* nixでは、XvfbのようなヘッドレスXサーバーを実行してDISPLAY変数でそれを指すこともできます。

テスト用の偽のXサーバー?

0
user2645074

これは私のために働いた。NETソリューションです。

ここでPhantomJをダウンロードしてください 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
Jack Fairfield