Selenium Webdriver เปิดหน้าต่างเบราว์เซอร์ในเบื้องหลังได้ไหม


161

ฉันมีชุดทดสอบซีลีเนียมที่ใช้การทดสอบจำนวนมากและในการทดสอบใหม่แต่ละครั้งมันจะเปิดหน้าต่างเบราว์เซอร์ที่ด้านบนของหน้าต่างอื่น ๆ ที่ฉันเปิดไว้ สั่นสะเทือนมากในขณะที่ทำงานในสภาพแวดล้อมท้องถิ่น มีวิธีใดที่จะบอกซีลีเนียมหรือ OS (MAC) เพื่อเปิดหน้าต่างในพื้นหลัง


หากคุณกำลังทำdriver = webdriver.Firefox() ในรหัสของคุณทำตามคำตอบของฉันที่นี่: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert

@ StéphaneBruckertมีอะไรอย่างนั้นสำหรับ Chrome หรือเปล่า
E.Praneeth

stackoverflow.com/a/48775203/1207193เป็นโซลูชันการทำงาน 2020 GoogleChrome Windows
eusoubrasileiro

คำตอบ:


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
Loaderon

178

หากคุณกำลังใช้เว็บไดรเวอร์ Selenium กับ Python คุณสามารถใช้ PyVirtualDisplay ซึ่งเป็น Python wrapper สำหรับ Xvfb และ Xephyr

PyVirtualDisplay ต้องการ Xvfb เป็นการพึ่งพา บน Ubuntu ให้ติดตั้ง Xvfb ก่อน:

sudo apt-get install xvfb

จากนั้นติดตั้ง PyVirtualDisplay จาก Pypi:

pip install pyvirtualdisplay

ตัวอย่างสคริปต์ Selenium ใน Python ในโหมด headless ด้วย 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()

แก้ไข คำตอบเริ่มต้นถูกโพสต์ในปี 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

9
ใช้ได้กับ Mac OSX หรือไม่
vanguard69

นี่เป็นสิ่งที่ดีถ้าคุณใช้ Ubuntu และชุดทดสอบของคุณอยู่ใน Python
kevzettler


1
การใช้ chrome_options เลิกใช้แล้วตอนนี้เป็นเพียงตัวเลือก
Mojimi

40

Chrome 57 มีตัวเลือกให้ส่ง - ค่าสถานะแบบไม่มีส่วนหัวซึ่งทำให้มองไม่เห็นหน้าต่าง

การตั้งค่าสถานะนี้แตกต่างจาก --no-startup-window เนื่องจากล่าสุดไม่เปิดหน้าต่าง ใช้สำหรับโฮสต์แอปพื้นหลังตามที่หน้านี้ระบุ

โค้ด Java เพื่อส่งแฟล็กไปที่ Selenium webdriver (ChromeDriver):

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

คุณรู้หรือไม่ถ้าเป็นไปได้ที่จะทำเช่นเดียวกันในภาษา VBA?
Martin

@ Martin ผมไม่ทราบว่าปัญหาของคุณได้รับการแก้ไขหรือไม่ แต่หลังจากที่มีการค้นหาอย่างรวดเร็วผมพบว่าผู้ที่: 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

ทำงานได้อย่างราบรื่นมากในเดือนมิถุนายน 2563
จอนนี่บอย

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 นั้นเป็นเรื่องธรรมดา >> Library >> phantomjs.exe ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้สิ่งที่คุณต้องทำภายในรหัสซีลีเนียมของคุณคือการเปลี่ยนบรรทัด

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

ฉันใช้รหัสนี้สำหรับ Firefox ใน Windows และได้รับคำตอบ: (อ้างอิงที่นี่ )

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

ยินดีต้อนรับของคุณหากคุณมีคำถามใด ๆ เกี่ยวกับซีลีเนียมและ Django ฉันจะตอบคุณ
NaabNuts

ทำงานในโครเมี่ยมด้วย!
ไฮเซนเบิร์ก

3

มันอาจจะอยู่ในตัวเลือก นี่คือรหัส java ที่เหมือนกัน

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

1

นี่เป็นโซลูชัน NodeJS ที่ใช้งานง่ายในเวอร์ชั่น 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

หากคุณใช้ไดร์เวอร์โครเมี่ยมคุณสามารถใช้รหัสง่ายๆนี้: (มันใช้งานได้สำหรับฉัน)

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

คัดลอก. exe จากโฟลเดอร์ bin ในการดาวน์โหลดและวางในโฟลเดอร์ debug / release ของโครงการ Visual Studio ของคุณ

เพิ่มสิ่งนี้โดยใช้

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 extension auto-move-window: https://extensions.gnome.org/extension/16/auto-move-windows/

จากนั้นตั้งค่าเบราว์เซอร์ (เช่น Chrome) ไปยังพื้นที่ทำงานอื่น (เช่นพื้นที่ทำงาน 2) เบราว์เซอร์จะทำงานในพื้นที่ทำงานอื่นอย่างเงียบ ๆ และไม่รบกวนคุณอีกต่อไป คุณยังสามารถใช้ Chrome ในพื้นที่ทำงานได้โดยไม่หยุดชะงัก


0

สวัสดีฉันมีปัญหาเดียวกันกับ Chromedriver ของฉันโดยใช้ไพ ธ อนและ options.add_argument ("หัวขาด") ไม่ได้ผลสำหรับฉัน แต่แล้วฉันก็รู้วิธีแก้ไขมันดังนั้นฉันจึงนำมันมาในโค้ดด้านล่าง

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

ฉันหวังว่ามันจะเหมาะกับคุณ


0

วิธีหนึ่งในการบรรลุเป้าหมายนี้คือการใช้เบราว์เซอร์ในโหมดหัวขาด ข้อดีอีกประการของการทดสอบนี้คือการดำเนินการได้เร็วขึ้น

โปรดค้นหารหัสด้านล่างเพื่อตั้งโหมดหัวขาดในเบราว์เซอร์โครม

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.