Kan Selenium WebDriver browservensters stil op de achtergrond openen?

Ik heb een Selenium-testsuite die veel tests uitvoert en bij elke nieuwe test wordt een browservenster geopend naast alle andere vensters die ik open heb. Zeer schokkend tijdens het werken in een lokale omgeving. Is er een manier om Selenium of het besturingssysteem (Mac) te vertellen om de vensters op de achtergrond te openen?


Antwoord 1, autoriteit 100%

Als u Selenium-webstuurprogramma met Python gebruikt, kunt u PyVirtualDisplay gebruiken, een Python-wrapper voor Xvfb en Xephyr.

PyVirtualDisplay heeft Xvfb nodig als afhankelijkheid. Installeer op Ubuntueerst Xvfb:

sudo apt-get install xvfb

Installeer vervolgens PyVirtualDisplay van PyPI:

pip install pyvirtualdisplay

Voorbeeld van Selenium-script in Python in een headless-modus met PyVirtualDisplay:

   #!/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()

BEWERKEN

Het eerste antwoord werd in 2014 gepost en nu staan ​​we aan de vooravond van 2018. Net als al het andere zijn browsers ook vooruitgegaan. Chrome heeft nu een volledig headless-versie, waardoor het niet meer nodig is om bibliotheken van derden te gebruiken om het UI-venster te verbergen. Voorbeeldcode is als volgt:

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

Antwoord 2, autoriteit 35%

Er zijn een paar manieren, maar het is geen simpele “stel een configuratiewaarde in”. Tenzij je investeert in een headless browser, die niet aan ieders eisen voldoet, is het een beetje een hack:

Hoe verberg ik het Firefox-venster (Selenium WebDriver)?

en

Is het mogelijk om de browser in Selenium RC?

U kunt ‘zogenaamd’ bepaalde parameters doorgeven aan Chrome, met name: --no-startup-window

Houd er rekening mee dat het voor sommige browsers, met name Internet Explorer, nadelig is voor uw tests als deze niet in focus worden uitgevoerd.

Je kunt ook een beetje hacken met AutoIt, om het venster te verbergen zodra het is geopend.


Antwoord 3, autoriteit 22%

Chrome 57 heeft een optie om de –headless vlag door te geven, waardoor het venster onzichtbaar wordt.

Deze vlag is anders dan het –no-startup-venster, aangezien de laatste geen venster start. Het wordt gebruikt voor het hosten van achtergrondapps, zoals deze paginazegt.

Java-code om de vlag door te geven aan Selenium-webdriver (ChromeDriver):

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

Antwoord 4, autoriteit 14%

Als u zonder browser wilt werken, kunt u het in de modus headlessuitvoeren.

Ik laat je een voorbeeld in Python zien dat op dit moment voor mij werkt

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

Ik voeg hier ook wat meer informatie over toe op de officiële Google-website https://developers.google.com/web/updates/2017/04/headless-chrome


Antwoord 5, autoriteit 9%

Ik gebruikte deze code voor Firefox in Windows en kreeg antwoord (referentie hier):

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

Maar ik heb het niet getest voor andere browsers.


Antwoord 6, autoriteit 8%

Sinds Chrome 57 heb je het hoofdloze argument:

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

De headless-modus van Chrome presteert 30,97% beter dan de UI-versie. De andere headless driver PhantomJS levert 34,92% beter dan de headless-modus van Chrome.

PhantomJSDriver

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

De headless-modus van Mozilla Firefox presteert 3,68% beter dan de UI-versie. Dit is een teleurstelling, aangezien de headless-modus van Chrome > 30% betere tijd dan de gebruikersinterface. De andere headless driver PhantomJS levert 34,92% beter dan de headless-modus van Chrome. Verrassend genoeg voor mij verslaat de Edge-browser ze allemaal.

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

Dit is beschikbaar vanaf Firefox 57+

