Selenium 使用 Chrome,但不是无头的 Chrome

Selenium working with Chrome, but not headless Chrome

我已经使用 Selenium 开发了几个 Python 脚本,首先是 PhantomJS。在转向自动下载时,我切换到(带头的)Firefox(有效),然后 Chrome 使用无头选项,这样我就不会在我面前打开浏览器。

我的第一个脚本访问一个页面和几个 HTML 元素,与无头 Chrome.

完美配合

然而,第二个 仅适用于带头 Chrome。如果我添加 "headless" 选项,它就不再起作用了。当我尝试在无头模式下打印 HTML 以查看为什么它找不到我正在寻找的 HTML 元素时,我所拥有的只是:

<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>

带头Chrome,我打印了一个完整的HTML。 这就是我开始无头 Chrome :

的方式
options = webdriver.ChromeOptions()
options.add_argument("--ignore-certificate-errors") 
options.add_argument("headless") 
driver = webdriver.Chrome(chrome_options=options)

再次注意,这适用于我的另一个脚本。这里唯一的区别是我需要登录才能访问该页面,但即便如此,它为什么会与 head 一起工作?我的脚本是通过填写表格自动登录的。

Python:3.6.1,Chrome:60.0.3112.78(64 位),Selenium:3.4.3

有什么想法吗? 谢谢。

** 编辑:这是代码的开头**

url = 'https://10.11.227.21/tmui/'
driver.get(url + "login.jsp")

html_source = driver.page_source
print(html_source)

blocStatus = WebDriverWait(driver, TIMEOUT).until(EC.presence_of_element_located((By.ID, "username")))
inputElement = driver.find_element_by_id("username")
inputElement.send_keys('actualLogin')
inputElement = driver.find_element_by_id("passwd")
inputElement.send_keys('actualPassword')
inputElement.submit()

Headless chrome 在同一台机器上可能比 headed 更快,尝试在定位密码元素之前添加一些等待时间。

我和你有同样的经历,用xvfb和pyvirtualdisplay解决了

我使用 chromedrive=v2.3.1,chrome-browser=v60 和 Selenium=3.4.3

在 Headless chrome 中,一些脚本似乎没有按预期工作。

请参考vpassapera在https://gist.github.com/addyosmani/5336747的评论。

不如试试下面的方法,

from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))
display.start()

# Do Not use headless chrome option
# options.add_argument('headless')

url = 'https://10.11.227.21/tmui/'
driver.get(url + "login.jsp")

html_source = driver.page_source
print(html_source)

blocStatus = WebDriverWait(driver,    TIMEOUT).until(EC.presence_of_element_located((By.ID, "username")))
inputElement = driver.find_element_by_id("username")
inputElement.send_keys('actualLogin')
inputElement = driver.find_element_by_id("passwd")
inputElement.send_keys('actualPassword')
inputElement.submit()

display.stop()

xvfb 需要使用 "pyvortualdisplay"

$ sudo apt-get install -y xvfb 

Headless Chrome 不支持不安全的证书,因此,具有不安全证书的网站不会打开,它会空白。您需要添加以下功能:

from selenium import webdriver
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")

capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptSslCerts'] = True 
capabilities['acceptInsecureCerts'] = True

driver = webdriver.Chrome(chrome_options = chrome_options,executable_path='your path',desired_capabilities=capabilities)
driver.get("yourWebsite")

这将完成工作。

我遇到了同样的问题,在 conftest.py 中设置 window 大小解决了这个问题。 我的代码片段:

@pytest.fixture
def chrome_options(chrome_options, pytestconfig):
    if pytestconfig.getoption('headless'):
        chrome_options.add_argument('--headless')
        chrome_options.add_argument("window-size=1920,1080")
    else:
        chrome_options.add_argument("start-maximized");
    return chrome_options

对于某些人来说,如果您删除以下内容,它就会起作用。

driver.fullscreen_window()

参考https://github.com/SeleniumHQ/selenium/issues/4477 添加以下代码

self.chrome_options = webdriver.ChromeOptions()
self.chrome_options.add_argument("--window-size=1920,1080")
self.chrome_options.add_argument("--disable-extensions")
self.chrome_options.add_argument("--proxy-server='direct://'")
self.chrome_options.add_argument("--proxy-bypass-list=*")
self.chrome_options.add_argument("--start-maximized")
self.chrome_options.add_argument('--headless')
self.chrome_options.add_argument('--disable-gpu')
self.chrome_options.add_argument('--disable-dev-shm-usage')
self.chrome_options.add_argument('--no-sandbox')
self.chrome_options.add_argument('--ignore-certificate-errors')
self.browser = webdriver.Chrome(options=self.chrome_options)

对于我的情况,headless 不起作用,因为我在代理后面。显然,Chrome可以使用系统代理,但是headless不使用系统代理。

我只需要提供代理,然后 headless(以及 Chrome)就可以工作了。

options.add_argument('--proxy-server=http://myproxy:port')