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: common→ Bibliotheek→ phantomjs.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:
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)