De headless-modus van Mozilla Firefox presteert 3,68% beter dan de UI-versie. Dit is een teleurstelling, aangezien de headless-modus van Chrome > 30% betere tijd dan de gebruikersinterface. De andere headless driver PhantomJS levert 34,92% beter dan de headless-modus van Chrome. Verrassend genoeg voor mij verslaat de Edge-browser ze allemaal.

Opmerking: PhantomJS wordt niet meer onderhouden!


Antwoord 7, autoriteit 4%

Op Windows kun je win32gui gebruiken:

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)

Voorbeeld:

hider = HideFox('firefox.exe') # Can be anything, e.q., phantomjs.exe, notepad.exe, etc.
# To hide the window
hider.hide()
# To show again
hider.show()

Er is echter één probleem met deze oplossing: als u de methode send_keys gebruikt, wordt het venster weergegeven. Je kunt het oplossen door JavaScript te gebruiken dat geen venster toont:

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

Antwoord 8, autoriteit 4%

Ik raad aan om PhantomJSte gebruiken. Voor meer informatie kunt u de Officiële Phantom-websitebezoeken.

Voor zover ik weet werkt PhantomJS alleen met Firefox…

Na het downloaden van PhantomJs.exe moet je het in je project importeren, zoals je kunt zien in de onderstaande afbeelding PhantomJS.

Ik heb de mijne erin geplaatst: commonBibliotheekphantomjs.exe

Nu hoef je alleen nog maar de regel in je Selenium-code te veranderen

browser = webdriver.Firefox()

Naar zoiets

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

Het pad naar PhantomJS kan anders zijn… verander wat je wilt 🙂

Deze hack werkte voor mij, en ik ben er vrij zeker van dat hij ook voor jou zal werken;)


Antwoord 9

Het kan in opties staan. Hier is de identieke Java-code.

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

Antwoord 10

Dit is een eenvoudige Node.js-oplossing die werkt in de nieuwe versie 4 .x (misschien ook 3.x) van selenium.

Chroom

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

Het hele ding draait gewoon op de achtergrond. Het is precies wat we willen.


Antwoord 11

Als u de Google Chrome-driver gebruikt, kunt u deze zeer eenvoudige code gebruiken (bij mij werkte het):

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

Antwoord 12

Op *nix kun je ook een headless X Window-server zoals Xvfb gebruiken en de omgevingsvariabele DISPLAYernaar verwijzen:

Fake X-server om te testen?


Antwoord 13

Een manier om dit te bereiken is door de browser in de headless-modus te laten draaien. Een ander voordeel hiervan is dat tests sneller worden uitgevoerd.

Vind de onderstaande code om de headless-modus in de Chrome-browser in te stellen.

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

Antwoord 14

Als u Ubuntu (Gnome) gebruikt, is een eenvoudige oplossing om de Gnome-extensie auto-move-window te installeren: https://extensions.gnome.org/extension/16/auto-move-windows/

Stel vervolgens de browser (bijv. Chrome) in op een andere werkruimte (bijv. Werkruimte 2). De browser zal stil in een andere werkruimte draaien en u niet meer lastig vallen. U kunt Chrome nog steeds zonder onderbrekingen in uw werkruimte gebruiken.


Antwoord 15

Hier is een .NET-oplossing die voor mij werkte:

Download PhantomJS op http://phantomjs.org/download.html.

Kopieer het .exe-bestand uit de bin-map in de downloadmap en plak het in de bin debug/release-map van uw Visual Studio-project.

Voeg dit toe met

using OpenQA.Selenium.PhantomJS;

Open in uw code het stuurprogramma als volgt:

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

Antwoord 16

Ik had hetzelfde probleem met mijn chromedriver met Python en options.add_argument(“headless”)werkte niet voor mij, maar toen realiseerde ik me hoe ik het kon repareren, dus ik bracht het in de code hieronder:

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

Antwoord 17

Voeg gewoon een eenvoudig “headless” optieargument toe.

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome("PATH_TO_DRIVER", options=options)

Antwoord 18

Gebruik het …

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, chrome_options=options)

Other episodes