Selenium WebSearch có thể mở các cửa sổ trình duyệt một cách âm thầm trong nền không?


160

Tôi có một bộ kiểm tra selen chạy nhiều thử nghiệm và trên mỗi thử nghiệm mới, nó sẽ mở một cửa sổ trình duyệt trên bất kỳ cửa sổ nào khác mà tôi đã mở. Rất chói tai khi làm việc trong môi trường địa phương. Bất kỳ cách nào để nói với selen hoặc HĐH (MAC) để mở các cửa sổ trong nền?


Nếu bạn đang thực hiện driver = webdriver.Firefox() mã của mình, hãy làm theo câu trả lời của tôi tại đây: stackoverflow.com/a/23898148/1515819
Stéphane Bruckert

@ StéphaneBruckert Có điều gì tương tự cho Chrome không?
E.Praneeth

stackoverflow.com/a/48775203/1207193 là giải pháp hoạt động 2020 GoogleChrom Windows
eusoubrasileiro

Câu trả lời:


64

Có một vài cách, nhưng nó không đơn giản là "đặt giá trị cấu hình". Trừ khi bạn đầu tư vào một trình duyệt không đầu, không phù hợp với yêu cầu của mọi người, đó là một chút hack:

Làm cách nào để ẩn cửa sổ Firefox (Selenium WebDriver)?

Có thể ẩn trình duyệt trong Selenium RC không?

Bạn có thể 'được cho là', chuyển một số thông số vào Chrome, cụ thể: --no-startup-window

Lưu ý rằng đối với một số trình duyệt, đặc biệt là IE, việc kiểm tra của bạn sẽ không ảnh hưởng đến việc chạy thử.

Bạn cũng có thể hack khoảng một chút với AutoIT, để ẩn cửa sổ khi nó được mở.


8
"- no-startup-window" hiện không được chấp nhận
Corey Goldberg

2
thực sự, sử dụng "- không đầu" thay vì "- không khởi động-cửa sổ", tôi đã xác nhận nó hoạt động trên Mac và Chrome v80
Loaderon

178

Nếu bạn đang sử dụng trình điều khiển web Selenium với Python, bạn có thể sử dụng PyVirtualDisplay, trình bao bọc Python cho Xvfb và Xephyr.

PyVirtualDisplay cần Xvfb làm phụ thuộc. Trên Ubuntu, đầu tiên cài đặt Xvfb:

sudo apt-get install xvfb

sau đó cài đặt PyVirtualDisplay từ Pypi:

pip install pyvirtualdisplay

Tập lệnh Selenium mẫu trong Python ở chế độ không đầu với 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()

EDIT Câu trả lời ban đầu đã được đăng vào năm 2014 và bây giờ chúng tôi đang ở đỉnh cao của năm 2018. Giống như mọi thứ khác, các trình duyệt cũng đã tiến bộ. Chrome hiện đã có phiên bản hoàn toàn không đầu, giúp loại bỏ nhu cầu sử dụng bất kỳ thư viện bên thứ ba nào để ẩn cửa sổ UI. Mã mẫu như sau:

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

Một giải pháp đẹp, sạch. Cảm ơn vì điều đó. Hoạt động như một lá bùa. Xứng đáng hơn +1
Eldamir

9
Nó có sẵn cho Mac OSX không?
tiên phong69

Điều này thật tuyệt nếu bạn đang sử dụng Ubuntu và bộ thử nghiệm của bạn bằng Python
kevzettler


1
việc sử dụng chrome_options không được chấp nhận, bây giờ chỉ là các tùy chọn
Mojimi

38

Chrome 57 có một tùy chọn để vượt qua cờ không đầu, làm cho cửa sổ không nhìn thấy được.

Cờ này khác với --no-startup-window vì cái cuối cùng không khởi chạy một cửa sổ. Nó được sử dụng để lưu trữ các ứng dụng nền, như trang này nói.

Mã Java để chuyển cờ cho Selenium webdo (ChromeDriver):

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

Bạn có biết nếu có thể làm điều tương tự trong ngôn ngữ VBA không?
Martin

@ Martin Tôi không biết liệu vấn đề của bạn đã được cố định hay không, nhưng sau khi tìm kiếm nhanh chóng tôi thấy những: github.com/prajaktamoghe/selenium-vba/issues/33 stackoverflow.com/questions/45121955/... Liệu này giúp bạn?
Marlies

19

Để chạy mà không cần bất kỳ trình duyệt nào, bạn có thể chạy nó ở chế độ không đầu .

Tôi chỉ cho bạn một ví dụ trong Python hiện đang làm việc cho tôi

from selenium import webdriver


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

Tôi cũng thêm cho bạn thêm một chút thông tin về điều này trong trang web chính thức của Google https://developers.google.com/web/updates/2017/04/headless-chrom


Câu trả lời đơn giản nhất trong tất cả!
MarcioPorto

làm việc rất suôn sẻ kể từ tháng 6 năm 2020
Jonny Boy

15

Kể từ Chrome 57, bạn có đối số không đầu:

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

Chế độ không đầu của Chrome thực hiện tốt hơn 30,97% so với phiên bản UI. Trình điều khiển không đầu khác PhantomJS cung cấp 34,92% tốt hơn chế độ không đầu của Chrome.

PhantomJSDriver

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

