Python Selenium Headless:在无头模式下打开Chrome浏览器
本教程解释了我们如何用Python中的Selenium运行浏览器的无头模式。
在Python中使用Selenium以无头模式运行Chrome浏览器
谈到无头浏览器,你也可以称它们为真正的浏览器,但它们是在后台运行的;你将无法在任何地方看到它们,但仍然在后台运行。
会有几个场景,你需要这种无头浏览器。
因为当你在正常的浏览器中工作时,你会看到用户界面出现,并在本地系统上工作时操作其他应用程序。所以,你将无法执行任何其他操作,导致额外的操作在你面前运行。
假设你在无头模式下运行你的脚本。这样你就可以继续你的工作,有几个浏览器可以使用无头模式,如phantomJS
,HtmlUnit
,等等,请看这里。
我们也有Chrome和Firefox的无头选项。为了看看如何在Chrome的Selenium中以无头模式运行测试,我们首先需要创建一个Python文件。
我们将通过导入一些必要的类和模块来跳入代码。
import time
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
我们刚刚注意到,webdriver.Chrom()
有不同的选项,你可以在下面看到。
我们使用了一个service
参数,它应该启动Chrome浏览器会话。ChromeDriverManager()
将帮助我们下载驱动程序并设置path
。
我们将使用get()
方法,并传递给它一个URL
,在这里我们将尝试找到搜索框,然后我们将使用一些随机的文本,我们希望通过使用find_element()
来搜索。
DV=webdriver.Chrome(service=Service(ChromeDriverManager().install()))
DV.get('http://www.google.com')
DV.find_element(By.NAME,'q').send_keys('Elon Musk')
time.sleep(2)
如果我们运行python脚本,你会发现它不会在无头模式下运行,而是进入搜索框并搜索给定的查询。
现在我们将使用名为options
的第二个参数,我们需要提供options
。我们有一个来自不同软件包的options
类;你可以在Opera、Chrome和Firefox上使用它。
由于我们使用的是Chrome,我们将使用来自Chrome.options
的Options()
类。所以我们将创建一个名为OP
的对象来调用Options()
类。
在无头模式下,有两种options
或不同的方式来运行你的测试。首先,你必须使用add_argument()
方法并在其内部传递--headless
。
为了达到这个效果,我们必须把OP
传给options
参数。
import time
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
OP=Options()
OP.add_argument('--headless')
DV=webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=OP)
DV.get('http://www.google.com')
DV.find_element(By.NAME,'q').send_keys('Elon Musk')
当你完成后,你会看到测试将以无头模式运行,你将无法看到任何东西。
为了检查是否被搜索到,我们将使用get_screenshot_as_file()
方法在无头模式下捕获屏幕截图。它将在无头模式下打开一个浏览器,并立即抓取屏幕截图。
DV.get_screenshot_as_file(os.getcwd()+'/screenshot.png')
现在我们得到了一个后台发生的截图t。
假设你是一个一般会犯拼写错误的人,有时很难记住OP.add_argument('--headless')
。那么,我们还有一个选项:名为headless
的类型属性。
默认情况下,它被设置为False
,你可以把它改为True
,所以你不需要使用add_argument()
。
import time
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import os
OP=Options()
OP.headless=True
# OP.add_argument('--headless')
DV=webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=OP)
DV.get('http://www.google.com')
# DV.find_element(By.NAME,'q').send_keys('Elon Musk')
DV.find_element(By.NAME,'q').send_keys('mark zuckerberg')
DV.get_screenshot_as_file(os.getcwd()+'/screenshot.png')
重新运行这个脚本后,我们得到了一个截图,显示了后台正在执行的操作。