Chế độ không đầu của Mozilla Firefox hoạt động tốt hơn 3,68% so với phiên bản UI. Đây là một sự thất vọng vì chế độ không đầu của Chrome đạt được thời gian tốt hơn> 30% so với giao diện người dùng. Trình điều khiển không đầu khác PhantomJS cung cấp 34,92% tốt hơn chế độ không đầu của Chrome. Đáng ngạc nhiên đối với tôi, trình duyệt Edge đánh bại tất cả chúng.

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

Điều này có sẵn từ Firefox 57+

Chế độ không đầu của Mozilla Firefox hoạt động tốt hơn 3,68% so với phiên bản UI. Đây là một sự thất vọng vì chế độ không đầu của Chrome đạt được thời gian tốt hơn> 30% so với giao diện người dùng. Trình điều khiển không đầu khác PhantomJS cung cấp 34,92% tốt hơn chế độ không đầu của Chrome. Đáng ngạc nhiên đối với tôi, trình duyệt Edge đánh bại tất cả chúng.

Lưu ý: PhantomJS không được duy trì nữa!


8

Tôi khuyên bạn nên sử dụng Phantom Js để biết thêm thông tin bạn cần truy cập Trang web chính thức của Phantom

Theo như tôi biết thì PhantomJS chỉ hoạt động với Firefox ..

Sau khi tải xuống PhantomJs.exe, bạn cần nhập vào dự án của mình như bạn có thể thấy trong hình bên dưới Phantomjs nằm trong chung >> Thư viện >> ph Phantomjs.exe nhập mô tả hình ảnh ở đây

Bây giờ tất cả những gì bạn có trong mã Selenium của mình là thay đổi dòng

browser = webdriver.Firefox()

Để một cái gì đó như

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

Đường dẫn đến ph Phantomjs có thể khác ... thay đổi tùy thích :)

Đó là nó, nó làm việc cho tôi. và chắc chắn anh ấy sẽ làm việc cho bạn, Chúc mừng


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi
slfan

7

Trên cửa sổ, bạn có thể sử dụng 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)

Thí dụ:

hider=HideFox('firefox.exe')  #can be anything, eq: phantomjs.exe, notepad.exe ...
#To hide the window
hider.hide()
#To show again
hider.show()

Tuy nhiên, có một vấn đề với giải pháp này - sử dụng phương thức send_keys làm cho cửa sổ hiển thị. Bạn có thể đối phó với nó bằng cách sử dụng javascript không hiển thị cửa sổ:

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

5

Tôi đã sử dụng mã này cho Firefox trong Windows và nhận được câu trả lời: (tham khảo tại đây )

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

Nhưng tôi không kiểm tra nó cho các trình duyệt khác.


Câu hỏi đã được trả lời và tác giả đã phê duyệt câu trả lời.
Sariq Shaikh

4
Tôi đã trả lời cho những người khác sẽ thấy bài đăng này
NaabNuts

1
Cảm ơn bạn đã cho chúng tôi thay thế Firefox
TimDC

Chào mừng bạn. Nếu bạn có bất kỳ câu hỏi nào về Selenium và Django tôi sẽ trả lời bạn.
NaabNuts

Hoạt động trong chrome quá!
Heisenberg

2

Nó có thể là trong các tùy chọn. Đây là mã java giống hệt nhau.

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

1

Đây là một giải pháp NodeJS đơn giản hoạt động trong phiên bản mới 4.x (cũng có thể là 3.x) của Selenium.

Trình duyệt Chrome:

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

Toàn bộ điều chỉ chạy trong nền. Chính xác những gì chúng ta muốn.


1

Nếu bạn đang sử dụng trình điều khiển chrome, bạn có thể sử dụng mã rất đơn giản này: (nó hoạt động với tôi)

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

Đây là một giải pháp .net hoạt động với tôi:

Tải xuống PhantomJ tại đây http:

Sao chép .exe từ thư mục bin trong phần tải xuống và dán vào thư mục gỡ lỗi / giải phóng bin của dự án Visual Studio của bạn.

Thêm điều này bằng cách sử dụng

using OpenQA.Selenium.PhantomJS;

Trong mã của bạn mở trình điều khiển như thế này:

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

0

Nếu bạn đang sử dụng Ubuntu (Gnome), một cách giải quyết đơn giản là cài đặt cửa sổ tự động mở rộng Gnome: https://extensions.gnome.org/extension/16/auto-move-windows/

Sau đó, đặt trình duyệt (ví dụ: Chrome) sang một không gian làm việc khác (ví dụ: Không gian làm việc 2). Trình duyệt sẽ âm thầm chạy trong không gian làm việc khác và không làm phiền bạn nữa. Bạn vẫn có thể sử dụng Chrome trong không gian làm việc của mình mà không bị gián đoạn.


0

xin chào, tôi đã gặp vấn đề tương tự với chromedriver của mình khi sử dụng python và Options.add_argument ("không đầu") không hoạt động với tôi nhưng sau đó tôi nhận ra cách khắc phục nên tôi mang mã theo bên dưới

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

Tôi hy vọng nó làm việc cho bạn.


0

Một cách để đạt được điều này là chạy trình duyệt ở chế độ không đầu. Một ưu điểm khác của việc này là các bài kiểm tra được thực hiện nhanh hơn.

Vui lòng tìm mã bên dưới để đặt chế độ không đầu trong trình duyệt 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();
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.